Apk瘦身主要从三方面入手:资源文件、源代码和第三方类库。

一、资源文件

1.1 删除无用资源文件

1.1.1 Lint工具

菜单 -> Analyze -> Run Inspection by Name,然后输入Unused resources便可以执行查找无用资源文件。自己根据需要进行删除。

1.1.2 shrinkResources

1
2
3
4
5
6
7
8
9
10
11
12
buildTypes {
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//混淆
minifyEnabled true
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}

使用shrinkResources的前提是,打开混淆minifyEnabled,建议只在release版本开启,不然会使得编译速度变慢。

1.2 图标类资源图片矢量化

对于图标类资源,可以选择用vector-drawable来代替,通过AndroidStudio自带的转换工具可以将svg文件转换为vector-drawable文件。

具体操作为,在drawable相关文件夹上右键 -> New -> Vector Assert。

你也可以进行批量转换:工具地址

1.3 非图标类资源图片适当压缩与格式选择

1.3.1 使用tinypng有损压缩png图片

通过Tinypng官网上传压缩再下载,在保持alpha通道的情况下对png图片的压缩可达到1/3以内,且肉眼基本看不出差别。

1.3.2 使用jpg格式

对于非透明的大图,jpg会比png的大小和内存都更有优势,虽然不是绝对的,但是通常会减少到一半不止。

1.3.3 使用webp格式

webp格式支持透明度,压缩比比jpg高,但是显示效果却不输于jpg。缺点是在Android端的原生支持不好,从Android4.0+开始原生支持,但是不支持透明度,从Android4.3+开始支持带有透明度的webp。如果不需要兼容到这个版本,可以直接使用。

在Android studio中,在图片资源上右键可以转换为webp。详细参见创建 WebP 图片

1.3.4 适当的压缩和尺寸

无论以上哪种格式图片,都可以通过选择合适的尺寸和适当的提高压缩率的方式,来进一步减少文件大小,进而减小apk文件的体积。

1.3.5 帧动画尽可能使用lottie

Lottie是Aribnb开源的动画库,通过json文件来进行展示动画,动画文件可以通过Adobe AE来制作。

1.4 有限国际化

1
2
3
4
5
android {
defaultConfig {
resConfigs "zh"
}
}

1.5 第三方库中大尺寸的无用资源同名替换

如果在第三方类库中,存在用不到的图片资源文件,可以通过1x1像素的同名图片进行替换。

1.6 使用AndResGuard

AndResGuard,在gradle文件中就可以直接使用,非常方便。

二、源代码

2.1 开启混淆

这是基本操作了,无需多言。

2.2 手动修改开源代码

将开源代码中我们不需要的类或者方法等删除掉,但是这需要对开源代码非常了解,而且确保版本兼容性,将来开源库升级或者随着我们产品需求变更对开源库的要求也改变了,都会影响对开源库的修改,不建议使用。

三、第三方类库

3.1 动态库

3.1.1 删除非必要平台so库

1
2
3
4
ndk {
//设置支持的so库架构
abiFilters "armeabi-v7a"
}

基本上,对于手机来说,支持armeabi-v7a就足够了。

3.1.2 动态加载so库

如果不是一启动应用就需要初始化的so库,完全可以在需要的时候再下载这个so文件,再通过以下代码进行加载。

1
2
3
static {
System.loadLibrary("path/to/lib.so");
}

其他

插件化

将不需要在启动就加载的功能模块,通过插件化,在用户使用的时候再从服务器加载。

删除class文件的debug items

不建议使用,这种做法,事倍功半。

本文采用CC-BY-SA-3.0协议,转载请注明出处
Author: boybeak