最近ios同学他们在用Matrix,然后也去了解了一下关于android版本的(GitHub地址)。主要做功能有性能检测和安装包分析。
今天主要记录一下ApkChecker的使用过程。
image主要可以列出的项有:
按文件大小排序列出apk中包含的文件
统计dex包含的方法数
检查是否经过了资源混淆:AndResGuard(微信资源混淆工具)
搜索不含alpha通道的png文件
搜索未经压缩的文件类型
搜索冗余的文件,等等。。。
接下来开始使用:
无需在代码里集成,只需下载apkchecker的jar包-jar包地址,(也可以在GitHub上看下最新版本):我这版本是0.5.1,下载好之后保存在了downloads的根目录下。
1、新建一个matrix/origin的文件夹,用于保存将要解析的apk包、以及需要复制项目里的R文件、mapping文件到origin中。
备注:
mapping文件位置:projectName/app/build/outputs/mapping/debug/mapping.txt
R文件位置:projectName/app/build/intermediates/symbols/debug/R.txt
image2、新建一个json格式配置文件,即上面图中的config.json
内容如下:
{
"--apk":"/Users/Downloads/matrix/origin/app-debug.apk",
"--mappingTxt":"/Users/Downloads/matrix/origin/mapping.txt",
"--resMappingTxt":"",
"--output":"/Users/Downloads/matrix/apk-checker-result",
"--unzip":"/Users/Downloads/matrixresult",
"--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":"20",
"--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":"-unusedResources",
"--rTxt":"/Users/Downloads/matrix/origin/R.txt",
"--ignoreResources"
:["R.raw.*",
"R.style.*",
"R.attr.*",
"R.id.*",
"R.string.ignore_*"
]
},
{
"name":"-unusedAssets",
"--ignoreAssets":["*.so" ]
}
]
}
字段分别对应的是
apk:将要解析的apk包文件位置
mappingTxt:mapping文件位置
output:输出分析结果的产物位置(注意,这里千万不能和unzip写到一个目录下,因为unzip是反编译apk的临时产物文件夹,流程结束后,会自动删除,我一开始把这俩个写在一个位置了,导致分析结果的html文件也一并删除了。。。😓)
format:输出结果文件的格式,html更加方便查看一些
min:最小阀值,文件大小大于这个设定值的文件都会过滤到 “Show files whose size exceed limit size in order.”这一项中
关于配置文件,github上的wiki更加全面,还有一些其他配置项,更具项目需要进行设置:https://github.com/Tencent/matrix/wiki/Matrix-Android-ApkChecker
3、打开终端,定位到downloads目录下
执行:
java -jar ApkChecker.jar --config /Users/Downloads/matrix/config.json
执行完毕
image.png
4、matrixHtml文件夹下会生成两个结果文件分别为json和html格式
image.png
5、打开html,看到的结果如下
各种格式文件的总共和大小,降序排列,so包,占了一半,果然很大
image.png
manifest信息:
image.png
是否使用了微信的资源混淆工具
image.png
没有打开alpha通道的图片,文档上建议换成jpg格式的,我和ui同学咨询了一下,有没有通道的话,好像格式要比有通道的文件要小一点,对于展示的效果应该没有区别,我打算用mac导出的功能,转成有通道的图片,也就是不更改jpg这个格式,保持png。
image.png
没有压缩过的资源
image.png
重复资源:列出大小内容完全一样的资源(这个还挺实用的,应该对于减少包大小有很大帮助)
image.png
没有被引用的资源
image.png
遇到的坑:
1、配置文件中checkMultiSTL和unstrippedSo需要指定ndk中的nm文件,据说是在Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm这个路径下,然而我的本地没有,就去google里去下载https://developer.android.com/dynamic_shared/https://dl.google.com/android/repository/android-ndk-r20-darwin-x86_64.zip,下载完之后放在了toolchains下,但是运行jar包,报错找不到nm工具,其实这两个属性是来检查是否有多个动态库静态链接了STL以及搜索apk中未经裁剪的动态库文件,so包也是依赖其他
,暂时估计做不了太大的改动,所以就把这俩属性从config文件中先删掉了,再跑了一遍jar包,就没问题了。
2、第二个就是output属性和unzip属性值写的一样是在同一个目录下,因为unzip是反编译apk的临时产物文件夹,流程结束后,会自动删除,我一开始把这俩个写在一个位置了,导致分析结果的html文件也一并删除了。这个实失误浪费了3个多小时,无语。
以上。
网友评论