Android開發 —— apk打包流程
0. 前言
apk 全稱是Android應用程式包(Android application package),一種能被Android系統識別並執行的檔案格式。
apk 檔案基於 zip 檔案格式,它與 jar 檔案的構造方式相似。
在總結 apk 的打包流程之前,先要了解一下一個 apk包 究竟有哪些檔案:
- classes.dex 檔案:java原始檔經過編譯和轉換後生成的二進位制的位元組碼檔案。
- resource.arsc 檔案:經過 aapt 編譯後的二進位制的資原始檔。
- AndroidManifest.xml 檔案:經過 aapt 編譯後的二進位制的 xml 檔案。
- res 資料夾:除圖片和 res/raw 資料夾下的檔案外,其餘的 xml 檔案都被 aapt 編譯成二進位制的 xml 檔案。
- assets 資料夾(可選):存放不進行編譯的原生檔案,可以是一些圖片,或者是html、js、css檔案。
- lib 資料夾(可選):存放應用程式依賴的 native 庫檔案,一般是用 c/c++ 編寫,如 so 檔案。
- META-INF 資料夾:存放簽名資訊。
1. 官方流程圖
2. apk 的打包流程
Android Studio中,打包工具主要位於 sdk/build-tools/版本號/ 目錄下。
#1 打包資原始檔,生成相應的 R.java 檔案
【工具】aapt(Android Asset Package Tool)
【輸入】res 資料夾,assets 資料夾,AndroidManifest.xml 檔案
【輸出】R.java,二進位制的 resource.arsc ,res 資料夾(包括二進位制的 xml 檔案以及 沒有改變的圖片和 res/raw 下的檔案),
沒有改變的 assets 資料夾,二進位制的 AndroidManifest.xml 檔案
#2 處理 aidl 檔案,生成相應的 java 檔案
【工具】aidl(Android Interface Denifition Language)
【輸入】aidl檔案
【輸出】相應的 java 介面檔案
#3 編譯所有的 java 檔案,生成 class 檔案
【工具】javac(java 編譯器)
【輸入】R.java,java介面檔案,java原始檔
【輸出】class檔案
#4 把class檔案轉換成dex檔案
【工具】dx.bat
【輸入】class檔案,第三方庫檔案.jar(jar包中大都是class檔案)
【輸出】classes.dex檔案
#5 打包生成apk檔案
【工具】apkbuilder(主要用到的是sdk/tools/lib/sdklib.jar檔案中的ApkBuilderMain類)
【輸入】resource.arsc檔案,AndroidManifest.xml檔案,res資料夾,assets資料夾,classes.dex檔案
【輸出】apk檔案
#6 對apk檔案進行簽名
【工具】apksigner
【輸入】未簽名的apk檔案
【輸出】簽名的apk檔案
#7 對簽名後的apk檔案進行對齊處理
【工具】zipalign
【輸入】簽名的apk檔案
【輸出】最終的apk檔案
注:如果是release版本,需要對apk檔案進行對齊處理。
對齊處理使得apk包中的所有資原始檔距離檔案起始偏移為4位元組整數倍,這樣通過記憶體對映訪問apk檔案時的速度更快,同時減少執行時記憶體的使用。
3. 詳細流程圖
相關文章
- Android APK打包流程AndroidAPK
- Android開發把專案打包成apkAndroidAPK
- Android Apk 打包AndroidAPK
- Flutter 打包 android端 apkFlutterAndroidAPK
- andriod 原始碼開發,打包so到apk原始碼APK
- 簽名打包Android版apkAndroidAPK
- Android Apk反編譯系列教程(二)APK重打包AndroidAPK編譯
- Android Studio打包專案:APKAndroidAPK
- Android自定義打包apk名稱AndroidAPK
- uni-app&H5&Android混合開發二 || 使用Android Studio打包應用APKAPPH5AndroidAPK
- Android Studio打包apk,aar,jar包AndroidAPKJAR
- android 使用ANT批量打包apk步驟AndroidAPK
- 動態庫so打包到android apkAndroidAPK
- Flutter 38: 圖解 Android 打包 APK 檔案Flutter圖解AndroidAPK
- Android 生成簽名apk與多渠道打包AndroidAPK
- 轉[Android]APK打包過程詳解(一)AndroidAPK
- 轉[Android]APK打包過程詳解(二)AndroidAPK
- Android使用Ant進行apk多渠道打包AndroidAPK
- 淺談Android打包流程Android
- Flutter的apk打包FlutterAPK
- 從Android到React Native開發(四、打包流程解析和釋出AndroidReact Native
- Android APK開發:Menu介面功能詳解AndroidAPK
- ReactNative學習筆記十六之Android打包ApkReact筆記AndroidAPK
- Android 微信支付開發流程Android
- Android 多渠道打包開發記錄Android
- Unity 編譯 Android 的原理解析和 apk 打包分析Unity編譯AndroidAPK
- Android Studio 打包APK遇到Error: Expected resource of type id [ResourceType]AndroidAPKError
- 從Android到React Native開發(四、打包流程解析和釋出為Maven庫)AndroidReact NativeMaven
- Android開發如何有效減小APK的體積AndroidAPK
- 【Android自動化打包】03. APK的數字簽名AndroidAPK
- uni-app專案打包成apk(本地打包篇)APPAPK
- Android進階:十四、熟悉Android打包編譯的流程Android編譯
- Android Apk 檔案反編譯和重新打包的過程分析AndroidAPK編譯
- flutter常見問題【3】:Flutter 使用Android studio 打包生成apkFlutterAndroidAPK
- Android藍芽開發流程實踐Android藍芽
- Android 支付寶支付開發流程Android
- Android Studio搭建ndk開發流程Android
- 前端打包流程前端