Apk編譯過程簡介:
當我們編譯App的時候,主要是通過gradle進行構建
我們先看看gradle怎么進行的Build進行打包的,主要分為以下步驟
分為很多Task,在gradle里面中,一個Task相當于一個任務
NO-SOURCE 是沒有發現指定文件。也就相當于未執行。
Task :demoApp:preBuild UP-TO-DATE
(準備構建,主要是檢測當前環境信息)
Task :demoApp:preReleaseBuild UP-TO-DATE
(你要Build的版本,比如Release,Debug之類的)
Task :demoApp:compileReleaseAidl NO-SOURCE
(Aidl是安卓跨進程很重要的通訊方式,因為我的App是 demo所以沒有創建Aidl文件) Task :demoApp:compileReleaseRenderscript NO-SOURCE
(Renderscript 是渲染腳本的意思,主要構建一些U3d之類的游戲包,才會進行構建) Task :demoApp:checkReleaseManifest UP-TO-DATE
(主要是檢測xml文件,判斷是否存在語法錯誤或者不支持的xml條目之類的)
Task :demoApp:generateReleaseBuildConfig UP-TO-DATE
(主要是生成BuildConfig文件這個是每個App 在編譯過程中的生產的必備文件,主要記錄了一些在gradle中配置的變量信息,比如版本號或者版本名之類的)
Task :demoApp:javaPreCompileRelease UP-TO-DATE
(Java編譯前準備工作)
(下面這幾部主要是構建資源文件相關,包括打包一些資源文件,生成資源文件值,編譯xml文件)
//你要構建的App列表
Task :demoApp:mainApkListPersistenceRelease UP-TO-DATE
//構建資源文件對應的Value一些值,因為安卓每個id都是一個生成的一個隨機的16進制數值
Task :demoApp:generateReleaseResValues UP-TO-DATE
//這個是構建資源文件的id和value
Task :demoApp:generateReleaseResources UP-TO-DATE
//創建屏幕大小的那些
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
//產生build/intermediates/compileandruntimenotnamespacedrclass_jar/release/R.jar文件
Task :demoApp:processReleaseResources
核心編譯過程
//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
主要分為七步
下面具體分析構建流,分為七步(其中編譯1-4、打包5-7):
1、使用aapt工具,編譯res/文件,生成編譯后的二進制資源文件(.ap_文件)、R.java文件。(目前新版使用aapt2工具,R.java也替換成了R.jar)
2、使用aidl工具,根據aidl文件生成對應的Java接口文件
3、使用Java Compiler工具,Java Compiler(俗稱javac)將R.java、項目中的代碼、Aidl接口文件編譯成.class文件。
4、使用dex工具,將上一步產生的.class文件和第三方依賴中的.class編譯成.dex文件。(目前新版使用d8工具)
5、使用apkbuilder工具,將編譯后的資源(.ap_文件)、dex文件及其他資源文件(例如:so文件),壓縮成一個.apk文件。
6、使用Jarsigner工具,讀取簽名文件,對上一步中產生的apk文件進行簽名,生成一個已簽名的apk文件。
7、使用zipalign工具,對已簽名的apk文件進行體積優化(只有v1簽名才有這一步,v2簽名的apk會在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構建過程的圖片
參考:
https://zhuanlan.zhihu.com/p/104534757
https://mp.weixin.qq.com/s/W-pm9nV_UaSWS2FPJdgbog
安卓逆向百級教程+全網最新js逆向視頻+永久小蜜圈+永久售后群=1299
視頻下載網盤
?http://nas.alienhe.cn:5008/home.html?
下載視頻賬號密碼:
賬號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