Android多模块项目移除library的targetSdk导致Instrumentation测试失败
解决AGP 7.4+中Library模块targetSdk废弃导致的Instrumentation测试安装错误
问题核心
移除Library模块中已废弃的targetSdk属性后,测试APK会默认继承Library的minSdk作为自身的targetSdk,导致权限模型不兼容(旧SDK 21无运行时权限,原targetSdk 33使用运行时权限),触发安装错误:
Exception thrown during onBeforeAll invocation of plugin com.google.testing.platform.plugin.android.AndroidDevicePlugin. Failed to install APK(s): -26: Package com.test new target SDK 21 doesn't support runtime permissions but the old target SDK 33 does.
解决方案
Library模块的targetSdk虽已废弃,但测试变体/测试风味的targetSdk属性仍有效,只需为测试单独配置targetSdk以匹配原行为,具体配置方式如下:
方式1:为所有测试变体统一设置targetSdk
在Library模块的build.gradle中,移除defaultConfig里的废弃targetSdk,通过遍历测试变体设置目标SDK:
android { compileSdk 33 defaultConfig { minSdk 21 // 移除已废弃的targetSdk配置 } // 为所有测试变体设置targetSdk,覆盖默认继承的minSdk testVariants.all { variant -> variant.mergedFlavor.targetSdk = 33 } }
方式2:针对TestBaseFlavor测试风味配置
如果项目使用TestBaseFlavor作为测试专用风味,直接在测试风味块中配置targetSdk:
android { compileSdk 33 defaultConfig { minSdk 21 // 移除已废弃的targetSdk配置 } // 配置测试风味 testFlavors { base { targetSdk 33 // 测试风味的targetSdk未废弃 } } }
原理说明
- Library模块的
targetSdk废弃后,测试APK默认会继承Library的minSdk值作为自身的targetSdk,导致权限模型切换为旧版本逻辑。 - 单独为测试配置
targetSdk=33,可让测试APK沿用原运行时权限模型,与系统中已安装的旧版本APK权限逻辑兼容,解决安装错误-26的问题。
内容的提问来源于stack exchange,提问作者Gowtham K K
相关产品推荐
相关产品推荐

