• Android性能优化之应用瘦身(APK瘦身)


    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
    专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

    在这里插入图片描述

    一、导读

    我们继续总结学习Android 知识,温故知新。

    lint检查代码

    二、概览

    APK瘦身优化的优先级相对来说是比较低的,因为优化后也并不能明显的看到有什么好处,这一块主要影响转换率,应用越小,
    可能用户下载的意愿就越高,另外在进行预装时,也有大小的要求。

    一般来说我们可以通过下面几种方式来进行优化:

    • 资源文件:压缩;动态下载。
    • so文件:动态so;不同的架构支持(v7a、v8a)。
    • 源代码:用代码分析工具,去除不再使用的代码;插件化。
    • assets:动态下载;压缩。
    • proguard 混淆代码

    2.1 apk组成

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

    文件描述
    classes(有多个).dexJava Class,被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式
    lib存放so文件,可能有多种架构
    assets程序资源,使用AssetManager来调用
    res资源文件,如:drawable、layout
    AndroidManifestAndroidManifest
    resources.arsc编译后的二进制资源文件
    META-INF包含了APK中所有文件的签名摘要等信息

    三、优化方向

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

    3.1 源代码

    3.1.1 代码混淆

    3.1.2 移除无用代码

    1. studio 自带的工具
      在这里插入图片描述

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

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

    3.1.3 三方库的处理

    统一基础库
    统一三方调用的库等等

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

    3.2 资源文件

    1. 删除冗余资源

    2. 资源混淆

    3. 资源压缩

      • jpg:采取压缩算法,不支持透明通道
      • png:无损压缩,支持透明度
      • webp:无损压缩图像格式,与JPG相比,可大幅减少文件体积

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

    1. 资源在线化,动态下载
      对于一些比较大,又不是很及时要用的图片,可以考虑从服务端下载。

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

    3.2.1 方式一 Inspect Code

    1. 通过Android Studio 菜单栏 → code → Inspect Code
    2. 在弹出的框框中选择 configure (在右下键)
    3. 在弹出的框框中输入 unused resources(在左上角),勾选对应的选项
    4. 点击开始

    如下图
    在这里插入图片描述

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

    这时候就开始分析项目了,我们耐心等待一会
    在这里插入图片描述

    3.2.2 方式二

    菜单栏 → Refactor → Remove Unused Resources
    在这里插入图片描述

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

    3.2.3 方式三 腾讯的 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
    
    • 1

    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" ]
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

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

    aapt2 dump resources xxx.apk > logx.txt
    
    • 1

    3.2.4 资源混淆

    3.3 so瘦身

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

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

    if(v7a) {
        xxx
    } else {
        xxx
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    还有就是插件化,这个是一个专题,我们在另外的文章里面讲。

    四、 推荐阅读

    Java 专栏

    SQL 专栏

    数据结构与算法

    Android学习专栏

    ddd

  • 相关阅读:
    selenium的常见方法及使用
    各种语言如何连接到 OceanBase
    Linux---用户管理命令(useradd、userdel、usermod、passwd、id)
    文件基本操作
    Java————网络编程
    2023面试知识点一
    【Zabbix监控二】之zabbix自定义监控内容案例(自动发现、自动注册)
    uniapp的 picker 日期时间选择器
    嵌入式Linux入门—Linux多线程编程、互斥量、信号量、条件变量
    在C语言中,单向链表的插入操作通常包括以下哪些步骤?
  • 原文地址:https://blog.csdn.net/fumeidonga/article/details/132765927