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

独立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,而主应用未用到这些库,因此不会包含。

解决步骤

  1. 排查依赖树:执行命令./gradlew :example:androidtest:dependencies,查看测试模块的所有依赖,定位引入字体的库。找到后,用exclude语法排除冗余资源模块,或替换为轻量测试库。
  2. 开启测试模块资源压缩:在测试模块的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" // 仅保留指定语言资源
        // 也可针对字体资源做更精细的过滤
    }
}
  1. 检查自定义TestRunner:如果TestRunner继承了自定义实现,排查其依赖链是否引入了带字体的包,必要时调整Runner的依赖。

内容的提问来源于stack exchange,提问作者guipivoto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:18:26