Android應用程式(APK)的編譯打包過程

2021-02-15 架構師必備

現在很多人想對Android工程的編譯和打包進行自動化,比如建立每日構建系統、自動生成發布文件等等。這些都需要我們對Android工程的編譯和打包有一個深入的理解,至少要知道它的每一步都做了什麼,需要什麼環境和工具,輸入和輸出是什麼。那麼我們就來挖掘一下Android的編譯過程中的細節。

首先,我們假定你的系統(什麼系統都行,不限於Linux還是Windows系統,當然,我在這裡默認使用Linux系統來舉例子,但在 Windows中幾乎沒有什麼差別)已經安裝了JDK和Android SDK。再假定你的Android SDK的路徑是ANDROID_SDK_HOME,你想要編譯的Android OS版本是ANDROID_OS_VERSION(比如android-1.6、android-8、android-10等)。

我們重點關心的是(1)這個過程的輸入是什麼?(2)這個過程的輸出是什麼?(3)這個過程使用了什麼工具?至於使用什麼參數,可以自己去看對應命令的幫助文件,或者在網上搜索,這不是本文的重點。

步驟中提到的工具如下表:

名稱

功能介紹

在作業系統中的路徑

aapt

Android資源打包工具

${ANDROID_SDK_HOME}/platform-tools/appt

aidl

Android接口描述語言轉化為.java文件的工具

${ANDROID_SDK_HOME}/platform-tools/aidl

javac

Java Compiler

${JDK_HOME}/javac或/usr/bin/javac

dex

轉化.class文件為Davik VM能識別的.dex文件

${ANDROID_SDK_HOME}/platform-tools/dx

apkbuilder

生成apk包

${ANDROID_SDK_HOME}/tools/opkbuilder

jarsigner

.jar文件的籤名工具

${JDK_HOME}/jarsigner或/usr/bin/jarsigner

zipalign

字節碼對齊工具

${ANDROID_SDK_HOME}/tools/zipalign

第一步:打包資源文件,生成R.java文件
【輸入】Resource文件(就是工程中res中的文件)、Assets文件(相當於另外一種資源,這種資源Android系統並不像對res中的文件那樣優化它)、AndroidManifest.xml文件(包名就是從這裡讀取的,因為生成R.java文件需要包名)、Android基礎類庫(Android.jar文件)
【輸出】打包好的資源(一般在Android工程的bin目錄可以看到一個叫resources.ap_的文件就是它了)、R.java文件(在gen目錄中,大家應該很熟悉了)
【工具】aapt工具,它的路徑在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系統,按慣例路徑應該這樣寫:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。

第二步:處理AIDL文件,生成對應的.java文件(當然,有很多工程沒有用到AIDL,那這個過程就可以省了)
【輸入】源碼文件、aidl文件、framework.aidl文件
【輸出】對應的.java文件
【工具】aidl工具

第三步:編譯Java文件,生成對應的.class文件
【輸入】源碼文件(包括R.java和AIDL生成的.java文件)、庫文件(.jar文件)
【輸出】.class文件
【工具】javac工具

第四步:把.class文件轉化成Davik VM支持的.dex文件
【輸入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),庫文件(.jar文件)
【輸出】.dex文件
【工具】javac工具

第五步:打包生成未籤名的.apk文件
【輸入】打包後的資源文件、打包後類文件(.dex文件)、libs文件(包括.so文件,當然很多工程都沒有這樣的文件,如果你不使用C/C++開發的話)
【輸出】未籤名的.apk文件
【工具】apkbuilder工具

第六步:對未籤名.apk文件進行籤名
【輸入】未籤名的.apk文件
【輸出】籤名的.apk文件
【工具】jarsigner

第七步:對籤名後的.apk文件進行對齊處理(不進行對齊處理是不能發布到Google Market的)
【輸入】籤名後的.apk文件
【輸出】對齊後的.apk文件
【工具】zipalign工具

