Apk 全面瘦身详解
Posted xyTianZhao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apk 全面瘦身详解相关的知识,希望对你有一定的参考价值。
Apk 全面瘦身详解
做 android 开发的都有经历过,项目的体积大小随着开发时间增长,包体积也会随之增长。
想想一个经历过5-6年的项目,如果不做包体积方面的控制和优化,最起码现在得有百兆了,还是一个简单的应用。
随着 apk 的体积增大,相应的弊端也就暴露出来了,这也就是我们为什么要进行 apk 瘦身的原因
- 安装包过大,导致很多用户不愿更新和下载
- 安装包过大,导致新用户不愿下载
- 安装包过大,流量使用增多,无端增加了许多边际成本
所以这里我们来看看对于 apk 包体积优化都可以从哪些方面入手。
Apk 包结构分析
首先我们来分析一个 apk 的包,看看在 apk 中都有哪些东西。直接将相应的 apk 文件拖到 AndroidStudio 中即可看到
可以看到 AS 替我们将 apk 中的文件,已经按照文件大小从上到下罗列出来了。来看一下 apk 中各个文件、文件夹都代表什么意思,存放那些资源
属性名 | 描述 |
---|---|
lib/ | 存放so文件,有armeabi, armeabi-v7a, arm64-v8a,x86. x86-64,mips,一般只需要支持armabi与x86的架构即可 |
res/ | 存放编译后的资源文件,例如: drawable, layout等等 |
assets/ | 应用程序的资源,应用程序可以使用AssetManager来检索该资源 |
MATE—INF/ | 该文件夹一般存放于已经签名的APK中,它包含了APK中所有文件的签名摘要等信息 |
class(n).dex | classes文件是Java Class, 被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式 |
resources.arsc | 编译后的二进制资源文件 |
AndroidManifest.xml | Android的清单文件,格式为AXML,用于描述应用程序的名称、版本、所需权限、注册的四大组件 |
我们在优化的时候,可以从上往下,按照 AS 给我们罗列的顺序,毕竟大文件优化起来效果最好。
当然这种方式有一种无序性,容易忽略一些东西。下面我们就根据一定的顺序对 apk 大小进行优化。
优化方式
图片资源优化
开发过程中避免不了要使用图片资源,我们常见的图片资源有以下几类,矢量图片、WebP、png、jpg。以上排序有优先使用顺序
矢量图片 SVG
Android 自带了许多矢量图,这种资源我们只需要放置一份就可以了。
我们来看看通过 AS 创建矢量图:
优点:只需要放置一份,不用各个分辨率都创建
缺点:图片绘制时间长,设计制作复杂度高
WebP
WebP 格式我们也可以通过 AS 将相应的图片进行转换
最后这张效果就可以看出。原图和转换后的图肉眼基本看不出差别,但是大小却只有原大小的25%。压缩率还是很高的。
优点:体积更小
缺点:4.2.1+才支持透明度
这里附上 转换 WebP 的官方工具
png、jpg
png 和 jpg 格式是我们经常使用的,无甚多说。不过这里提供一个可以压缩的站点:tinypng
其他图片优化
- 纯色图片可以用代码实现
- 减少图片资源放置份数
一般只需要放置 xhdpi、xxhdpi就可以了 - 能用代码实现的图片,尽量采用代码实现
比如:圆形图片、环形图片、渐变等都可以采用代码实现
资源压缩
开启资源压缩和无用资源的剔除
android
buildTypes
release
//开启混淆
shrinkResourses true
//开启了代码压缩后,资源压缩才会生效
minifyEnabled true
//开启代码混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
也可以使用微信开源的资源压缩,可以对资源进一步压缩,具体使用方法,这里不多说,可以参考微信开源官网:AndResGuard
冗余代码优化
随着开发时间的加长,重复代码越来越多。产生冗余代码无非以下两个原因
- 写代码使用四键大法好:Ctrl+c、Ctrl+V
- 对项目不熟悉,重复造轮子
这个可以使用 AS 自带的 Lint 检测工具,根据检测出来的结果进行相应的优化
其他优化
压缩存储文件
在我们的 Assets 文件中存放的文件都不会进行压缩,会将文件原封不动的打入 apk 文件中。
我们可以将 Assets 中的相应文件使用 7zip 进行压缩,然后通过代码在进行解压缩到相应的目录进行使用。这样也可以节省相应的空间。
其他资源优化
语言资源优化
在 build 配置中配置 resConfig 指定需要的语言类型
defaultConfig
resConfig "zh","en"
xml 中定义的重复 color、string 资源
- 过滤重复的 string 资源
- 定义唯一的 color 名
减少 Enum 的使用
- 每减少一个 Enum 文件,可以减少 1k 左右的大小
- 采用常量进行定义
移除无用的依赖库
开发中不可避免使用第三方 SDK,而第三方的 SDK 又依赖了其他相关的 SDK,这样就会导致有些无用的库会被打进 apk 中
我们可以从以下几个方面进行优化:
- 剔除不在使用的库
- 优化过时的库
- 仅仅提取使用的代码
- 选用更小的外部库
so 库优化
lib 目录下的相关 so 库其实占了很大一部分,这里的优化有如下两个方式
-
指定 abi
Gradle 中指定相应的 abiFilterndk abiFilters 'armeabi', 'arm64-v8a', 'armeabi-v7a'
-
相关 so 库动态下发
其实有的 so 库我们可以在程序打开后从服务端进行下载,然后动态进行加载使用。当然,这种方式只能下发延迟使用的相关 so 库。
这里动态下发需要考虑的东西比较多,比如下载失败怎么办,有什么兜底逻辑。还有安全问题,怎么保证下载的 so 库没有被篡改等
以上是关于Apk 全面瘦身详解的主要内容,如果未能解决你的问题,请参考以下文章