Apk size瘦身
一.背景
由于项目代码不段增多以及很多图片资源现直接导致包size变大,直接影响到用户下载。
二.优化方法
1.APK资源混淆(AndroidResGuard微信方案):所谓资源混淆就是混淆资源名称的长度。
我们先了解下:
* Android Apk资源的编译和打包过程,会通过aapt把资源打成二进制的文件。
(1). 使用aapt工具将资源文件生成R.java文件, resources.arsc和打包资源文件.
(2). 使用aidl工具将.aidl文件编译成.java文件.
(3). 使用javac工具将.java文件编译成.class文件.
(4). 使用dx脚本将众多.class文件转换成一个.dex文件.
(5). 使用apkbuilder脚本将资源文件和.dex文件生成未签名的apk安装文件.
(6). 使用jdk中的jarsigner对apk安装文件进行签名.
* apk解包之后文件结构:
各文件的介绍如下:
(1) classes.dex:classes.dex是java源码编译后生成的java字节码文件.
(2) resources.arsc:编译后的二进制资源映射表文件.
(3) AndroidManifest.xml:它描述了应用的名字、版本、权限、引用的库文件等等信息.
(4) assets:assets目录可以存放一些配置文件及本地资源、图片资源等.
(5) lib:存放的是一些jar, so文件.
(6) META-INF:META-INF目整性和系统的安全。
(7) res:resid 资源id的映射表。
* resources.arsc文件:是用来描述android 资源id的映射表。android有assets,res资源两种,可以简单理解是索引这两种资源的目录。
简单了解之后,我们知道proguard(当然可以修改proguard源码混淆资源)只会重命名已经存在的类、字段、方法和属性等是不会混淆资源名的,其实微信这套方案就是精简资源长度达到opt size的目的,它大概做了什么事情呢?
(1) 解压apk
(2) 混淆资源名称,修改映射表(resources.arsc文件),利用7z深度压缩
(3)重新签名打成apk
即可达到压缩混淆资源的目的。
大概介绍下使用:
工具配置在tool_apk_size_opt目录时。
(1).config文件里可以配置seventzip(7z压缩)、keeproot,(是否将res/drawable混淆成r/s)等,以及白名单、重新打包签名、压缩、及mapping.
(2)配置jdk path, release key, key password后,利用android sdk里的zipalign工具时行对齐输出来当前outapk目录里。
运行buildApk.bat自动完成apk混淆。效果如下:
项目地址:https://github.com/shwenzhang/AndResGuard
反编译apk后资源混淆效果:
(1)anim
(2)layout
(3)drawable
(4)mapping
说明:如果使用无线保镖的同学,需要注意drawable文件夹里的密钥图片,在config.xml里配置白名单,防止资源名混淆掉,如果不配置白名单,可能引起崩溃,业务数据解密不了等问题。
2.gradle脚本打包配置
(1)开启minifyEnable混淆:进行Proguard混淆的配置
(2)开启shrinkResources去除无用资源
(3)删除无用的语言资源
3.去掉无用资源文件(AS)
去掉无用res步骤:
(1).Analyze----->Run Inspection by Name
(2)输入 unused Resources
去掉无用res(string,drawable ...)
4.TinyPNG工具优化资源文件(https://tinypng.com/)
android打包本身会对png进行无损压缩。利用TinyPNG工具对png可行有损压缩。实验结果在原来的图片基础上可以减少一半大小。强烈推荐,不过有透明色的建议不要使用Tinypng工具压缩,可能失掉透明色。
TinyPNG 样子
然后直接把图片拖到上面,压缩完了下载即可