如何通过Gradle任务自动化计算APK/AAB的实际安装大小
方案1:无需连接设备的安装大小预估(CI友好)
可以直接使用Android SDK内置的aapt2工具(build-tools 30.0.0及以上版本自带)实现无设备的安装大小计算,该工具给出的是官方标准预估值,和实际安装差值极小。
对应的Gradle任务示例如下:
import com.android.build.gradle.BaseExtension import java.io.ByteArrayOutputStream tasks.register("getApkInstallSize") { dependsOn("assembleRelease") // 依赖打包任务,按需修改变体名 val android = project.extensions.getByType(BaseExtension::class.java) val aapt2Path = File(android.sdkDirectory, "build-tools/${android.buildToolsVersion}/aapt2").absolutePath val apkPath = File(project.buildDir, "outputs/apk/release/app-release.apk").absolutePath // 按需修改APK路径 doLast { val outputStream = ByteArrayOutputStream() exec { commandLine(aapt2Path, "get-size", "total", apkPath) standardOutput = outputStream } val installSizeBytes = outputStream.toString().trim().toLong() val installSizeMb = "%.2f".format(installSizeBytes / 1024 / 1024.0) println("APK预估安装大小:${installSizeMb}MB (${installSizeBytes}字节)") // 可自行将结果写入文件、上报到监控平台等 } }
如果需要区分不同存储分区的大小,把命令里的total换成user/system即可。
方案2:连接真实设备的实测安装大小
如果需要获取设备上的真实安装大小,可以通过Gradle调用adb命令完成自动安装、查询、卸载的全流程,适合有测试机挂载的场景:
import java.io.ByteArrayOutputStream tasks.register("getRealApkInstallSize") { dependsOn("assembleRelease") val apkPath = File(project.buildDir, "outputs/apk/release/app-release.apk").absolutePath val packageName = "com.your.packagename" // 替换为你的应用包名 doLast { // 安装APK exec { commandLine("adb", "install", "-r", apkPath) } // 查询安装大小 val outputStream = ByteArrayOutputStream() exec { commandLine("adb", "shell", "pm", "get-installed-size", packageName) standardOutput = outputStream } val sizeMatch = Regex("total=(\\d+)").find(outputStream.toString().trim()) val installSizeBytes = sizeMatch?.groupValues?.get(1)?.toLong() ?: 0L val installSizeMb = "%.2f".format(installSizeBytes / 1024 / 1024.0) println("APK真实安装大小:${installSizeMb}MB (${installSizeBytes}字节)") // 卸载APK exec { commandLine("adb", "uninstall", packageName) } } }
注意事项
- 如果你的项目使用AGP 7.0+,可以直接通过AGP提供的API直接获取构建产物路径,不需要硬写APK路径,适配性更强。
- 两个方案都可以直接和你现有基于
apkanalyzer的体积统计任务整合,统一输出体积报表。
内容的提问来源于stack exchange,提问作者Marvin Effing
相关产品推荐
相关产品推荐

