1. 程式人生 > >如何手動完成一次APK打包?----APK編譯全過程

如何手動完成一次APK打包?----APK編譯全過程

身為一個Android工程師,你是否有考慮過一個Android專案工程如何經過編譯壓縮變成一個APK的呢? 你又是否編寫過打包工具完成多渠道打包呢?

下面我們來解密如何完成一個APK的打包。

這裡寫圖片描述

1、使用Android SDK提供的aapt.exe生成R.java類檔案 2、使用Android SDK提供的aidl.exe把.aidl轉成.java檔案(如果沒有aidl,則跳過這一步) 3、使用JDK提供的javac.exe編譯.java類檔案生成class檔案 4、使用Android SDK提供的dx.bat命令列指令碼生成classes.dex檔案 5、使用Android SDK提供的aapt.exe生成資源包檔案(包括res、assets、androidmanifest.xml等) 6、使用Android SDK提供的apkbuilder.bat生成未簽名的apk安裝檔案 7、使用jdk的jarsigner.exe對未簽名的包進行apk簽名

完成一次APK打包一共有7步。從功能上來分,可以分成四步。

  1. 對R檔案和Manifest進行編譯,相當於產生一個目錄,用於查閱程式碼和資源的位置。
  2. 對java程式碼的變成產生class檔案然後壓縮成dex檔案,中間可能還有混淆的過程。
  3. 對資原始檔的壓縮。
  4. 最後簽名。

然後我們再來看下分別對應的命令列

  1. 使用aapt命令編譯資原始檔 aapt package -f -m -J /home/tonywang/javaDemo/gen -S res -I /home/tonywang/sdk/platforms/android-23/android.jar -M AndroidManifest.xml

    其中 -f -m -J /home/tonywang/javaDemo/gen 代表按覆蓋的形式在gen目錄下生成帶包路徑的R.java,-S res指定資原始檔 ,-I /home/tonywang/sdk/platforms/android-23/android.jar 指定使用的android類,-M AndroidManifest.xml指定程式的配置檔案

  2. 使用javac命令編譯原始檔 javac -target 1.7 -bootclasspath /home/tonywang/sdk/platforms/android-23/android.jar -d bin /home/tonywang/javaDemo/gen/com/tony/demo/*.java /home/tonywang/javaDemo/src/com/tony/demo/*.java

    -target:表示編譯之後的class檔案執行的環境版本 -bootclasspath:表示編譯需要用到的系統庫 -d:表示編譯之後的class檔案存放的目錄 這裡需要把gen下和src下面的java都編譯了。 然後還有一個問題就是如果java檔案存在多個包名下,就需要一個個列出來,很是麻煩。這裡我寫了個shell指令碼,把所有java名字都存在一個文本里,然後編譯對應的檔名列表就好了。指令碼貼在下面 然後使用這條命令 javac -target 1.7 -bootclasspath /home/tonywang/sdk/platforms/android-23/android.jar -d bin @names.txt

  3. 使用dx命令,將class檔案轉化成dex dx –dex –output=/home/tonywang/javaDemo/bin/classes.dex /home/tonywang/javaDemo/bin/

  4. 使用aapt命令生成資源包檔案(編碼AndroidManifest.xml,resource.arsc等) aapt package -f -A assets -S res -I /home/tonywang/sdk/platforms/android-23/android.jar -M AndroidManifest.xml -F /home/tonywang/javaDemo/bin/javaDemo

  5. 使用apkbuilder命令來編譯 apk apkbuilder /home/tonywang/javaDemo/bin/javaDemo_unsigned.apk -v -u -z /home/tonywang/javaDemo/bin/javaDemo -f /home/tonywang/javaDemo/bin/javaDemo/classes.dex -rf /home/tonywang/javaDemo/src

  6. 使用keytool來產生一個keystore檔案 keytool -genkey -alias demo_test -keyalg RSA -validity 20000 -keystore demo.keystore

  7. 使用jarsigner簽名apk檔案 jarsigner -keystore /home/tonywang/javaDemo/demo.keystore -storepass 123456 -keypass 123456 -signedjar /home/tonywang/javaDemo/bin/javaDemo_signed.apk /home/tonywang/javaDemo/bin/javaDemo_unsigned.apk

至此,我們就完成了一次APK的編譯。 如果你需要多個渠道打包,可以編寫一個Ant指令碼,或者gradle指令碼。 PS.以上所有命令都基於Linux系統

附上查詢所有java檔案的指令碼 findJava.sh:

function findjava (){
    //友情提示,這裡不是單引號,是反引號。Esc鍵下面那個按鍵
    //表示shell執行命令
    for file int `ls $1`
    do
        if[ -d $1"/"$file ]; then
            findjava $1"/"$file
        else
            echo $1"/"$file >> /home/tonywang/javafile.txt
        fi
    done
}

dir='/home/tonywang/javaDemo/src'
findjava $dir

--------------------- 本文來自 TonyW92 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/wz249863091/article/details/52551629?utm_source=copy