美文网首页工作生活
安卓:腾讯Matrix之ApkChecker的使用

安卓:腾讯Matrix之ApkChecker的使用

作者: 蝴蝶AD | 来源:发表于2019-07-01 11:29 被阅读0次

    最近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

    image

    2、新建一个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.”这一项中

    image.png
    关于配置文件,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个多小时,无语。

    以上。

    相关文章

      网友评论

        本文标题:安卓:腾讯Matrix之ApkChecker的使用

        本文链接:https://www.haomeiwen.com/subject/xsfgcctx.html