1. 程式人生 > >apk編譯流程學習之Windows下命令列打包apk

apk編譯流程學習之Windows下命令列打包apk

總結記錄下這兩天的主要學習成果,其中借鑑了網上很多資料,終於成功打包出測試apk檔案並執行。

準備知識挺多的(也是自己太菜了):

1.Android中apk與dex的區別

1. *.apk檔案

APK是Android Package的縮寫,即Android安裝包。通過將APK檔案直接傳到Android模擬器或Android手機中執行即可安裝。

使用Android打包工具(aapt)將DEX檔案,資原始檔以及AndroidManifest.xml檔案組合成一個應用程式包(APK)。Dex是Dalvik VM executes的全稱,即Android Dalvik執行程式。

  • META-INF\ Jar檔案
  • res\ 存放資原始檔
  • AndroidManifest.xml 應用全域性配置檔案
  • *.dex Dalvik虛擬機器位元組碼(應用程式)
  • resources.arsc 編譯後的二進位制資原始檔

     Android在執行程式時首先需要解壓apk檔案,然後獲取編譯後的androidmanifest.xml檔案中配置資訊,執行dex程式。

2..dex檔案

Dex是Dalvik VM executes的全稱,即Android Dalvik執行程式,通常執行時都進行優化 。優化後的檔案大小會有所增加。 優化發生的時機有兩個:對於預置應用,可以在系統編譯後,生成優化檔案,以ODEX結尾。這樣在釋出時除APK檔案(不包含DEX)以外,還有一個相應的Android DEX檔案;對於非預置應用,包含在APK檔案裡的DEX檔案會在執行時被優化,優化後的檔案將被儲存在快取中。

Zygote是一個虛擬機器程序,同時也是一個虛擬機器例項的孵化器,每當系統要求執行一個 Android應用程式,Zygote就會FORK出一個子程序來執行該應用程式。這樣做的好處顯而易見:Zygote程序是在系統啟動時產生的,它會完成虛擬機器的初始化,庫的載入,預置類庫的載入和初始化等等操作,而在系統需要一個新的虛擬機器例項時。

Zygote通過複製自身,最快速的提供個系統。另外,對於一些只讀的系統庫,所有虛擬機器例項都和Zygote共享一塊記憶體區域,大大節省了記憶體開銷。

2.工程目錄打包時各個檔案的作用:Eclipse專案和Android Studio工程(自行查詢吧)

3.Windows環境下多個jdk來回切換

4.apktool d2j-dex2jar jd-gui反編譯工具的使用(用來比較自己命令列生成的dex和apk是否與eclipse生成的apk一致)

等等

1. 把android命令列工具所在的路徑新增到path環境變數中,主要包括: D:\adt-bundle-windows-x86_64-20131115\sdk\tools; D:\adt-bundle-windows-x86_64-20131115\sdk\platform-tools; D:\adt-bundle-windows-x86_64-20131115\sdk\build-tools\21.1.1;

2. 我們在eclipse中新建一個android專案,內容非常簡單,只有一個MainActivity。(後來經過我們老大提示,測試時可以用最簡單的例子,把專案中載入的V4包也去掉了)

Android如何用命令列進行打包 3 下面我們把這個專案的原始碼拷貝到其他的路徑,然後用命令列進行打包,比如本文是拷貝到D:\命令列打包apk\t4\ 4 (1)生成R檔案。在命令列輸入: aapt package -f -m -J ./gen -S res -M AndroidManifest.xml -I E:\sdk\sdk\platforms\android-21\android.jar 5 (2)生成class檔案。在命令列輸入: javac -bootclasspath E:\sdk\sdk\platforms\android-21\android.jar -d bin src\com\example\apktest\*.java gen\com\example\apktest\R.java
6 使用Android SDK提供的dx.bat命令列指令碼生成classes.dex檔案 將工程bin目錄下的class檔案編譯成classes.dex,Android虛擬機器只能執行dex檔案 dx --dex --output=D:\命令列打包apk\t4\ApkTest\bin\classes.dex D:\命令列打包apk\t4\ApkTest\bin 7 打包資源: aapt package -f -M AndroidManifest.xml -S res -I E:\sdk\sdk\platforms\android-21\android.jar -A assets -F D:\命令列打包apk\t4\ApkTest\bin\Test.ap_ 8 生成未簽名的apk 注:1.如果需要將so檔案打包進apk,一定要加上-nf引數 2.如果第三方jar包裡含有圖片資源,一定要加上-rj引數,不然jar包裡資原始檔解不出來,程式會因為無法引用資源而報錯 java -cp E:\sdk\sdk\tools\lib\sdklib.jar com.android.sdklib.build.ApkBuilderMain  D:\命令列打包apk\t4\ApkTest\bin\ApkTest.apk -v -u -z D:\命令列打包apk\t4\ApkTest\bin\Test.ap_ -f D:\命令列打包apk\t4\ApkTest\bin\classes.dex -rf D:\命令列打包apk\t4\ApkTest\src -nf D:\命令列打包apk\t4\ApkTest\libs -rj D:\命令列打包apk\t4\ApkTest\libs 9 簽名: jarsigner -verbose -keystore emm3.keystore -signedjar Test_Sign.apk ApkTest.apk emmservice3 執行截圖如下:


齊活手工!

總結下這天遇到的坑:

1.

jdk版本過高 我之前的是jdk1.8  換成jdk1.6就好使了

2.

命令列生成.dex檔案時

只走到bin目錄下面就行了  走進去會報1那個錯,不明覺厲。親測的坑,雖然不知道為什麼。

雖然檔案路徑是這樣的 但是把class檔案打包成.dex時 命令列還是得寫到bin目錄路徑:

dx --dex --output=D:\命令列打包apk\t4\ApkTest\bin\classes.dex D:\命令列打包apk\t4\ApkTest\bin

主要參考: