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
- Flutter 打包 android端 apkFlutterAndroidAPK
- Android Studio打包專案:APKAndroidAPK
- 簽名打包Android版apkAndroidAPK
- uni-app&H5&Android混合開發二 || 使用Android Studio打包應用APKAPPH5AndroidAPK
- Android Studio打包apk,aar,jar包AndroidAPKJAR
- Android Apk反編譯系列教程(二)APK重打包AndroidAPK編譯
- Cordova 打包 apk,html 打包 apkAPKHTML
- Flutter 38: 圖解 Android 打包 APK 檔案Flutter圖解AndroidAPK
- 淺談Android打包流程Android
- 從Android到React Native開發(四、打包流程解析和釋出AndroidReact Native
- Android APK開發:Menu介面功能詳解AndroidAPK
- Flutter的apk打包FlutterAPK
- Android 多渠道打包開發記錄Android
- 從Android到React Native開發(四、打包流程解析和釋出為Maven庫)AndroidReact NativeMaven
- flutter常見問題【3】:Flutter 使用Android studio 打包生成apkFlutterAndroidAPK
- Android進階:十四、熟悉Android打包編譯的流程Android編譯
- Android Apk 檔案反編譯和重新打包的過程分析AndroidAPK編譯
- PhoneGap Hybrid APP 開發實戰(1):第一個 Android APKAPPAndroidAPK
- Android藍芽開發流程實踐Android藍芽
- React Native 打包apk的那些坑React NativeAPK
- uni-app專案打包成apk(本地打包篇)APPAPK
- Flutter完整開發實戰詳解(十四、混合開發打包 Android 篇)FlutterAndroid
- vue 專案打包成apk(Hbuilder方案)VueAPKUI
- 【Android APK】解析SD卡上的APK檔案AndroidAPKSD卡
- Android之Apk加殼AndroidAPK
- Android空包Apk簽名AndroidAPK
- 前端打包流程前端
- Android開發:APK的反編譯(獲取程式碼和資原始檔)AndroidAPK編譯
- Android之重新簽名APKAndroidAPK
- Gluon 編譯 JavaFx -> android apk編譯JavaAndroidAPK
- APK瘦身屬性——android:extractNativeLibsAPKAndroid
- Android Apk反編譯系列教程(一)如何反編譯APKAndroidAPK編譯
- Android解決The APK file app-debug.apk does not exist on disk.AndroidAPKAPP
- Android技術分享| 視訊通話開發流程(一)Android
- Android技術分享| 視訊通話開發流程(二)Android
- Android studio匯出apk檔案AndroidAPK
- 減少Android APK的大小99.99%AndroidAPK
- Android多渠道打包Android