解决react-native-admob的verifyReleaseResources构建失败问题
这个问题我之前也碰到过,核心原因是release模式下react-native-admob模块的依赖解析没有继承主App的resolutionStrategy,导致它还是拉取了高版本的play-services-ads,和你项目里旧的appcompat-v7:27.1.1产生了属性冲突——毕竟fontVariationSettings和ttcIndex是Android P(API 28)才引入的属性,高版本的play-services-ads依赖的支持库版本更高,和你用的27.1.1不兼容。
下面是几种可行的解决办法,按推荐程度排序:
方案1:全局强制依赖版本(推荐)
在项目根目录的build.gradle中,给所有模块统一指定强制依赖版本,这样react-native-admob也会遵循这个规则:
allprojects { repositories { // 保留你原有的仓库配置,比如google()、jcenter()等 } configurations.all { // 强制play-services-ads使用你验证过的兼容版本 resolutionStrategy.force 'com.google.android.gms:play-services-ads:17.2.1' // 同时强制支持库版本和你项目的appcompat保持一致,避免其他冲突 resolutionStrategy.force 'com.android.support:appcompat-v7:27.1.1' resolutionStrategy.force 'com.android.support:support-v4:27.1.1' } }
这个方案的好处是不需要修改第三方模块的代码,npm install后也不会失效,能从根本上统一所有模块的依赖版本。
方案2:修改react-native-admob的依赖版本(临时方案)
找到node_modules/react-native-admob/android/build.gradle,把里面的依赖声明从:
dependencies { implementation 'com.google.android.gms:play-services-ads:+' }
改成固定版本:
dependencies { implementation 'com.google.android.gms:play-services-ads:17.2.1' }
⚠️ 注意:这个方法的缺点是每次执行npm install或yarn install后,修改会被覆盖,需要重新修改,适合临时测试用。
方案3:升级项目的支持库版本(长远方案)
如果你的项目允许,直接把支持库和编译SDK版本升级到API 28,从根源上解决属性缺失的问题:
- 在
android/app/build.gradle中修改:
android { compileSdkVersion 28 defaultConfig { targetSdkVersion 28 // 其他配置不变 } } dependencies { // 把appcompat-v7升级到28.0.0 implementation 'com.android.support:appcompat-v7:28.0.0' // 其他依赖如果有版本冲突,也同步升级到对应的28.x.x版本 }
- 同步gradle后重新构建,这样高版本的
play-services-ads就可以和你的支持库兼容了,也不用再强制指定版本。
为什么Debug模式正常,Release模式报错?
Debug模式下,主App的resolutionStrategy会影响大部分依赖解析,但Release模式下,react-native-admob模块的verifyReleaseResources任务是独立执行的,它会自己解析依赖,没有继承主App的强制规则,所以会拉取最新的play-services-ads版本,导致冲突。全局设置强制版本就能解决这个问题。
内容的提问来源于stack exchange,提问作者罗国辉

