[TOC]
## apk組成
apk包含應用所有所需資源的 zip 包,它包含了如下所示的幾個組成部分:

## 圖片資源
對安裝包內所有PNG圖片進行二次無損壓縮,列出大小可被進一步壓縮的文件及壓縮比例。 注:壓縮流程是先使用PngCrush工具優化圖片,再使用OptiPNG進行無損壓縮。 目前是先用pngcrush進行壓縮,然后再用optipng進一步壓縮 pngcrush工具鏈接:https://pmt.sourceforge.io/pngcrush/,壓縮命令:"pngcrush source dst" optipng工具鏈接:http://optipng.sourceforge.net/,壓縮命令:"optipng -out dst src"
## dex優化
在 AGP 的構建過程中,Java 或 Kotlin 源代碼在經過編譯之后會生成 Class 字節碼文件,在這個階段 AGP 提供了 Transform 來做字節碼的處理,我們非常熟悉的 Proguard 就是在這個階段工作的,之后 Class 文件經由 dexBuilder 生成一堆較小的 DEX 文件,再經由 mergeDex 合并成最終的 DEX 文件,然后打入 APK 中。具體過程如下圖所示:

因此,我們針對 DEX 文件的優化時機可以從分別從三個階段切入,分別是.kt 或.java 源文件、class 文件、DEX 文件:
* 在源文件進行處理也就是手動改造代碼,這種方式對程序設計本身有侵入,并且有較強的局限性;
* 在 class 字節碼階段對開發者無感知,而且基本上能完成大多數的優化,但對于像跨 DEX 引用優化這樣涉及 DEX 格式本身的優化無法完成;
* 在 DEX 文件階段進行優化是最理想的,在這個階段我們除了能對 DEX 字節碼本身進行優化,也可對 DEX 文件格式進行操作。
優化的手段總體上來說也就是冗余去除、內容精簡、格式優化等方式。
由于早期抖音 class 字節碼修改工具建設比較成熟,我們很多包體積的優化都是通過修改 class 字節碼完成的,隨著優化的深入,后期也有很多優化是在 DEX 文件階段處理的。關于 DEX 階段相關的優化我們后續會有相關文章介紹,這里主要介紹 Class 字節碼階段進行的相關優化,主要分為兩大類:
* 單純去除無用的代碼指令,包括**去除冗余賦值,無副作用代碼刪除**等
* 除了能減少代碼指令數量外,同時減少方法和字段的數量,從而有效減少 DEX 的數量。我們知道 DEX 中引用方法數、引用字段數等不能超過 65535,超過之后就需要新開一個 DEX 文件,因此減少 DEX 中方法數、字段數可以減少 DEX 文件數量,像**短方法內聯、常量字段消除、R 常量內聯**就屬于這類優化。
## 動態庫優化
在一些需要安全高性能的常見,應用中需要采用native來實現。android平臺提供了適配各種cpu架構的可能,包括x86 arm mips等,包活arm也有v7 v8等。針對不同cpu我們可以選擇打不同包,gradle腳本中通過api也可以限制。或者損失一些性能,只采用arm最低版本也是可以兼容的。對于某些不常用功能,我們也能用動態加載,運行時再下載so到本地。
## 參考資料
[抖音 Android 包體積優化探索:從 Class 字節碼入手精簡 DEX 體積](https://juejin.cn/post/7052614577216815134)
- Android
- 四大組件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介紹
- MessageQueue詳細
- 啟動流程
- 系統啟動流程
- 應用啟動流程
- Activity啟動流程
- View
- view繪制
- view事件傳遞
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大數據
- Binder小結
- Android組件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 遷移與修復
- Sqlite內核
- Sqlite優化v2
- sqlite索引
- sqlite之wal
- sqlite之鎖機制
- 網絡
- 基礎
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP進化圖
- HTTP小結
- 實踐
- 網絡優化
- Json
- ProtoBuffer
- 斷點續傳
- 性能
- 卡頓
- 卡頓監控
- ANR
- ANR監控
- 內存
- 內存問題與優化
- 圖片內存優化
- 線下內存監控
- 線上內存監控
- 啟動優化
- 死鎖監控
- 崩潰監控
- 包體積優化
- UI渲染優化
- UI常規優化
- I/O監控
- 電量監控
- 第三方框架
- 網絡框架
- Volley
- Okhttp
- 網絡框架n問
- OkHttp原理N問
- 設計模式
- EventBus
- Rxjava
- 圖片
- ImageWoker
- Gilde的優化
- APT
- 依賴注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 協程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 運行期Java-hook技術
- 編譯期hook
- ASM
- Transform增量編譯
- 運行期Native-hook技術
- 熱修復
- 插件化
- AAB
- Shadow
- 虛擬機
- 其他
- UI自動化
- JavaParser
- Android Line
- 編譯
- 疑難雜癥
- Android11滑動異常
- 方案
- 工業化
- 模塊化
- 隱私合規
- 動態化
- 項目管理
- 業務啟動優化
- 業務架構設計
- 性能優化case
- 性能優化-排查思路
- 性能優化-現有方案
- 登錄
- 搜索
- C++
- NDK入門
- 跨平臺
- H5
- Flutter
- Flutter 性能優化
- 數據跨平臺