欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一款A(yù)ndroid APK的結(jié)構(gòu)構(gòu)成解析

 更新時間:2021年10月06日 11:17:20   作者:騰訊技術(shù)工程  
本篇文章介紹了我在學(xué)習(xí)過程中對于Android 程序的理解總結(jié),刨析了apk的組成與產(chǎn)生過程,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下

eb6d235ec553b953be47babcf3c79214.gif

作者:hockeyli,騰訊 PCG 客戶端開發(fā)工程師

一、 APK 組成解析

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

373c7fa912fa93d601a2bee46c76ae2d.jpg

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)行并排比較

17ea071ebbfe2d53570e88ff4f28ba76.jpg

32b7dc60ca5a947d729733c3149aa1c8.jpg

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

d2879d43ba14e877bcbd96418f5fcb02.jpg

bd3279cc4853ce9876ff287d19573e5e.jpg

1.2 Dex 知識點拓展

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

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

4ae1ce91df4fdc74510ff8cc805e0c95.jpg

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

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

fcbd12157381ce3d4fce1f805d3f458a.jpg

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

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

f7effceb22288a5f0bc954d9b2f21079.jpg

2.1 源碼引入

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

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

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

2.2 BuildConfig Task 詳解

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

e00bdb38830dbbc72bfabf6040247256.jpg

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

c3d54f1c5e87e629dd6851b62272d237.jpg

e4274c4ca18605c2cbe68f64718fbf82.jpg

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

df07f7f471b6ece6c98a1e12b9052de4.jpg

7a1ba666a1140804ce039a0a0364a2c7.jpg

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

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

a377eee7e3d8968efb8d4f609aed5ad3.jpg

222d9ed225de75f9c46600e5ab253fc8.jpg

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

44cbf4df08724a4f3247cc0fe276ea86.jpg

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

92871bad7d2fc9268769a14710a1f17e.jpg

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

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

ddaadfa687ef474d71fd94b48e89a5fd.jpg

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

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

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

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 文件:

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

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

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

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

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

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

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

歡迎點贊

到此這篇關(guān)于一款A(yù)ndroid APK的結(jié)構(gòu)構(gòu)成解析的文章就介紹到這了,更多相關(guān)Android apk 結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android中CountDownTimer類詳解

    Android中CountDownTimer類詳解

    本文詳細(xì)講解了Android中CountDownTimer類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Android 安全退出應(yīng)用程序的方法總結(jié)

    Android 安全退出應(yīng)用程序的方法總結(jié)

    這篇文章主要介紹了Android 安全退出應(yīng)用程序的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Android 自定義ProgressDialog進(jìn)度條對話框用法詳解

    Android 自定義ProgressDialog進(jìn)度條對話框用法詳解

    ProgressDialog為進(jìn)度對話框。android手機(jī)自帶的對話框顯得比較單一,我們可以通過ProgressDialog來自己定義對話框中將要顯示出什么東西
    2016-01-01
  • Kotlin協(xié)程的啟動方式介紹

    Kotlin協(xié)程的啟動方式介紹

    這篇文章我們來講協(xié)程的啟動,畢竟協(xié)程是一個很強(qiáng)大的設(shè)計模式,深入了解需要花很多的時間,我們先從簡單開始,其實學(xué)會了簡單的使用,基本已經(jīng)可以滿足我們平時的開發(fā)需要了,話不多說,開始
    2022-09-09
  • Android中獲取電池電量實例代碼

    Android中獲取電池電量實例代碼

    顯示當(dāng)前電池電量在特殊的需求下還是蠻有用的,本文寫了一個可以實現(xiàn)簡單的功能,感興趣的朋友可以參考下哈
    2013-06-06
  • Android雙擊返回鍵退出程序的實現(xiàn)方法

    Android雙擊返回鍵退出程序的實現(xiàn)方法

    這篇文章主要介紹了Android雙擊返回鍵退出程序的實現(xiàn)方法,是Android程序開發(fā)中非常具有實用價值的重要技巧,需要的朋友可以參考下
    2014-09-09
  • 利用Kotlin的協(xié)程實現(xiàn)簡單的異步加載詳解

    利用Kotlin的協(xié)程實現(xiàn)簡單的異步加載詳解

    這篇文章主要給大家介紹了關(guān)于利用Kotlin的協(xié)程實現(xiàn)簡單的異步加載的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Android實現(xiàn)淘寶購物車

    Android實現(xiàn)淘寶購物車

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)淘寶購物車,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Presenting?Streams?in?Flutter小技巧

    Presenting?Streams?in?Flutter小技巧

    這篇文章主要為大家介紹了Presenting?Streams?in?Flutter小技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android面試筆記之常問的Context

    Android面試筆記之常問的Context

    Android技術(shù)面試確實常常被問到Context,大概問題就是說說你對Context的理解吧,當(dāng)時腦袋里浮現(xiàn)了是原來看到的文章片段亂說一通,這樣還是不行的。平時還是多積累知識,深刻理解Context,在項目開發(fā)過程中也能避免一些陷入坑中。下面就來看看個人的一些總結(jié)吧。
    2016-12-12

最新評論