App不但要求功能完善,其他方面也得综合考虑,比如APK安装包的文件大小就是很重要的因素。具备同样功能的两个安装包,一个很大很占用空间,另一个较小不怎么占空间,用户的选择结果自然不言而喻。如何减少打包后的APK文件大小,也就是所谓的APK瘦身,这涉及到很多技术手段,最常用的主要有四块:去除冗余功能、精简无用资源、减少图片大小、过滤无用的so文件,分别介绍如下:
一、去除冗余功能
每当开发者创建新的Android项目,打开模块的AndroidManifest.xml,看到默认的application节点是下面这样的:
代码语言:javascript复制 <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
注意application节点有两个属性allowBackup和supportsRtl,且都被设为true,它俩到底是干什么用的呢? 首先看allowBackup,该属性若设置true,则允许用户备份APK安装包和应用数据,以便在刷机或者数据丢失后恢复应用。这里其实隐含着高危漏洞,因为备份后的应用数据可能被人复制到其他设备,如此一来用户的隐私就会泄露出去,什么账号密码、聊天记录均可遭窃。所以还是赶紧关闭这个鸡肋功能,把allowBackup属性值由默认的true改为false。 然后看supportsRtl,该属性名称当中的Rtl为“Right-to-Left”(从右到左)的缩写,像中东的阿拉伯语、希伯来文等从右到左书写,supportsRtl属性为true时表示支持这种从右向左的文字系统。可是常用的中文、英文等等都是从左往右书写,根本用不着从右到左的倒排功能,因此若无特殊情况可把supportsRtl属性值由默认的true改为false。 关闭备份与倒排功能之后,application节点变成了下面这副模样:
代码语言:javascript复制 <application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="false"
android:theme="@style/AppTheme">
二、精简无用资源
同样打开新项目的build.gradle,发现buildTypes节点是下面这样的:
代码语言:javascript复制 buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
可见有个minifyEnabled属性,默认值为false,该属性的字面意思为是否启用最小化,如果将它设为true,则Android Studio在打包APK时会进行以下代码处理: 1、压缩代码,移除各种无用的实体,包括类、接口、方法、属性、临时变量等等; 2、混淆代码,把类名、属性名、方法名、实例名、变量名替换为简短且无意义的名称,例如Student类的名称可能改为a,方法getName的名称可能改为b等等; App的Java代码经过压缩和混淆之后,打包生成的APK文件会随之变小。除了代码之外,应用项目还包括各种资源文件,若想移除无用的资源文件(包括xml布局和图片),就要引入新属性shrinkResources,并将该属性值设为true,这样Android Studio在打包APK时便会自动移除无用的资源文件。同时开启代码压缩和资源压缩的buildTypes节点配置示例如下:
代码语言:javascript复制 buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
三、减少图片大小
由于手机屏幕的尺寸有限,原始质量的高清图片与有损压缩后的图片在视觉上没有什么差别,因此适当压缩图片质量也是减小APK体积的一个重要途径。App传统的资源图片主要有jpg和png两种格式,对于jpg图片来说,利用看图软件ACDSee即可快速压缩图片大小,先使用ACDSee打开jpg文件,然后依次选择菜单“文件”→“另存为”,弹出如下图所示的保存窗口。
单击保存窗口右下角的选项按钮,弹出如下图所示的JPEG选项窗口,把窗口上方“图像质量”区域的拖动条往左拖到60处,表示有损压缩保持60%的图像质量。单击选项窗口下方的确定按钮,回到前一步骤的文件保存窗口,单击窗口右侧的保存按钮,完成jpg图片的压缩操作。
对于png图片来说,利用PhotoShop即可快速压缩图片大小,先使用PhotoShop打开png、文件,然后依次选择菜单“文件”→“存储为Web所用格式”,弹出如下图所示的保存窗口。
单击窗口右上角的预设下拉框,并选中最后一项“PNG-8”,再单击窗口下方的储存按钮,完成png图片的压缩操作。
四、过滤无用的so文件
有的第三方库为了兼容不同CPU,提供了多种指令架构的so文件,例如:ARM架构的armeabi-v7a(32位)和arm64-v8a(64位)、英特尔架构的x86(32位)和x86_64(64位)、MIPS架构的mips(32位)和mips64(64位)等等。其中ARM架构主要用于智能手机,X86架构主要用于个人电脑,MIPS架构主要用于路由器和机顶盒。之所以提供x86架构的so文件,是为了能够在电脑的模拟器上运行App,开发阶段当然无所谓安装包大小,正式发布就得考虑给APK瘦身,因此正式版本的安装包建议移除非ARM架构的so文件。此时需要修改模块的build.gradle,在release节点下添加so文件的过滤规则,详细的过滤配置如下所示:
代码语言:javascript复制 buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// 过滤第三方库里面多余的so文件,例如x86、x86_64这些用于个人电脑的英特尔指令集
ndk {
abiFilters "arm64-v8a", "armeabi-v7a" // 保留这两种指令架构的so文件
}
}
}
添加so过滤配置后再导出安装包,重新生成的APK文件大小足足比原来减了好几M,可见瘦身成功。
点此查看Android开发笔记的完整目录