Android之Apk优化
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
- 使用Android Studio菜单栏->Refactor->Remove Unused Resources,删除无用资源
- 使用Android Studio菜单栏->Code->Analyze Code->Run Inspection by Name,输入
Unused resources
,删除无用资源时注意有些资源可能是动态引用的,所以最好全局搜索一下 - 参考打包 APK(系统 App 必须是 Release 版本)
1 | release { |
不能完全依赖 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,推荐使用如下网站进行压缩和修改:
- tinify – 少量图片处理,此网站支持各个格式的图片压缩
- recompressor – 超过10张图片时,使用此网站(完全免费),但是导出只支持png或jpge格式,可以在线比对效果
- 图片宽高格式调整 – 可以进行单张图片的宽高调整和格式转换
将图片按照上面提示操作步骤,进行上传和压缩。压缩完成后,下载替换项目中的图片。
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图片压缩完成后,请进行预览对比
三、音视频资源优化
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 | android.enableR8=false |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 落雪のBlog!