成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一款 APK 是怎么誕生的?

開發(fā) 開發(fā)工具
Android 有 64K 引用限制,當(dāng) type_ids、method_ids 或者 field_ids 超過 65536(64 * 1024)的時候,需要進(jìn)行 dex 分包,為了 Dex 的數(shù)量盡可能少,我們需要盡量實(shí)現(xiàn)「Dex 信息有效率」的提升。

[[426462]]

一、 APK 組成解析

在開始解析 Android 構(gòu)建流程之前,我們先來看下構(gòu)建的最終產(chǎn)物 APK 的整體組成:

APK 主要由五個部分組成,分別是:

  • Dex:.class 文件處理后的產(chǎn)物,Android 系統(tǒng)的可執(zhí)行文件
  • Resource:資源文件,主要包括 layout、drawable、animator,通過 R.XXX.id 引用
  • Assets:資源文件,通過 AssetManager 進(jìn)行加載
  • Library:so 庫存放目錄
  • META-INF:APK 簽名有關(guān)的信息

1.1 Apk 分析工具

工欲善其事,必先利其器,既然想分析 APK 必然少不了好用的工具。

① Android Studio 自帶的 APK 分析器

通過 APK 分析器,我們可以完成這些操作:

  • 查看 APK 中文件(如 DEX 和 Android 資源文件)的絕對大小和相對大小
  • 了解 DEX 文件的組成
  • 快速查看 APK 中文件(如 AndroidManifest.xml)的最終版本
  • 對兩個 APK 進(jìn)行并排比較

② ClassyShark 可以做為 AS 自帶 APK 分析器的補(bǔ)充,幫我們分析 dex 中的詳細(xì)數(shù)據(jù),以及查看 APK 中的總方法數(shù)以及各個模塊的方法數(shù)分布。

1.2 Dex 知識點(diǎn)拓展

當(dāng)我們在 Android 查看一個 APK 的時候,可以看到右上角有 Defined Methods 和 Referenced Methods,但大多數(shù)人可能不知道這兩者的區(qū)別,這里簡單說明下:

Defined Methods:在這個 Dex 中定義的方法;Referenced Methods:Defined Methods 以及 Defined Methods 引用到的方法。

Android 有 64K 引用限制,當(dāng) type_ids、method_ids 或者 field_ids 超過 65536(64 * 1024)的時候,需要進(jìn)行 dex 分包,為了 Dex 的數(shù)量盡可能少,我們需要盡量實(shí)現(xiàn)「Dex 信息有效率」的提升。

  1. Dex 信息有效率 = Defined Methods 數(shù)量 / Referenced Methods 數(shù)量 

二、 構(gòu)建源碼導(dǎo)讀

當(dāng)我們用 Android Studio 進(jìn)行安裝包構(gòu)建的時候,會發(fā)現(xiàn)其實(shí)是運(yùn)行了一連串的 Task,也就是說其實(shí)是這些 task 的配合,最終構(gòu)建出我們的 APK 的。

2.1 源碼引入

如果我們想更了解 Android 的構(gòu)建流程,對于相關(guān)的源碼肯定是要有所了解的。那我們?nèi)绾慰吹竭@些 Task 相關(guān)的源碼呢,我們知道 Android 是用 Gradle 進(jìn)行構(gòu)建的,也就意味著這些 task 其實(shí)都是放在 Gradle 中,我們想看 Gradle 中源碼的話,可以在 build.gradle 將 Gradle 進(jìn)行編譯。

  1. compileOnly "com.android.tools.build:gradle:3.0.1" 

編譯完之后,可以在 ApplicationTaskManager#createTasksForVariantScope 中找到創(chuàng)建這些 Task 相關(guān)的代碼,也就意味著順藤摸瓜找到這些 Task 的真正實(shí)現(xiàn)邏輯。

2.2 BuildConfig Task 詳解

這里以 BuildConfig 文件的生成為例,來梳理下如何查看某個 task 的代碼邏輯。

生成 BuildConfig 文件,是通過 ApplicationTaskManager 中通過 createBuildConfigTask 來創(chuàng)建對應(yīng)的 task。

順著代碼邏輯,我們找到最終真正實(shí)現(xiàn)這個邏輯的是:GenerateBuildConfig 這個 task,GenerateBuildConfig 是繼承自 BaseTask,這里有個小技巧是,Task 中真正的執(zhí)行邏輯都是在帶著 @TaskAction 注解的方法上的,所以我們能很快找到對應(yīng)的 generate() 方法。可以看到生成 BuildConfig 整體的邏輯還是比較簡單的,其實(shí)就是將 build.gradle 中自帶的屬性以及我們自定義的屬性進(jìn)行讀取,然后通過 JavaWriter 生成對應(yīng)的 BuildConfig 文件。