知道了這些細節之後,我們就可以實現很多我們想實現東西了,比如:自動化,我們可以使用某種腳本,像Windows下的批處理,linux下的Bash,Java下的Ant,Python、Perl這樣的腳本語言,甚至直接用Java、.net這們的強類型語言也是可以的。如果你真正弄懂了上面的步驟,了解了編譯打包過程的本質,你完全可以以你想要的任何方式實現它的自動化,這才是真正的「舉一反三,以不變應萬變」。再比如,對Android SDK的精簡,大家知道,現在Android SDK動轍幾百兆,我們完全可以應用上面的知識,只保留必要的工具,把SDK精簡到10M以下。當然,還可以做很多事情,前提是你真正弄懂了它。

APP架構師微信號:appjiagou(←長按複製)

APP架構師是一個數十萬開發者探討APP開發架構的公眾號,分享最有價值的乾貨文章,我們探討Android性能優化,Android內存洩露,動態化、插件化等最新的Android開發技術,還有IOS開發架構,高級開發知識,我們的願景是服務每個APP開發者,做一個有逼格的APP架構師!

長按下面二維碼,關注公眾號,回復「阿里」「騰訊」,有驚喜!



相關焦點

  • Android三方應用實現靜默安裝
    ="android.permission.DELETE_PACKAGES"/><uses-permission android:name="android.permission.INSTALL_PACKAGES"/>進行系統籤名將應用push到系統中,作為系統應用在PackageManager中的提供的接口如下:
  • Android逆向之旅---動態方式破解apk終極篇(如何破解加固apk)
    第二步:我們會使用apktool工具進行apk的反編譯,得到apk的AndroidManifest.xml和資源內容那麼這裡我們也分析完了該分析的內容,還是沒發現我們的入口Activity類,而且我們知道他肯定是放在本地的一個地方,因為需要解密動態加載,所以不可能是放在網上的,肯定是本地,所以這裡就有一些技巧了:當我們發現apk中主要的類都沒有了,肯定是apk被加固了,加固的源程序肯定是在本地,一般會有這麼幾個地方需要注意的:1、應用程式的asset目錄,我們知道這個目錄是不參與
  • Anbox:在 Linux 上運行 Android 應用程式的簡單方式 | Linux 中國
    每個應用程式將在一個單獨窗口打開,就像其它本地系統應用程式一樣,並且它可以顯示在啟動器中。如何在 Linux 中安裝 Anbox ?Anbox 也可作為 snap 軟體包安裝,請確保你已經在你的系統上啟用了 snap 支持。
  • Flutter打包發布
    Android打包和發布 1.1. 填寫應用配置1.1.1. 基本信息在之前講解應用程式的配置信息時,我們已經介紹過,這裡不再過多介紹1.1.2. 版本信息Flutter的版本信息在哪裡填寫呢?中進行如下配置<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.catefavor">    <uses-permission android:name="android.permission.INTERNET
  • App安全評估手冊-Android
    問題描述:若AndroidManifest.xml文件中Debuggable屬性值未設置,可以設置斷點來控制程序的執行流程,在應用程式運行時修改其行為。檢測方法:1.使用反編譯軟體GDA對apk進行反編譯。
  • Android逆向之旅---動態方式破解apk前奏篇(Eclipse動態調試smail源碼)
    第三步:回編譯apk並且進行籤名安裝java -jar apktool_2.0.0rc4.jar b -d out -o debug.apk還是使用apktool進行回編譯2、修改完成AndroidManifest.xml和添加waitForDebug之後,我們需要在使用apktool進行回編譯,回編譯之後得到的是一個沒有籤名的apk,我們還需要使用signapk.jar來進行籤名,籤名文件直接使用測試程序的籤名文件就可以,最後在進行安裝。
  • 關於Flutter打包,你需要知道的基礎配置和包體積優化策略?
    a(一)圖片和代碼優化1、處理圖片資源使用外部服務與其將圖像資產捆綁在應用程式內,不如將圖像託管在諸如 firebase 之類的外部服務上,並使用包cached_network_image 在應用程式內調用這些圖像。
  • 對 Android 未來的發展十分重要的技術 | App Bundles
    1.Split APKs:多apk 支持以下類型屏幕密度ABI,使用新的拆分機制,構建同一個應用程式的hdpi版本和mdpi版本,能夠共享很多的任務 (如 javac,dx,proguard)。此外,它會被認為是一個單一的variant,並且同一個測試程序將會被用來測試每個多APK。
  • Appium界面自動化測試(4)(Android/Java):詳解應用程式操作
    假設被測應用程式在E盤根目錄,在DesiredCapabilities對象中使用以下方式即可安裝應用程式:desiredCapabilities.setCapability("app", "E:\\filename.apk");通過這種方式安裝應用程式時,DesiredCapabilities對象不必再提供
  • Flutter完整開發實戰詳解(十九、 Android 和 iOS 打包提交審核指南)
    一、Android 打包和審核流程1、打包事實上 Androd 的打包和審核流程都相對簡單,打包 apk 只需要通過如下命令行就可以完成:flutter build apk --target-platform android-arm64flutter build apk --target-platform
  • DASCTF八月挑戰賽 Android 逆向 apkrev
    下載後解壓可得一個名為 apkrev 的 apk 文件,扔到模擬器裡運行。在 MainActivity 上右鍵反編譯。動態調試1、使用雷電模擬器,首先確定模擬器的安卓版本,安裝 device info hw.apk ( https://www.cr173.com/soft/845060.html )查看相關信息:
  • 技術分享: Android模擬還原實戰應用
    對於應用程式的開發者,模擬器提供了很多開發和測試時的便利。無論在Windows下還是Linux下,Android模擬器都可以順利運行,並且Google提供了Eclipse插件,可將模擬器集成到Eclipse的IDE環境(最新的Android Studio也集成了模擬器)。當然,你也可以從命令行啟動Android模擬器。
  • 基於Android和iOS行動應用程式的Appium實用教程
    以下有三種移動應用類型:本地型:Native app是基於智慧型手機本地作業系統例如Ios、Android或Windows並使用源生式編寫運行是的第三方運行程序,需藉助特定的平臺和設備運作。混合型:混合模式移動應用是指介於web app、native app這兩者之間的app,兼具Native App良好用戶交互體驗的優勢和Web App跨平臺開發的優勢。移動型:移動Web app是基於Web的系統和應用,是需使用移動瀏覽器訪問的應用程式。
  • 【移動安全】程序代碼安全之安全測試要求
    每個apk文件中的代碼視為一個APP。APP打包過程如下圖所示。由於Java字節碼的特殊性,它非常容易被反編譯。App的原始碼經過代碼混淆後打包生成的apk文件會增加攻擊者反編譯的難度。因為攻擊者利用反編譯工具對混淆後的apk文件進行反編譯後獲得的代碼文件仍然是經過代碼混淆的,難於閱讀和分析理解,從而增加了逆向破解App的難度。
  • IT之家學院 | 安卓的APK安裝包裡都有啥?
    ,就像Windows系統的appx和塞班系統的sis一樣,安卓系統的應用程式也有其專屬的安裝包格式——apk。應用程式的安裝包在打包的時候,每個文件都會經過校驗計算,計算結果就存放在/META-INF裡,我們可以直接使用文本編輯器來打開後綴名為MF和SF的記錄這些文件校驗計算結果的文件:
  • Android真機或模擬器激活Xposed框架的方法
    >詳細步驟(1).採用kingroot或root精靈,首先root模擬器(模擬器重啟後kingroot就顯示模擬器root失效,可能是模擬器禁止任何程序修改system.img鏡像文件,Xposed的app_process就無法替換/system/bin/app_process)(2).安裝de.robv.android.xposed.installer_v32
  • Python|Pyinstaller打包Python程序的過程詳解
    Pyinstaller打包打包最重要的一步,也是第一步,梳理程序用到的第三方庫有哪些,比如用到了:numpy,pandas,matplotlibxlrd一定要確保程序用到的python解釋器所在的物理安裝路徑下,在site-packages文件夾下有了以上這些庫,並且要與自己的程序用到的一致。
  • Android的so加載過程了解一下?
    PathClassLoader,加載已經安裝應用類,也可以加載/vendor/lib, /system/lib下的so庫。DexClassLoader,加載dex文件。1.1 VMStack.getCallingClassLoader()這裡返回的是應用的類加載器。
  • Adb大全應用管理
    f顯示應用關聯的 apk 文件-d只顯示 disabled 的應用-e只顯示 enabled 的應用-s只顯示系統應用-3隻顯示第三方應用-i顯示應用的 installer-u包含已卸載應用<FILTER>包名包含 <FILTER> 字符串