Android开发之apk瘦身计划

为什么apk越来越大?

1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多。

2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多。

3.引入的第三方sdk或开源库越来越多,增加了很多重复的资源或方法以及无效代码。

4.用于体验要求高,图片资源为保证清晰度会使用分辨率更高的图片。

apk瘦身的切入点

解压一个没有加固过的apk文件我们会看到下边的内容,相信你对这些文件或目录的含义都已经清楚,接下来我们将会从三个方面进行apk的瘦身操作:

1.Java代码,对应classes.dex文件,我们要剔除无效代码,减小dex文件大小。

2.资源文件,对应res文件夹,assets目录。

3.减小lib中引入的so大小。

apk组成

直接将apk 拖到android studio窗口,或者我们把apk解压后,能看到下面这些文件

在这里插入图片描述

优化方向

我们的优化方案,就对应这apk的组成

在这里插入图片描述

源代码

代码混淆

移除无用代码

studio 自带的工具

使用CPD/PMD工具

PMD是一个源代码分析器。它发现常见的编程缺陷,如未使用的变量、空的catch块、不必要的对象创建,等等.

PMD 网站

PMD GUI网站:

使用切面编程的方式进行统计(AOP),确认无用代码。

三方库的处理

统一基础库

统一三方调用的库等等

原则是同样的功能,不要出现多套代码。

资源文件

删除冗余资源

资源混淆

资源压缩

jpg:采取压缩算法,不支持透明通道

png:无损压缩,支持透明度

webp:无损压缩图像格式,与JPG相比,可大幅减少文件体积

虽然png是无损压缩。但是也有一些网站可以对png图片进行有损压缩,比如tinypng网站

资源在线化,动态下载

对于一些比较大,又不是很及时要用的图片,可以考虑从服务端下载。

可以使用下面三种方式找出无用的资源

方式一 Inspect Code

通过Android Studio 菜单栏 → code → Inspect Code

在弹出的框框中选择 configure (在右下键)

在弹出的框框中输入 unused resources(在左上角),勾选对应的选项

点击开始

如下图

在这里插入图片描述

这里的选项实在是很多,我们只找出未使用的资源文件,最好先将其他的选择全取消,然后在勾选 unused resources
在这里插入图片描述

这时候就开始分析项目了,我们耐心等待一会

在这里插入图片描述

方式二

菜单栏 → Refactor → Remove Unused Resources

在这里插入图片描述

这样直接就开始删了,当然要检查下,不要误删。

方式三 腾讯的 Matrix

Matrix是微信终端自研和正在使用的一套APM(Application Performance Management)系统。

Matrix-ApkChecker 作为Matrix系统的一部分,是针对android安装包的分析检测工具,根据一系列设定好的规则检测apk是否存在特定的问题,

并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪。Matrix-ApkChecker以一个jar包的形式提供使用,

通过命令行执行 java -jar ApkChecker.jar 即可运行。

也可以配置一下

java -jar matrix-apk-canary-2.1.0.jar --config CONFIG-FILE-PATH

matrix git 搜索APK Checker,这里有个下载链接,点击下载jar包。

Matrix apkchecker 文档

CONFIG.json文件,也可以之间用官网的,最终会生成两个文件,之间查看即可

{
  "--apk":"E:\release.apk",
  "--mappingTxt":"E:\mapping.txt",
  "--output":"E:\",
  "--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":"-unusedResources",
      "--rTxt":"E:\R.txt",
      "--ignoreResources"
      :["R.raw.*",
        "R.style.*",
        "R.attr.*",
        "R.id.*",
        "R.string.ignore_*",
        "R.dimen.*",
        "R.string.*",
        "R.color.*"
      ]
    },
    {
      "name":"-unusedAssets",
      "--ignoreAssets":["*.so" ]
    }
  ]
}

通过这种方式,我们回得到一个html分析的结果表格,但是我们看到的都是混淆过到资源文件,这时 可以使用 aapt2 来输出apk资源表的内容(resources.arsc文件):

aapt2 dump resources xxx.apk > logx.tx

更多Android性能优化问题和技术可以参考《Android核心优化笔记》点击可以查看详细优化板块。

资源混淆

so瘦身

动态so;

指定架构支持(如v7a、v8a);

另外还可以只保留一个cpu架构,别的cpu架构自动适配,程序运行过程中,通过判断cpu架构选择合适的so

if(v7a) {
    xxx
} else {
    xxx
}

猜你喜欢

转载自blog.csdn.net/m0_70748845/article/details/134363986