Android App瘦身方法浅析
The following article is from 编码安全 Author 编码安全
APP基本结构
1、 lib文件夹:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a。
2、 assets文件夹:包含应用可以使用AssetManager对象检索的应用资源。
3、res文件夹:包含未编译到的资源 resources.arsc,主要有图片资源文件。(lint)
4、 META-INF文件夹:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。
5、 resources.arsc文件:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。
6、classes.dex文件:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。
7、AndroidManifest.xml文件:它包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
瘦身思路
通过对APP基本结构的解析,我们知道对APP大小占用比较大的就是 lib目录下的so文件,classess.dex文件,res和assets文件夹。那么下面就从这些比较大的文件或文件夹进行做些精简,以此达到瘦身的效果。
classess.dex文件
classes.dex中它包含所有的java代码,当进行打包时,gradle会将所有模板里的.class文件转换成classes.dex文件,当然,如果方法数超过64K(方法树爆棚,即为方法超过65535),将要新增其他文件进行存储。可以通过multidexing分多个文件 。
可以通过下面几个方法来实现减少代码量 :
1. 尽量减少第三方库的引用,这个在上面我们已经做过优化了。
2. 避免使用枚举,使用静态常量替代枚举。
3. 如果你的dex文件太大,检查是否引入了重复功能的第三方库。
lib文件夹
1.进行适配操作
so文件的优化:通常我们在使用NDK开发的时候,我们经常会有如下这么一段代码:
ndk {
//设置支持的so库架构
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
}
rmeabi-v7主要不支持ARMv5(1998年诞生)和ARMv6(2001年诞生).目前这两款处理器市场占比相对较少,所以可以在机设备上进行适配选择。
而许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK 二进制文件。对于这些设备,主要 ABI 将是 x86,辅助 ABI 是 armeabi-v7a。
2. 重新编译so文件,用更小的库代替
res,assets文件
1. 手动lint检查,手动删除无用资源
2. 将图片替换为Webp格式
3.尽量不要在项目中使用帧动画
4. 使用gradle开启shrinkResources
【精彩阅读】
Android逆向之Magisk+Edxposed刷入教程(内附资源)
Gradle Plugin+Transform+ASM Hook并替换隐私方法调用(彻底解决隐私不合规问题)
点个在看你最好看