2.3 獲取所有 task 對應(yīng)的類名

看到上面的例子,可能有些人會拋出一個疑問就是那我們怎么確定構(gòu)建中執(zhí)行的 task 具體對應(yīng)哪個類呢,這里提供一個小技巧,其實(shí)我們可以在 taskGraph 構(gòu)建完成之后,將所有 task name 以及對應(yīng)的 class 進(jìn)行打印。例如在 build.gradle 中加入這個代碼之后,我們在運(yùn)行的時候,就會把 task 所對應(yīng)的類名也都一起打印出來。

三、構(gòu)建流程梳理

可以看到 Android 構(gòu)建中會涉及到多個工具,我們可以通過 open $ANDROID_HOME/build-tools 來查看相關(guān)的構(gòu)建工具。

四、手動構(gòu)建 APK

最后我們通過命令行來手動打包一個可執(zhí)行的 APK,能讓我們對 APK 構(gòu)建的理解更加深入。首先需要準(zhǔn)備下 代碼、資源文件、AndroidManifest 這些構(gòu)建 APK 的必要文件。

① 通過 aapt2 compile 將 res 資源編譯成 .flat 的二進(jìn)制文件:

  1. aapt2 compile -o build/res.zip --dir res 

② 通過 aapt2 link 將 .flat 和 AndroidManifest 進(jìn)行連接,轉(zhuǎn)化成不包含 dex 的 apk 和 R.java:

  1. aapt2 link build/res.zip -I $ANDROID_HOME/platforms/android-30/android.jar --java build --manifest AndroidManifest.xml -o build/app-debug.apk 

③ 通過 javac 將 Java 文件編譯成 .class 文件:

  1. javac -d build -cp $ANDROID_HOME/platforms/android-30/android.jar com/**/**/**/*.java 

④ 通過 d8 將 .class 文件轉(zhuǎn)化成 dex 文件:

  1. d8 --output build/ --lib $ANDROID_HOME/platforms/android-30/android.jar build/com/tencent/hockeyli/androidbuild/*.class 

⑤ 合并 dex ?件和資源?件:

  1. zip -j build/app-debug.apk build/classes.dex 

⑥ 對 apk 通過 apksigner 進(jìn)行簽名:

  1. apksigner sign -ks ~/.android/debug.keystore build/appdebug.apk 

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2015-08-26 16:05:31

2015-07-08 09:53:42

2013-01-23 10:02:35

2014-12-16 10:11:22

2024-08-16 08:31:05

2021-07-23 16:50:19

httpJava框架

2019-04-25 10:44:18

PHP開源庫C 語言

2019-08-30 14:30:11

2017-11-08 11:53:54

開源人工智能軟件

2020-06-30 15:38:17

戴爾

2015-08-10 11:41:00

SQL注入SQL注入工具Sqlmapi

2015-08-24 09:21:27

類型程序員

2020-07-06 10:29:21

Linux系統(tǒng)數(shù)據(jù)

2017-07-11 08:57:07

功能超融合架構(gòu)

2011-08-09 09:16:44

Eclipse

2022-02-25 14:57:33

harmonyOSjava心形動畫

2015-07-08 15:30:59

智慧存儲華為

2022-10-09 10:11:30

Python爬蟲神器

2015-12-07 16:18:06

2020-06-01 16:45:44

Linux終端Terminus
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 九九热免费看 | 成年人黄色一级片 | 久久se精品一区精品二区 | 午夜精品久久 | 亚洲国产精品人人爽夜夜爽 | 天堂一区二区三区 | 欧美日韩精品一区 | 免费精品久久久久久中文字幕 | 中文字幕亚洲区一区二 | 日韩一二区| 中文字幕丁香5月 | 国产精品久久久久久吹潮日韩动画 | av在线二区 | 一二三四在线视频观看社区 | 久久精品视频一区二区 | 国产成人精品午夜视频免费 | 老头搡老女人毛片视频在线看 | 国产欧美在线视频 | 亚洲一区| 亚洲3级| 成人av观看 | 欧美a区 | 精品视频在线观看 | 中国一级大毛片 | 国产yw851.c免费观看网站 | 久久国产福利 | 色播视频在线观看 | 成人欧美一区二区三区黑人孕妇 | 日韩一区二区黄色片 | 精品国产伦一区二区三区观看说明 | 欧美日韩一区二区三区视频 | 国产精品精品久久久 | 国产97人人超碰caoprom | 久久另类 | 国产精品自产拍在线观看蜜 | 亚洲精品视频在线观看视频 | 日韩中文在线视频 | 久久精品一区二区 | 国产精品久久久久一区二区三区 | 美女视频h | 欧美一区二区三区在线观看视频 |