如何查看Android APK中各依赖库带来的具体体积增量?
以下几种方案可以帮你精准统计每个第三方SDK/库对APK体积的贡献:
利用R8/ProGuard的使用报告
开启混淆后,R8/ProGuard会生成usage.txt报告,记录哪些类被保留到最终APK里。结合这份报告和APK Analyzer的dex文件大小,就能统计出每个SDK对应的保留类总字节数,算出实际体积贡献。
配置方式:在app/build.gradle的release构建类型中开启混淆并确保生成报告:android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }报告路径:
build/outputs/mapping/release/usage.txt,里面会标注类似com.bumptech.glide.**的保留类,你可以用脚本批量统计这些类在dex文件中的大小总和。Gradle任务统计依赖库体积
编写一个简单的Gradle任务,直接统计每个第三方依赖的原始jar大小,再根据混淆压缩比例(通常30%-50%)估算最终APK中的实际体积。
示例任务:task calculateLibrarySizes { doLast { configurations.compileClasspath.resolvedConfiguration.resolvedArtifacts.each { artifact -> // 过滤掉自己项目的代码,只统计第三方库 if (!artifact.moduleVersion.id.group.startsWith("com.yourcompany")) { def rawSizeMB = artifact.file.size() / 1024 / 1024 // 按60%的压缩率估算最终体积(可根据自己项目的混淆情况调整) def finalSizeMB = rawSizeMB * 0.6 println "${artifact.moduleVersion.id.group}:${artifact.moduleVersion.id.name}: 原始jar大小 ${rawSizeMB.round(2)} MB,估算最终APK体积 ${finalSizeMB.round(2)} MB" } } } }运行命令:
./gradlew calculateLibrarySizes,就能得到每个第三方库的体积数据。Dexcount插件统计类数量估算体积
Dexcount插件可以统计每个包的类、方法数量,按每个类平均1-2KB的大小估算,就能得到SDK的大致体积贡献。
配置步骤:- 根项目
build.gradle添加依赖:buildscript { dependencies { classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:3.1.0' } } - app模块
build.gradle应用插件:apply plugin: 'com.getkeepsafe.dexcount'
构建完成后,报告在
build/outputs/dexcount/release/index.html,可以按包名筛选第三方SDK,统计类数量后乘以平均类大小得到体积。- 根项目
手动对比移除法
暂时移除某个第三方SDK(注意排除其传递依赖),重新构建APK,对比移除前后的APK大小差值,就是该SDK的实际体积贡献。这种方法虽然繁琐,但结果最准确,适合重点怀疑的SDK。
内容的提问来源于stack exchange,提问作者Jhon Fredy Trujillo Ortega

