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ò)程的圖片
參考:
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