Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 157e298

Browse files
committed
Update 包体积优化.md
1 parent c91a07d commit 157e298

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

‎blogs/Android/性能优化/包体积优化.md

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@
1313

1414
#### 前言
1515

16-
现在 WIFI 很普遍,流量也很便宜了,优化包体积还有那么重要嘛?
17-
18-
首先能想到的就是较小的包体积能够提高下载转化率,用户更愿意去下载,除此之外包体积与应用性能也是有挂钩的,表现在安装时间、运行内存、ROM 空间。
16+
包体积优化主要影响的下载转化率,除此之外包体积对应用性能也是有影响的,表现在安装时间、运行内存、ROM 空间。应用在首次安装启动时,会编译 odex 文件,对于低端机来说,过多的 dex 文件编译会严重影响冷启动时间(解决方案 [BoostMultiDex](https://github.com/bytedance/BoostMultiDex))。应用在运行时,Resource 资源、Library 以及 Dex 类加载这些都会占用不少的内存。安装包在解压后,占用 ROM 空间可能会翻倍,对 ROM 空间占用也会有一定压力。
1917

2018
#### 包组成
2119

@@ -33,11 +31,35 @@ APK 包含以下目录:
3331

3432
![](https://i.loli.net/2019/04/01/5ca15e3a3181e.png)
3533

36-
事实上,安装包无非就是 Dex、Resource、Assets、Library 以及签名信息这五部分,以下我们就针对这五部分进行优化。
34+
事实上,安装包无非就是 Dex、Resource、Assets、Library 以及 resources.arsc 这五部分,以下我们就针对这五部分进行优化。
3735

3836
#### 代码优化
3937

40-
对于大部分应用来说,Dex 都是包体积中的大头。对于这一块的优化,首先能想到的就混淆、压缩无用资源文件。
38+
对于大部分应用来说,Dex 都是包体积中的大头。对于这一块的优化,首先能想到的就是 ProGuard,AGP 3.4 之后,是使用 R8 了,它主要提供三部分功能:
39+
40+
1. 代码以及资源缩减
41+
42+
代码缩减也就是从应用及其库依赖项中移除不使用的类、方法和属性。资源缩减也就是移除不使用的资源。
43+
44+
2. 混淆
45+
46+
混淆处理的目的是通过缩短应用的类、方法和属性的名称来缩减应用的大小。
47+
48+
R8 不仅能混淆类和方法的名称,也能混淆资源的名称([AndResGuard](https://github.com/shwenzhang/AndResGuard))。
49+
50+
混淆之后,对于理解堆栈轨迹的难度将极大增加,此时可以使用 mapping 文件反混淆。
51+
52+
3. 优化
53+
54+
优化是指 R8 会检查并重写代码,以进一步减少应用的 dex 文件的大小。有几种常见的示例:
55+
56+
第一种是,如果 R8 能够判定 if/else 语句中的 else{} 代码块不会走到,那么 R8 可能会移除 else{} 分支的代码,也就是条件编译。
57+
58+
第二种是,如果你的代码只在一个位置调用某个方法,R8 可能会移除该方法并将其内嵌到调用点上,也就是方法内联。
59+
60+
第三种是,如果 R8 确定某个抽象类或接口有且只有一个实现时,那么它可能将这两个类组合在一起并移除抽象类。
61+
62+
可以从 app/build/outputs/mapping/release/usage.txt 查看被移除的类以及方法。
4163

4264
##### ProGuard
4365

@@ -171,6 +193,8 @@ ANDROID_SDK=/Users/omooo/Library/Android/sdk redex app-debug.apk -o app-resize.a
171193

172194
[https://developer.android.com/studio/build/shrink-code?hl=zh-cn](https://developer.android.com/studio/build/shrink-code?hl=zh-cn)
173195

196+
[https://www.guardsquare.com/manual/configuration/examples](https://www.guardsquare.com/manual/configuration/examples)
197+
174198
[包体积优化(上):如何减少安装包大小?](https://time.geekbang.org/column/article/81202)
175199

176200
[包体积优化(下):资源优化的进阶实践](https://time.geekbang.org/column/article/81483)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /