3.1、代码层面的瘦身方案
3.1.1、使用ProGuard进行代码混淆与优化
ProGuard是一款强大的Java字节码混淆器、优化器和压缩器。在Android应用构建过程中,ProGuard通过对字节码进行混淆处理,使得逆向工程变得困难;同时,它能够分析程序的静态引用关系,识别并剔除未使用的类、字段、方法以及内部类,从而显著缩小APK大小。
3.1.1.1、基本原理
混淆:重命名类、字段和方法的名称,使代码难以阅读理解。
优化:移除无用的代码块,如无用的变量定义、未被调用的方法等。
压缩:进一步压缩字节码,去除无用的元数据和注释,减少存储空间需求。
3.1.1.2、配置方法
要在 Android 项目中使用 ProGuard,在项目的 build.gradle 文件中,启用 ProGuard:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
创建一个名为 proguard-rules.pro 的文件,放置在项目的 app 目录下。在此文件中,您可以添加自定义的混淆规则。
在 proguard-rules.pro 文件中添加一些基本的混淆规则,以避免混淆到一些需要保留的类和方法:
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class com.android.vending.licensing.ILicensingService
3.1.1.3、利用ProGuard剔除无用代码和类
ProGuard 可以通过分析应用程序的入口点,自动识别无用代码和类,并将其从最终的 APK 中移除。要启用此功能,需要在 proguard-rules.pro 文件中添加以下规则:
-dontoptimize
-dontpreverify
-allowaccessmodification
-dontshrink
3.1.2、移除未使用的第三方库依赖
3.1.3、使用R8替代或配合ProGuard进行更高效优化
3.1.3.1、概述
R8是Google推出的下一代代码优化工具,集混淆、优化和压缩于一体,与D8 dexer紧密结合,提供了更快更高效的构建流程。R8在保持ProGuard强大功能的基础上,还增强了对Android平台特性的支持和优化效果。
在较新的Android Gradle插件版本中,R8通常是默认的混淆工具。无需特殊配置即可自动替换ProGuard。若需自定义,依然可在Gradle配置文件中调整R8的相关选项。
3.1.3.2、R8配置示例
要在 Android 项目中使用 R8,需要在项目的 build.gradle 文件中进行以下配置:
android {
buildTypes {
release {
minifyEnabled true
useProguard false // 使用R8代替ProGuard
r8 {
// R8特有的配置项
}
}
}
}
在 gradle.properties 文件中,添加以下配置以启用 R8 的实验性功能:
android.enableR8=true
3.2、资源层面的压缩与优化
3.2.1、图片资源优化
图片资源通常是应用体积较大的原因之一。使用图片压缩工具可以显著减小图片体积。以下是几种常用的图片压缩方法:
3.2.1.1、TinyPNG/TinyJPG
使用智能有损压缩算法,将图片压缩为较小的 PNG 或 JPEG 格式,同时保持较高的图像质量。
3.2.1.2、JPEGmini
在保持图片质量的同时,更有效地压缩 JPEG 图片。
3.2.1.3、WebP
WebP是一种同时支持有损压缩和无损压缩的图片格式,它具有更好的压缩效果。通过使用WebP替代PNG和JPEG,可以有效地减小图片资源的体积。但需要注意的是,WebP并不被所有设备支持,因此需要做好兼容性处理。
3.2.1.4、使用SVG替代矢量图
SVG是一种可缩放矢量图形格式,它具有更小的文件大小和更高的清晰度。通过使用SVG替代矢量图,可以有效地减小矢量图资源的体积。但需要注意的是,SVG在某些情况下可能会出现渲染问题,因此需要进行充分的测试。
3.2.2、多媒体资源压缩
音频和视频资源也是影响 APK 体积的重要因素。可以对多媒体资源进行压缩以减小体积。
3.2.2.1、音频资源压缩
使用音频压缩工具(如 MP3Trim、FFmpeg)将音频文件转换为较小的格式(如 AAC、MP3),并适度降低音质以减小文件大小。
3.2.2.2、视频资源压缩
使用视频编码器(如 H.264、VP9)压缩视频文件,同时保持较高的视频质量。
3.2.3、其它资源文件压缩
除了图片、音频和视频资源,其他资源文件(如 XML 等)也可以进行压缩。使用如下工具压缩资源文件:
3.2.3.1、Android Asset Compression Tool
将资源文件压缩为 LZMA 格式,减小 APK 体积。
3.2.3.2、Android Gradle插件
Android Gradle插件提供了一种简单的方法来对资源进行压缩。通过在build.gradle文件中配置minifyEnabled true,可以实现对资源文件的压缩。但需要注意的是,资源压缩可能会影响应用的性能,因此需要进行充分的测试。
3.2.4、无用资源检测与剔除
移除未使用的代码和资源,定期清理项目,删除无用的布局、样式和脚本文件。
3.3、新型优化手段与工具
3.3.1、Android App Bundle
Android App Bundle是一种新的发布格式,它可以让用户根据自己的设备配置动态地下载和安装应用的资源。通过使用Android App Bundle,可以让应用在不同设备上只下载所需的资源,从而减小APK的大小。
3.3.2、Play Asset Delivery
Play Asset Delivery是谷歌推出的一种动态交付机制,旨在优化安卓应用的下载和更新体验。它通过将应用程序的资源(如代码、图片、音频等)分离出来,按需交付给用户的设备,从而减少了应用程序的大小和下载时间。
这种方式特别适用于那些超过150MB的大型游戏。
3.3.3、APK Analyzer分析APK
APK Analyzer是一个用于分析APK的工具,它可以帮助我们找出APK中哪些资源占用了较多的空间,从而有针对性地进行优化。通过使用APK Analyzer,可以更好地了解APK的组成,从而进行更有效的瘦身。
3.3.4、Apktool
Android Apktool是一款开源工具,主要用于逆向工程Android应用程序的apk文件,实现反编译、修改和重新打包等功能。在资源优化方面,Apktool主要应用于以下几个方面:
3.3.4.1、反编译资源文件
Apktool可以将apk文件中的资源文件(如XML布局文件、图像资源、字符串资源等)反编译为可读和可编辑的源文件格式。开发者可以通过查看和修改这些资源文件,找出冗余或无效资源,进而优化资源结构。
3.3.4.2、重构资源结构
开发者可以使用Apktool将apk中的资源进行整理和归类,删除不再需要的旧资源,统一相似资源,减少资源的重复性,从而减小apk的体积。
3.3.4.3、资源优化
图像资源优化:反编译出apk中的图片资源后,开发者可以使用图像处理工具对其压缩、转换格式(如转为WebP格式)或者裁剪优化,以减少图片资源占用的空间。
文本资源优化:检查并清理无用的字符串资源,尽量合并相似文本,减少资源表的大小。
3.4、使用增量更新
增量更新允许仅上传应用变更的部分,而不是整个APK文件。这样可以大大减少用户下载的数据量,提高更新速度。
3.5、按需加载资源
将资源分割成多个模块,按需加载所需的模块和资源,避免加载不必要的内容。即插件化,可以使用shadow框架。