独立Instrumentation Test模块下测试APK体积过大问题排查
问题描述
我有一个多模块应用,近期将Instrumented Tests迁移至独立模块。当前构建、运行单元测试及Instrumented Tests均正常,但发现测试Instrumentation APK体积异常庞大(约170MB),而主应用APK仅约20MB。分析测试APK后发现其中包含大量.ttf字体文件,这些字体并未出现在主应用APK中。
模块配置
plugins { alias (libs.plugins.android.test) // "com.android.test" alias (libs.plugins.kotlin.android) alias (libs.plugins.ksp) alias (libs.plugins.hilt.dagger) } android { targetProjectPath = ":example:app:application" namespace = "com.example.androidtest" defaultConfig.apply { testInstrumentationRunner = "com.example.tests.TestRunner" } .... }
构建命令
./gradlew :example:app:application:assembleFullDebug :example:androidtest:assembleFullDebug or ./gradlew :example:androidtest:connectedFullDebugAndroidTest
生成的APK
// Instrumentation app.. This is the problematic one ./example/app/androidtest/build/outputs/apk/full/debug/androidtest-full-debug.apk // Actual app. Its size is normal. ./example/app/application/build/outputs/apk/full/debug/full_debug_v2.0.0.apk
请问这些字体文件来自何处?为何仅在测试辅助APK中存在?
问题分析与解决建议
字体来源及原因
- 测试依赖引入冗余资源:测试模块的依赖(如第三方测试库、UI模拟框架)可能自带了.ttf字体文件。主应用未引入这些依赖,或主应用的构建优化过滤掉了未使用资源,而测试模块默认保留所有依赖资源。
- 构建配置差异:主应用大概率开启了
shrinkResources和minifyEnabled,构建时自动移除未使用的资源(包括字体);但测试模块默认关闭这类优化,导致所有依赖的资源都被打包进APK。 - 资源合并规则差异:
com.android.test插件会合并目标应用的资源,同时也会打包自身依赖的全部资源。如果测试模块依赖的库包含字体,这些资源会被纳入测试APK,而主应用未用到这些库,因此不会包含。
解决步骤
- 排查依赖树:执行命令
./gradlew :example:androidtest:dependencies,查看测试模块的所有依赖,定位引入字体的库。找到后,用exclude语法排除冗余资源模块,或替换为轻量测试库。 - 开启测试模块资源压缩:在测试模块的
android配置中添加优化规则:
android { buildTypes { debug { minifyEnabled = true shrinkResources = true proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" } } }
注意编写适配测试代码的ProGuard规则,避免测试逻辑被混淆破坏。
3. 手动过滤资源:通过resConfigs指定测试模块保留的资源类型,减少冗余:
android { defaultConfig { resConfigs "en", "zh" // 仅保留指定语言资源 // 也可针对字体资源做更精细的过滤 } }
- 检查自定义TestRunner:如果
TestRunner继承了自定义实现,排查其依赖链是否引入了带字体的包,必要时调整Runner的依赖。
内容的提问来源于stack exchange,提问作者guipivoto
相关产品推荐
相关产品推荐

