构建报错:android:attr/fontVariationSettings 资源未找到求助
这个问题我之前帮不少开发者排查过,核心原因就是你同时混用了旧的Android Support库和新的AndroidX库,直接导致了资源属性冲突。
具体来说,fontVariationSettings是AndroidX体系里新增的资源属性,但你的项目还在基于旧的Support库(compileSdkVersion 27、appcompat-v7:27.1.1这类依赖)开发。当你添加了AndroidX版本的Room库和WorkManager后,两个不同体系的库在资源定义上出现了重叠,编译器找不到对应的属性就报错了。
给你两个解决方案,优先推荐第一种:
方案一:彻底迁移到AndroidX(推荐)
AndroidX是谷歌官方主推的替代旧Support库的方案,后续所有新特性都会基于AndroidX维护,能从根源解决这类冲突:
升级编译版本
先把compileSdkVersion和targetSdkVersion升级到至少28(AndroidX的最低要求之一),修改你的app模块gradle文件:android { compileSdkVersion 28 defaultConfig { // 其他配置不变 targetSdkVersion 28 // 其他配置不变 } // 其他配置不变 }开启AndroidX自动转换
在项目根目录的gradle.properties文件里添加以下两行配置,让Android Studio自动处理依赖转换:android.useAndroidX=true android.enableJetifier=true第二行的
jetifier会自动把第三方依赖里的旧Support库引用转换成AndroidX版本,不用你手动修改第三方库。替换所有旧Support库为AndroidX库
把gradle里所有com.android.support开头的依赖,换成对应的AndroidX库,比如:// 替换前的旧Support库 // implementation "com.android.support:support-v4:$support_library_version" // implementation "com.android.support:appcompat-v7:$support_library_version" // implementation "com.android.support:design:$support_library_version" // implementation "com.android.support:recyclerview-v7:$support_library_version" // 替换后的AndroidX库(用稳定版本即可) implementation "androidx.core:core:1.6.0" implementation "androidx.appcompat:appcompat:1.4.1" implementation "com.google.android.material:material:1.5.0" implementation "androidx.recyclerview:recyclerview:1.2.1"统一Room、WorkManager和Lifecycle为AndroidX版本
你现在同时混用了旧的android.arch开头的库和AndroidX的androidx开头的库,要删掉旧的,保留AndroidX版本:// 删除旧的Room依赖 // implementation "android.arch.persistence.room:runtime:$room_version" // annotationProcessor "android.arch.persistence.room:compiler:$room_version" // 改用AndroidX Room稳定版 def room_version = "2.4.2" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" testImplementation "androidx.room:room-testing:$room_version" // 改用AndroidX WorkManager稳定版 def work_version = "2.7.1" implementation "androidx.work:work-runtime:$work_version" androidTestImplementation "androidx.work:work-testing:$work_version" // 改用AndroidX Lifecycle库 def lifecycle_version = "2.4.1" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"另外,Android Studio还有个一键迁移工具:
Refactor > Migrate to AndroidX,它能自动帮你完成大部分依赖替换和代码修改,比手动改更省心。
方案二:移除所有AndroidX库(临时过渡,不推荐)
如果你暂时不想迁移到AndroidX,可以删掉所有androidx开头的依赖,改用旧的Architecture Components库:
- 删掉AndroidX版本的Room依赖;
- 确保WorkManager用的是旧的
android.arch.work稳定版本(比如1.0.1),且所有依赖都没有引入AndroidX内容。
不过这个方案只是临时解决,后续谷歌会停止旧Support库的维护,还是建议尽早迁移到AndroidX。
内容的提问来源于stack exchange,提问作者midnightstar

