APK 瘦身指南

前言

  • 千里之堤,溃于蚁穴

快速诊断

始终使用 Android Studio 中的 APK Analyzer 对生成的 APK 进行分析处理对比(Build -> Analyzer apk.. 或者直接使用 Android Studio 打开 apk 文件),一个 apk 文件大致内容如下:


文件 说明 扩展
lib so文件,不同的cpu架构 可以针对不同架构平台进行拆分打包或者使用兼容库
res 编译后的资源文件,drawable、layout等 优化的重点
assets 应用程序的资源、字体、音视频文件等 可使用工具进行优化
classes(n).dex dx编译后的java文件 使用混淆进行优化
META-INF 签名信息相关 ——
resources.arsc 二进制资源文件 资源的映射表,可以查询任意类型的资源id
kotlin 编译后的kotlin文件 ——
AndroiidManifest.xml 清单文件 ——

优化方向总共分为两部分,资源优化(本文重点)和代码优化(进阶)

资源优化

一、 移除无用资源 Android Lint

  1. 使用Android Studio菜单栏->Refactor->Remove Unused Resources,删除无用资源
  2. 使用Android Studio菜单栏->Code->Analyze Code->Run Inspection by Name,输入Unused resources,删除无用资源时注意有些资源可能是动态引用的,所以最好全局搜索一下
  3. 参考打包 APK(系统 App 必须是 Release 版本)
1
2
3
4
5
6
7
8
9
10
11
release {
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
//签名
signingConfig signingConfigs.release
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}

不能完全依赖 Android Lint, 此方式存在缺陷,动态引用资源以及反射使用 class 文件不能被检测到。
上述方法没有作用时,可以使用以下方法:
在Android Studio中使用全局搜索,assets、res下中的资源名称。
如果此资源在布局中使用,进入布局,排查此布局是否使用。
如未使用,将资源和此布局都移除;如使用,找到此布局所使用的类,如此类未使用,则将类、资源、布局全移除

二、 图片资源优化

Android 4.0+ 原生支持 webp 格式资源, webp 的高压缩率可以直接降低 APK 体积,并支持透明、动画、有损/无损压缩,覆盖大部分场景,替代 PNG/JPG/GIF。低版本可启用 android.webp.force=true

1. png和webp图片优化

  • 使用Android Studio自带的将图片转换为webp格式,方法:选中资源文件或者资源文件夹->鼠标右键->选择 Convert to webp
  • 如果使用上面方法变得更大了,或者清晰度受影响,在项目资源文件夹中,找到项目中的图片资源文件夹,显示方式选择详情,排序选择大小,超过100k的或者如果图片宽高超过1000px,推荐使用如下网站进行压缩和修改:
  1. tinify – 少量图片处理,此网站支持各个格式的图片压缩
  2. recompressor – 超过10张图片时,使用此网站(完全免费),但是导出只支持png或jpge格式,可以在线比对效果
  3. 图片宽高格式调整 – 可以进行单张图片的宽高调整和格式转换

    将图片按照上面提示操作步骤,进行上传和压缩。压缩完成后,下载替换项目中的图片。

2. svg图片优化

  • 使用方法:在需要添加的模块的res下->选中drawable->鼠标右键->New->Vector Asset
  • 在图片不复杂,色彩单一的情况下,推荐使用svg格式,Android中使用SVG
参数 说明
Asset type 资源类型。Local file(SVG,PSD)表示从添加本地的SVG图片;Clip art表示添加Android自带的SVG图片
Name Android Studio创建的SVG图片xml文件名称
Path 电脑上的SVG图片文件
Size 生成的SVG图片大小,一般不做修改
Opacity 不透明度
Enable auto mirroring for RTL layout 为RTL布局启用自动镜像,默认不勾选

3. GIF图片优化

  • gif图片压缩此链接进行压缩gif图片。gif图片压缩完成后,请进行预览对比

三、音视频资源优化

ffmpeg官方文档

1. 视频资源优化

  • 使用ffmpeg对视频进行压缩
  • ffmpeg压缩视频指令:
    1
    ffmpeg -threads,1,-i, arg.filePath, -c:v, libx264,-crf,30,-preset, superfast ,-y, -acodec,libmp3lame,arg.thumbVideoPath
参数 说明
-threads 执行线程数,传入1 单线程压缩
-i input路径,传入视频文件的路径
-c:v 编码格式,一般都是指定libx264
-crf 编码质量,取值范围是0-51,默认值为23,数字越小输出视频的质量越高。
-preset 转码速度,ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast编码速度最快,但压缩率低,生成的文件更大,placebo则正好相反。x264所取的默认值为medium。需要说明的是,preset主要是影响编码的速度,并不会很大的影响编码出来的结果的质量
-acodec 音频编码,一般采用libmp3lame
arg.thumbVideoPath 最后传入的是视频压缩后保存的路径
-y 输出时覆盖输出目录已存在的同名文件(如果不加此参数,就不会覆盖)

2. 音频资源优化

  • ffmpeg压缩音频指令:
    1
    ffmpeg -i "1.wav" -b:a 64k -acodec mp3 -ar 44100 -ac 1 "1.mp3"
    参数 说明
    -i 表示输入
    “1.wav” 文件名必须要用双引号
    -b a 64k表示音频的码率为64kb/s,即8kB/s
    -acodec mp3 设定声音编解码器为mp3
    -ar 44100 设定采样率为44100
    -ac 1 输出
    “1.mp3” 输出保存的文件名

代码优化-混淆

(1) Android 开发者文档 - 缩减、混淆和优化应用 链接:
https://developer.android.com/studio/build/shrink-code

(2) ProGuard 官方手册 链接:https://www.guardsquare.com/manual/home

这里不做赘述,每个项目的混淆规则是不一样的,需要注意是慎用R8,因为 R8 会忽略试图修改默认优化行为的所有 ProGuard 规则,例如 -optimizations 和 - optimizationpasses等。可以开启混淆,而不使用R8:

1
2
android.enableR8=false
android.enableR8.libraries=false