前言
削减运用程序安装包的巨细,不仅仅削减用户的网络数据流量还削减了下载等待的时刻。毋庸置疑,尽量削减程序安装包的巨细是十分有必要的。
一般来说,削减程序安装包的巨细有两条规矩:要么削减程序资源的巨细,要么就是削减程序的代码量。
一、运用APK构成
在开端优化技巧之前,先来看一下APK的组成结构。可以用 Android Studio 中的 APK Analyzer 翻开 APK 查看。
可以看到 APK 由以下主要部分组成:
文件/目录 | 描述 |
---|---|
lib/ | 寄存 so 文件,或许会有 armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips,大多数情况下只需求支撑 armabi 与 x86 的架构即可 |
res/ | 寄存编译后的资源文件,例如:drawable、layout 等等 |
assets/ | 运用程序的资源,运用程序可以运用 AssetManager 来检索该资源 |
META-INF/ | 该文件夹一般寄存于已经签名的 APK 中,它包含了 APK 中所有文件的签名摘要等信息 |
classes(n).dex | classes 文件是 Java Class,被 DEX 编译后可供 Dalvik/ART 虚拟机所理解的文件格局 |
resources.arsc | 编译后的二进制资源文件 |
AndroidManifest.xml | Android 的清单文件,格局为 AXML,用于描述运用程序的称号、版本、所需权限、注册的四大组件 |
二、优化代码
1.紧缩代码
经过敞开 ProGuard 来实现代码紧缩,可以在 build.gradle 文件相应的构建类型中添加 minifyEnabled true
。
翻开这个编译特点之后,程序在打包的时分就不会把没有引用到的代码编译进来,以此达到削减安装包巨细的意图。
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
'proguard-rules.pro'
}
}
}
除了 minifyEnabled
特点外,还有用于定义 ProGuard 规矩的 proguardFiles 特点:
-
getDefaultProguardFile(‘proguard-android.txt')
是从Android SDKtools/proguard/
文件夹获取默许 ProGuard 设置。 -
proguard-rules.pro
文件用于添加自定义 ProGuard 规矩。默许情况下,该文件坐落模块根目录(build.gradle 文件旁)。
2.削减 ENUM 的运用
官方主张:Remove Enumerations,每削减一个 ENUM 可以削减大约 1.0 到 1.4 KB巨细。
3.精简类库jar
有些引进到工程中的 jar 文件或许并不是专门针对移动端 App 而规划,最开端或许是运用在 Server 上的。运用这部分类库不仅额外添加包巨细,还添加了编译时刻。
依托 Proguard 或许无法彻底移除那些运用不到的方法,最佳的方式是运用一些更加轻量化,专门为移动 App 规划的 jar。
4.精简 so 资源
Android系 统目前支撑以下七种不同的 CPU 架构:x86、MIPS、ARMv8、MIPS64 和 x86_64。
每一个 CPU 架构对应一个 ABI:armeabi、armeabi_v7a、x86、mips、mips64、x86_64。
所有 x86、x86_64、armeabi_v7a、arm64_v8a 设备都支撑 armeabi 架构的 so 文件,x86 设备可以很好的运转 ARM 类型函数库,但并不保证 100% 不发生 Crash,特别是对旧设备。
一般运用彻底可以根据自己事务需求挑选运用 armeabi 或许 armeabi_v7a 一种支撑就行。
假定只支撑了 armeabi,如果有特殊要求(比方视频运用)需求用到部分 armeabi_v7a 的 so,可以经过改名放到 armeabi 文件夹中,根据手机实际情况挑选加载。
- 动态下发
比较大的 so 可以挑选动态下发的形式延迟加载,代码上需求加一些判断逻辑。
5.精简语言资源
大部分运用其实并不需求支撑几十种语言的国际化支撑。gradle支撑语言的配置,比方国内运用只支撑中文:
android {
defaultConfig {
resConfigs "zh"
}
}
6.安装包拆分
设想一下,一个 low dpi,API<14 的用户手机下载安装的 APK 里面却包含了大量 xxhdpi 的资源文件,对于这个用户来说,这个 APK 是存在很大的资源糟蹋。
Android 渠道供给了拆分 APK 的方法,它可以根据 API Level,屏幕巨细以及 GPU 版本的不同进行拆分,使得对应渠道的用户下载到最合适自己手机的安装包。
更多关于安装包拆分的信息,请查看 Configure APK Splits 与 Maintaining Multiple APKs。
三、优化资源文件
1.移除未运用的资源
在 build.gradle 文件中配置 shrinkResources
的特点,这个特点可以帮助移除那些在程序中运用不到的资源文件,帮助削减 App 的安装包巨细。
android {
buildTypes {
release {
shrinkResources true
}
}
}
有挑选性的供给对应分辨率的图片资源,体系会主动匹配最合适分辨率的图片并执行拉伸或许紧缩的处理。
2.紧缩图片
Android 打包本身会对 PNG 进行无损紧缩,Tinypng以尽量少的失真换来图片巨细的锐减,效果非常好,强烈推荐这个东西。
3.推荐运用矢量图 VectorDrawable
在符合条件的情况下,运用Vertor Drawable代替传统的PNG/JPEG图片,可以极大的削减图片资源的巨细。 一般针对不同 DPI 的手机都需求供给一套 PNG/JPEG 的图片,而如果运用 Vector Drawable 的话,只需求一个 XML 文件即可。 还有一点:尽量复用已经存在的资源图片,运用代码的方式对已有的资源进行复用。