APK瘦身——更全面的方案

本文详述了Android APK瘦身的过程,包括压缩代码、优化res文件夹、处理resources.arsc文件、减小assets文件夹及lib文件夹。重点介绍了ProGuard代码压缩,资源分析工具,以及res文件夹中图片、音频的压缩与替换策略,如TinyPNG、WebP格式和SVG矢量图的使用。同时提到了动态加载和多APK策略,以减少不必要的资源和针对不同设备构建特定版本的APK。
摘要由CSDN通过智能技术生成

前阵子做了一次减包体的工作,过后觉得这项工作还是套路性挺强的,于是综合当时的经验以及广泛浏览了网上的各种大牛小牛的博客,实践后特总结了以下的一些思路和做法,不求内容最丰富,只求方案更全面。

APK瘦身的目的

瘦身的目的最明显的一个就是:提高下载转化率。怎么理解呢?举个例子来说,假如你的应用包12MB,有100个潜在用户想要去下载尝试使用你的应用,结果有20个用户嫌弃安装包太大而直接放弃,有20个用户在等待下载的过程中取消下载,最终只有60个用户下载安装了应用。这时你的应用的实际的下载转化率其实是 60/100 = 60%。
简单的总结:安装包越小,用户下载等待的时间越短,对手机配置要求的也越小,设备的体验愈佳,应用的下载转化率也就越高。

APK包体的组成

开始瘦身前,需要先了解一下APK都主要由哪些成分组成

  1. classes.dex
    编写的所有的Java代码(包括各种引入的sdk代码)最终转化成在Android虚拟机上运行需要的字节码(和java的字节码有一定的区别)

  2. res文件夹
    存放所有资源的文件夹(除了里面raw文件夹的文件不会被编译,其他都会被编译)

  3. resources.arsc
    编译后的二进制资源文件

  4. assets文件夹
    用于保存需要保持原始文件的资源文件(这部分资源不会被编译)

  5. lib文件夹
    用于存放应用需要的native库文件

  6. AndroidManifest.xml
    程序全局配置文件

  7. META-INF文件夹
    存放几个签名校验相关的文件,用于保证APK的完整性和安全性

  8. 其他
    其他一些配置生成的文件

分析现APK各成分的比例

了解清楚APK的各个组成成分后,就需要有针对性地对自己的APK各个成分做一个比例分析。
工具1:Android Studio 2.2及其以上的版本
Android Studio自2.2版本以来就引入了分析APK各成分的比例的功能,用法也挺简单的,主要有2种操作方法,如下:

  1. 导航栏的Build →Analyze APK…→选择APK文件的路径→选择OK打开即可
    导航栏的Build

    选择APK文件的路径

  2. 可以直接把APK包拖进IDE,也可以得到如下的比例分析构成图(比例会自动按从大到小排好序呈现)
    比例会自动按从大到小排好序

    可以看出,在其中一般占比比较大的一般都是dex文件,res文件夹,assets文件夹,lib文件夹以及resource.arsc文件。所以接下来的工作就是有针对性地让这些文件和文件夹尽量地变小。在开始下一步之前,要简要介绍另外一个工具。

工具2:NimbleDroid
NimbleDroid是美国哥伦比亚大学的博士创业团队研发出来的分析Android app性能指标的系统,分析的方式有静态和动态两种方式,其中静态分析可以分析出APK安装包中大文件排行榜,各种知名SDK的大小以及占代码整体的比例,各种类型文件的大小以及占排行,各种知名SDK的方法数以及占所有dex中方法数的比例。这个外国网站的工具目前比Android Studio自带的功能更加全面和强大。这里仅作简要介绍,读者若有兴趣可自行去研究。

有针对性地对各部分做缩减工作

一、减classes.dex文件——压缩代码

代码压缩通过 ProGuard 提供,ProGuard 会检测和移除封装应用中未使用的类、字段、方法和属性,包括自带代码库中的未使用项(这使其成为以变通方式解决 64k 引用限制的有用工具)。ProGuard 还可优化字节码,移除未使用的代码指令,以及用短名称混淆其余的类、字段和方法。混淆过的代码可令您的 APK 难以被逆向工程。
要启用通过 ProGuard 实现的代码压缩,要在对应moudle(一般情况下是主moudle,build.gradle文件第一行为apply plugin: ‘com.android.application’)的build.gradle 文件相应的构建类型中添加 minifyEnabled true
注意,ProGuard会拖慢构建速度,因此应该尽可能避免在调试版本构建中使用它。另:Android Studio 会在使用 Instant Run 时停用 ProGuard。

如下为构建release版本的build.gradle的示例片段:

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

其中的proguardFiles 属性:用于定义 ProGuard 规则

getDefaultProguardFile(‘proguard-android.txt’) 为获取默认的 ProGuard规则文件,它位于Android SDK tools/proguard/ 文件夹。(提示:要想做进一步的代码压缩,可尝试使用位于同一位置的 proguard-android-optimize.txt 文件。它包括相同的 ProGuard 规则,除此之外还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。)

proguard-rules.pro 文件用于添加自定义的 ProGuard 规则。默认情况下,该文件位于moudle根目录(build.gradle 文件旁)

每次构建时 ProGuard 都会输出下列文件,这些文件保存在 /build/outputs/mapping/release/

  • dump.txt
    说明 APK 中所有类文件的内部结构。

  • mapping.txt
    列出了原始的类,方法和字段名与混淆后代码间的映射。(这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码)

  • seeds.txt
    列出未进行混淆的类和成员

  • usage.txt <

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值