这个问题排查了几个小时。在这里提供一下具体的排查思路,希望能给各位老铁一点提示。
问题从天而降
昨天本来打包还好好的。今天在 android 打包的时候,今天突然间有一个奇怪的报错,导致打包失败了:
/Users/PAMPANG/.gradle/caches/transforms-1/files-1.1/appcompat-v7-27.1.1.aar/aeb63fa7e61ad852e8a67f3e8b29c11b/res/values/values.xml:251:5-69: AAPT: error: resource android:attr/fontVariationSettings not found.
/Users/PAMPANG/.gradle/caches/transforms-1/files-1.1/appcompat-v7-27.1.1.aar/aeb63fa7e61ad852e8a67f3e8b29c11b/res/values/values.xml:251:5-69: AAPT: error: resource android:attr/ttcIndex not found.
error: failed linking references.
FAILURE: Build failed with an exception.
开始排查
嗯??什么奇怪的错误??
定睛一看,错误中有关键词:
appcompat-v7-27.1.1.aar
AAPT: error: resource android:attr/fontVariationSettings not found
OK,根据这两个关键词上网冲浪去。
排查第一步:看 issue
我们用的是 react-native,因此先看看 react-native 的 issue 里有没有类似的问题。
搜到了两个相关的 issue:
https://github.com/facebook/react-native/issues/25338
https://github.com/crosswalk-project/cordova-plugin-crosswalk-webview/issues/207
通过这两个链接,又发现了一个 stackOverFlow 的网站:
https://stackoverflow.com/questions/56654226/ionic-cordova-app-stopped-compiling-after-googles-june-17th-firebase-sdk-update
排查第二步:根据现有信息思考总结,重新调整问题
在这里,我得到了有效信息:google 在 20190617 发布了新版本,需要做 XXX 才能适配。我虎躯一震,难道要我更新?!
但再细细一想,不应该啊,那所有的 android 项目不都得挂了?应该是我的包里有了什么错误的依赖导致的。
带着这个问题,我再次搜索信息。
排查第三步:带着新问题,再次搜索
我又重新开始查信息了。这个 issue 中一位小哥的回答给了我很大的提示。他的主要思路是整个 app 的依赖列表输出出来,看看哪个小坏蛋引入了不该有的依赖。
排查第四步:找到方案,开始试行
我在命令行运行 ./gradlew app:dependencies 把整个 app 的依赖列表输出出来,对应着 google 的更新列表,看看到底是哪个小坏蛋引用了最新的依赖。
根据包名搜索了一番,发现是 react-native-device-info 中引用了 gms,而 gms 的版本号是 +,即直接去最新版,所以就拿了最新的版本依赖了。而这个最新的版本,是需要做适配才能启用的,因此就出问题了。
可以看到,在 react-native-device-info@0.24.3 的这一行代码 中,用 + 号引入了 gms。
那么,想要解决就很简单了:
根据 这个 issue 链接 中的提示,加一个常量 googlePlayServicesVersion,给固定版本即可
或者,更新 react-native-device-info 到最新版,它对这个依赖的版本号加了一个默认版本,而不是 + 了。
至此,problem solved。
相关资料
google 在 20190617 发布了新的更新: stackoverflow.com/questions/5…
google 更新查询列表: developers.google.com/android/gui…
google 依赖列表: ./gradlew app:dependencies