最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

eb6d235ec553b953be47babcf3c79214.gif

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

一、 APK 組成解析

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

373c7fa912fa93d601a2bee46c76ae2d.jpg

APK 主要由五個(gè)部分組成,分別是:

  • 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 資源文件)的絕對(duì)大小和相對(duì)大小
  • 了解 DEX 文件的組成
  • 快速查看 APK 中文件(如 AndroidManifest.xml)的最終版本
  • 對(duì)兩個(gè) APK 進(jìn)行并排比較

17ea071ebbfe2d53570e88ff4f28ba76.jpg

32b7dc60ca5a947d729733c3149aa1c8.jpg

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

d2879d43ba14e877bcbd96418f5fcb02.jpg

bd3279cc4853ce9876ff287d19573e5e.jpg

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

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

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

4ae1ce91df4fdc74510ff8cc805e0c95.jpg

Android 有 64K 引用限制,當(dāng) type_ids、method_ids 或者 field_ids 超過 65536(64 * 1024)的時(shí)候,需要進(jìn)行 dex 分包,為了 Dex 的數(shù)量盡可能少,我們需要盡量實(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)建的時(shí)候,會(huì)發(fā)現(xiàn)其實(shí)是運(yùn)行了一連串的 Task,也就是說其實(shí)是這些 task 的配合,最終構(gòu)建出我們的 APK 的。

f7effceb22288a5f0bc954d9b2f21079.jpg

2.1 源碼引入

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

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 文件的生成為例,來梳理下如何查看某個(gè) task 的代碼邏輯。

e00bdb38830dbbc72bfabf6040247256.jpg

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

c3d54f1c5e87e629dd6851b62272d237.jpg

e4274c4ca18605c2cbe68f64718fbf82.jpg

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

df07f7f471b6ece6c98a1e12b9052de4.jpg

7a1ba666a1140804ce039a0a0364a2c7.jpg

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

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

a377eee7e3d8968efb8d4f609aed5ad3.jpg

222d9ed225de75f9c46600e5ab253fc8.jpg

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

44cbf4df08724a4f3247cc0fe276ea86.jpg

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

92871bad7d2fc9268769a14710a1f17e.jpg

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

最后我們通過命令行來手動(dòng)打包一個(gè)可執(zhí)行的 APK,能讓我們對(duì) 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

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

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

歡迎點(diǎn)贊

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

相關(guān)文章

  • Android開發(fā)使用Handler實(shí)現(xiàn)圖片輪播功能示例

    Android開發(fā)使用Handler實(shí)現(xiàn)圖片輪播功能示例

    這篇文章主要介紹了Android開發(fā)使用Handler實(shí)現(xiàn)圖片輪播功能,涉及Android基于Handler操作圖片的相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2017-09-09
  • Android Studio preview 不固定及常見問題的解決辦法

    Android Studio preview 不固定及常見問題的解決辦法

    preview 可以幫助您預(yù)覽您的布局文件將如何在用戶的設(shè)備上呈現(xiàn)。這篇文章主要介紹了Android Studio preview 不固定及常見問題的解決辦法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android源碼解析之截屏事件流程

    Android源碼解析之截屏事件流程

    這篇文章我們主要講一下Android系統(tǒng)中的截屏事件處理流程。用過android系統(tǒng)手機(jī)的同學(xué)應(yīng)該都知道,一般的android手機(jī)按下音量減少鍵和電源按鍵就會(huì)觸發(fā)截屏事件.
    2018-05-05
  • 如何使用SurfaceView實(shí)現(xiàn)魚兒游動(dòng)動(dòng)畫

    如何使用SurfaceView實(shí)現(xiàn)魚兒游動(dòng)動(dòng)畫

    這篇文章主要教大家如何使用SurfaceView實(shí)現(xiàn)魚兒游動(dòng)動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android 自定義view和屬性動(dòng)畫實(shí)現(xiàn)充電進(jìn)度條效果

    Android 自定義view和屬性動(dòng)畫實(shí)現(xiàn)充電進(jìn)度條效果

    近期項(xiàng)目中需要使用到一種類似手機(jī)電池充電進(jìn)度的動(dòng)畫效果,以前沒學(xué)屬性動(dòng)畫的時(shí)候,是用圖片+定時(shí)器的方式來完成的,下面給大家分享android自定義view和屬性動(dòng)畫實(shí)現(xiàn)充電進(jìn)度條
    2016-12-12
  • Android NotificationManager簡單使用詳解

    Android NotificationManager簡單使用詳解

    這篇文章主要為大家詳細(xì)介紹了Android NotificationManager的簡單使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Android Room的使用詳解

    Android Room的使用詳解

    這篇文章主要介紹了Android Room的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下
    2021-04-04
  • Android Handler機(jī)制詳解原理

    Android Handler機(jī)制詳解原理

    Handler主要用于異步消息的處理:當(dāng)發(fā)出一個(gè)消息之后,首先進(jìn)入一個(gè)消息隊(duì)列,發(fā)送消息的函數(shù)即刻返回,而另外一個(gè)部分在消息隊(duì)列中逐一將消息取出,然后對(duì)消息進(jìn)行處理,也就是發(fā)送消息和接收消息不是同步的處理。 這種機(jī)制通常用來處理相對(duì)耗時(shí)比較長的操作
    2021-11-11
  • Android新浪微博下拉刷新(最新消息顯示在最上面)

    Android新浪微博下拉刷新(最新消息顯示在最上面)

    查看最新消息要用到類似新浪微博下拉刷新,想必這個(gè)功能很多的朋友都會(huì)使用吧,下面與大家分享下具體的實(shí)現(xiàn)方法,感興趣的朋友可以參考下哈
    2013-05-05
  • Android 懸浮窗權(quán)限各機(jī)型各系統(tǒng)適配大全(總結(jié))

    Android 懸浮窗權(quán)限各機(jī)型各系統(tǒng)適配大全(總結(jié))

    這篇文章主要介紹了Android 懸浮窗權(quán)限各機(jī)型各系統(tǒng)適配大全(總結(jié)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論

偏关县| 旺苍县| 渭南市| 海兴县| 惠东县| 弥渡县| 门源| 娄烦县| 西藏| 富宁县| 日土县| 吴旗县| 水城县| 东阳市| 康马县| 泸溪县| 孙吴县| 三河市| 瑞金市| 天祝| 宁明县| 五台县| 丰都县| 曲沃县| 吉安市| 修文县| 昔阳县| 炉霍县| 饶河县| 襄城县| 纳雍县| 宕昌县| 鄄城县| 双辽市| 宜都市| 青川县| 刚察县| 山东省| 云霄县| 互助| 高邑县|