Apk編譯流程

Apk編譯過(guò)程簡(jiǎn)介:

當(dāng)我們編譯App的時(shí)候,主要是通過(guò)gradle進(jìn)行構(gòu)建

我們先看看gradle怎么進(jìn)行的Build進(jìn)行打包的,主要分為以下步驟

分為很多Task,在gradle里面中,一個(gè)Task相當(dāng)于一個(gè)任務(wù)

NO-SOURCE 是沒(méi)有發(fā)現(xiàn)指定文件。也就相當(dāng)于未執(zhí)行。

Task :demoApp:preBuild UP-TO-DATE

(準(zhǔn)備構(gòu)建,主要是檢測(cè)當(dāng)前環(huán)境信息)

Task :demoApp:preReleaseBuild UP-TO-DATE

(你要Build的版本,比如Release,Debug之類的)

Task :demoApp:compileReleaseAidl NO-SOURCE

(Aidl是安卓跨進(jìn)程很重要的通訊方式,因?yàn)槲业腁pp是 demo所以沒(méi)有創(chuàng)建Aidl文件) Task :demoApp:compileReleaseRenderscript NO-SOURCE

(Renderscript 是渲染腳本的意思,主要構(gòu)建一些U3d之類的游戲包,才會(huì)進(jìn)行構(gòu)建) Task :demoApp:checkReleaseManifest UP-TO-DATE

(主要是檢測(cè)xml文件,判斷是否存在語(yǔ)法錯(cuò)誤或者不支持的xml條目之類的)

Task :demoApp:generateReleaseBuildConfig UP-TO-DATE

(主要是生成BuildConfig文件這個(gè)是每個(gè)App 在編譯過(guò)程中的生產(chǎn)的必備文件,主要記錄了一些在gradle中配置的變量信息,比如版本號(hào)或者版本名之類的)

Task :demoApp:javaPreCompileRelease UP-TO-DATE

(Java編譯前準(zhǔn)備工作)

(下面這幾部主要是構(gòu)建資源文件相關(guān),包括打包一些資源文件,生成資源文件值,編譯xml文件)

//你要構(gòu)建的App列表

Task :demoApp:mainApkListPersistenceRelease UP-TO-DATE

//構(gòu)建資源文件對(duì)應(yīng)的Value一些值,因?yàn)榘沧棵總€(gè)id都是一個(gè)生成的一個(gè)隨機(jī)的16進(jìn)制數(shù)值

Task :demoApp:generateReleaseResValues UP-TO-DATE

//這個(gè)是構(gòu)建資源文件的id和value

Task :demoApp:generateReleaseResources UP-TO-DATE

//創(chuàng)建屏幕大小的那些

Task :demoApp:createReleaseCompatibleScreenManifests UP-TO-DATE

//xml

Task :demoApp:processReleaseManifest

Task :demoApp:prepareLintJar UP-TO-DATE Task :demoApp:checkReleaseDuplicateClasses UP-TO-DATE Task :demoApp:mergeReleaseResources

//產(chǎn)生build/intermediates/compileandruntimenotnamespacedrclass_jar/release/R.jar文件

Task :demoApp:processReleaseResources

核心編譯過(guò)程

//javac將java編譯成Class文件

Task :demoApp:compileReleaseJavaWithJavac

//將資源文件編譯并生成resource.arsc文件,并放入.ap文件中(./app/build/intermediates/processedres/release/out/resources-release.ap_)

Task :demoApp:compileReleaseSources

Task :demoApp:lintVitalRelease

//嘗試吧class文件變成dex文件,使用的是javac工具

Task :demoApp:transformClassesWithDexBuilderForRelease

//取出dex文件

Task :demoApp:desugarReleaseFileDependencies UP-TO-DATE

//合并非res/的資源文件及assets文件

Task :demoApp:mergeReleaseShaders UP-TO-DATE Task :demoApp:compileReleaseShaders UP-TO-DATE

Task :demoApp:generateReleaseAssets UP-TO-DATE Task :demoApp:mergeReleaseAssets UP-TO-DATE Task :demoApp:processReleaseJavaRes NO-SOURCE

//簽名

Task :demoApp:validateSigningRelease UP-TO-DATE Task :demoApp:signingConfigWriterRelease UP-TO-DATE Task :demoApp:mergeReleaseJniLibFolders UP-TO-DATE Task :demoApp:mergeReleaseJavaResource UP-TO-DATE Task :demoApp:mergeReleaseNativeLibs UP-TO-DATE Task :demoApp:stripReleaseDebugSymbols UP-TO-DATE Task :demoApp:mergeExtDexRelease UP-TO-DATE

//合并Dex文件

Task :demoApp:mergeDexRelease Task :demoApp:packageRelease Task :demoApp:assembleRelease

主要分為七步

下面具體分析構(gòu)建流,分為七步(其中編譯1-4、打包5-7):

1、使用aapt工具,編譯res/文件,生成編譯后的二進(jìn)制資源文件(.ap_文件)、R.java文件。(目前新版使用aapt2工具,R.java也替換成了R.jar)

2、使用aidl工具,根據(jù)aidl文件生成對(duì)應(yīng)的Java接口文件

3、使用Java Compiler工具,Java Compiler(俗稱javac)將R.java、項(xiàng)目中的代碼、Aidl接口文件編譯成.class文件。

4、使用dex工具,將上一步產(chǎn)生的.class文件和第三方依賴中的.class編譯成.dex文件。(目前新版使用d8工具)

5、使用apkbuilder工具,將編譯后的資源(.ap_文件)、dex文件及其他資源文件(例如:so文件),壓縮成一個(gè).apk文件。

6、使用Jarsigner工具,讀取簽名文件,對(duì)上一步中產(chǎn)生的apk文件進(jìn)行簽名,生成一個(gè)已簽名的apk文件。

7、使用zipalign工具,對(duì)已簽名的apk文件進(jìn)行體積優(yōu)化(只有v1簽名才有這一步,v2簽名的apk會(huì)在zipalign后簽名被破壞)。

javac 工具使用如下

javac -d build -cp $ANDROID_HOME/platforms/android-21/android.jar com/*/.java</pre>

d8工具使用,新版本是用d8工具將class變成dex文件

d8 --output build/ --lib $ANDROID_HOME/platforms/android-21/android.jar build/com/example/application/*.class

先看一張官方給的 Dex構(gòu)建過(guò)程的圖片

Dex編譯過(guò)程

參考:

https://zhuanlan.zhihu.com/p/104534757

https://mp.weixin.qq.com/s/W-pm9nV_UaSWS2FPJdgbog


安卓逆向百級(jí)教程+全網(wǎng)最新js逆向視頻+永久小蜜圈+永久售后群=1299

視頻下載網(wǎng)盤
?http://nas.alienhe.cn:5008/home.html?
下載視頻賬號(hào)密碼:
賬號(hào)guest 密碼world

Js試看:
http://oss.alienhe.cn/JS%E9%80%86%E5%90%91%E5%85%A5%E9%97%A8-%E5%B8%A6%E6%B0%B4%E5%8D%B0.mp4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容