You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:45:15