Apk体积优化一直是迭代中的不可忽略的问题, 这次要说的是apk体积的检测方法, 毕竟优化都是基于检测的;
当然, 在Android Studio中有Apk Analyser工具可以使用, 但是需要导出, 或者在每个版本迭代中生成报告, 手动生成apk后拖入也是比较麻烦的; 使用Matrix 提供的工具 ApkChecker可以独立检测apk并生成报告, 下面介绍下打包检测过程;
1.下载ApkChecker.jar
https://download.csdn.net/download/qq_23992393/86871532
独立的工具jar包, 需要java环境可用
2. 命令封装
如果想查看支持的命令说明, 可以运行:
java -jar matrix-apk-canary-2.0.8.jar
一般项目中会通过配置文件方式设置, 直接看下demo中的设置:
2.1 目录:
独立将几个需要的文件独立到一个文件夹中,便于移动管理
matrix_apk_checker_config.json:
{
"--apk":"[项目apk目录]",
"--mappingTxt":"[项目mapping.txt目录]",
"--output":"apk-checker-result",
"--format":"mm.html,mm.json",
"--formatConfig":
[
{
"name":"-countMethod",
"group":
[
{
"name":"Android System",
"package":"android"
},
{
"name":"java system",
"package":"java"
},
{
"name":"com.tencent.test.$",
"package":"com.tencent.test.$"
}
]
}
],
"options": [
{
"name":"-manifest"
},
{
"name":"-fileSize",
"--min":"10",
"--order":"desc",
"--suffix":"png, jpg, jpeg, gif, arsc"
},
{
"name":"-countMethod",
"--group":"package"
},
{
"name":"-checkResProguard"
},
{
"name":"-findNonAlphaPng",
"--min":"10"
},
{
"name":"-checkMultiLibrary"
},
{
"name":"-uncompressedFile",
"--suffix":"png, jpg, jpeg, gif, arsc"
},
{
"name":"-countR"
},
{
"name":"-duplicatedFile"
},
{
"name":"-checkMultiSTL",
"--toolnm":"/Users/hanlonglin/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm"
},
{
"name":"-unusedResources",
"--rTxt":"[项目package-aware-r.txt或R.txt目录]",
"--ignoreResources"
:["R.raw.*",
"R.style.*",
"R.attr.*",
"R.id.*",
"R.string.ignore_*"
]
},
{
"name":"-unusedAssets",
"--ignoreAssets":["*.so" ]
},
{
"name":"-unstrippedSo",
"--toolnm":"/Users/hanlonglin/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm"
}
]
}
对应的目录填写自己项目中的目录即可, 不然会提示xxx is not legal!
matrix_apk_checker.sh:
cd $(cd `dirname $0`; pwd)
java -jar matrix-apk-canary-2.0.8.jar --config matrix_apk_checker_config.json
执行文件作用:
1.定位到当前目录
2.执行真正的apkChecker命令
2.2 使用
命令行输入:
./matrix_apk_checker.sh
第一次会提示权限不足 执行:
chmod +x matrix_apk_checker.sh
然后在执行上一条命令即可;
2.3 生成报告:
命令运行以后, 会在目录下生成 apk-checker-result.html 和 apk-checker-result.json
检测的信息主要包含如下信息:
- 读取manifest的信息
从AndroidManifest.xml文件中读取apk的全局信息,如packageName、versionCode等。
- 按文件大小排序列出apk中包含的文件
列出超过一定大小的文件,可按文件后缀过滤,并且按文件大小排序
- 统计方法数
统计dex包含的方法数,并支持将输出结果按照类名(class)或者包名(package)来分组
- 检查是否经过了资源混淆(AndResGuard)
检查apk是否经过了资源混淆,推荐使用资源混淆来进一步减小apk的大小
- 搜索不含alpha通道的png文件
对于不含alpha通道的png文件,可以转成jpg格式来减少文件的大小
- 检查是否包含多个ABI版本的动态库
so文件的大小可能会在apk文件大小中占很大的比例,可以考虑在apk中只包含一个ABI版本的动态库
- 搜索未经压缩的文件类型
某个文件类型的所有文件都没有经过压缩,可以考虑是否需要压缩
- 统计apk中包含的R类以及R类中的field count
编译之后,代码中对资源的引用都会优化成int常量,除了R.styleable之外,其他的R类其实都可以删除
- 搜索冗余的文件
对于两个内容完全相同的文件,应该去冗余
- 检查是否有多个动态库静态链接了STL
如果有多个动态库都依赖了STL,应该采用动态链接的方式而非多个动态库都去静态链接STL
- 搜索apk中包含的无用资源
apk中未经使用到的资源,应该予以删除
- 搜索apk中包含的无用assets文件
apk中未经使用的assets文件,应该予以删除
- 搜索apk中未经裁剪的动态库文件
动态库经过裁剪之后,文件大小通常会减小很多
部分截图如下: