在前面《Android學習第一天-adb經常使用命令》和 《Android學習次日-android經常使用命令》兩篇博文中,咱們重點講解了adb和android的經常使用命令,下面咱們講解一下打包的時候經常使用的命令吧html
通常狀況下,咱們使用這個命令進行模擬器的開啓比較多java
模擬器的開啓方式以下:android
emulator -avd <avd_name> [<options>]
或者
emulator @<avd_name>
通常狀況下咱們都是直接打開便可,具體的options能夠參考http://developer.android.com/tools/help/emulator.html,在此不作重複說明windows
Android Asset Packaging Tool,簡稱aapt,經過aapt,咱們能夠對打包的資源進行管理,包括查看,增長,刪除。app
aapt l[ist] [] <path_to_apk>
eg:
aapt l xiaoxuetu-debug.apk
終端的執行結果是:工具
Usage: aapt l[ist] [-v] [-a] file.{zip,jar,apk} List contents of Zip-compatible archive. aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]] badging Print the label and icon for the app declared in APK. permissions Print the permissions from the APK. resources Print the resource table from the APK. configurations Print the configurations in the APK. xmltree Print the compiled xmls in the given assets. xmlstrings Print the strings of the given compiled xml assets.
例如,我要查看這個包所使用到的權限:學習
aapt dump permissions xiaoxuetu-debug.apk
終端的執行結果:ui
由於該項目並無使用到權限,因此也就顯示爲空了。編碼
aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \ [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \ [--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL] \ [--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \ [--rename-manifest-package PACKAGE] \ [--rename-instrumentation-target-package PACKAGE] \ [--utf16] [--auto-add-overlay] \ [--max-res-version VAL] \ [-I base-package [-I base-package ...]] \ [-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] \ [-S resource-sources [-S resource-sources ...]] \ [-F apk-file] [-J R-file-dir] \ [--product product1,product2,...] \ [-c CONFIGS] [--preferred-configurations CONFIGS] \ [raw-files-dir [raw-files-dir] ...] \ [--output-text-symbols DIR]
上面的參數有點多,下面給出一些經常使用參數的簡單說明吧:spa
-f 若是編譯出來的文件已經存在,強制覆蓋
-m 使生成的包的目錄存放在-J參數指定的目錄
-J 指定生成的R.java 的輸出目錄
-S res文件夾路徑
-A assert文件夾路徑
-I 某個版本平臺的android.jar的路徑
-F 具體指定APK文件的輸出
-J R.java文件的生成目錄
在AAPT中經常使用的命令格式是:
aapt p -M <Android應用清單的路徑> -I <額外添加的包> -F <目標文件的路徑>
-I 額外添加的包必須包含android.jar這個jar包
下面舉一個例子:
aapt p -S res -M AndroidManifest.xml -I D:\Java\adt-bundle-windows\sdk\platforms\android-10\android.jar -F ./xiaoxuetu.apk
終端執行結果:
固然,這裏打出來的apk並非完整可用的,真正的apk打包還須要通過dex的編譯等流程。
aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]
Delete specified files from Zip-compatible archive.
首先,咱們查看下前面打包的xiaoxuetu.apk裏面的內容
下面若是咱們要刪除裏面的AnroidManifest.xml文件,執行下面命令:
aapt r xiaoxuetu.apk AndroidManifest.xml
終端的執行結果:
什麼都沒有輸出表示已經刪除成功了,咱們再來查看下該apk中的AnroidManifest.xml是否是真的已經被刪除了:
是的,咱們再也看不到AndroidManifest.xml。說明已經刪除成功了。
aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]
Add specified files to Zip-compatible archive.
假設咱們要往xiaoxuetu.apk中加回AndroidManifest.xml文件,咱們繼續執行:
aapt a xiaoxuetu.apk AndroidManifest.xml
終端的執行結果是:
咱們再來查看xiaoxuetu.apk中的內容發現AndroidManifest.xml又回來啦:
aapt v
終端的執行結果:
首先咱們來說解下javac的用法:
用法: javac <options> <source files> 其中, 可能的選項包括: -g 生成全部調試信息 -g:none 不生成任何調試信息 -g:{lines,vars,source} 只生成某些調試信息 -nowarn 不生成任何警告 -verbose 輸出有關編譯器正在執行的操做的消息 -deprecation 輸出使用已過期的 API 的源位置 -classpath <路徑> 指定查找用戶類文件和註釋處理程序的位置 -cp <路徑> 指定查找用戶類文件和註釋處理程序的位置 -sourcepath <路徑> 指定查找輸入源文件的位置 -bootclasspath <路徑> 覆蓋引導類文件的位置 -extdirs <目錄> 覆蓋所安裝擴展的位置 -endorseddirs <目錄> 覆蓋簽名的標準路徑的位置 -proc:{none,only} 控制是否執行註釋處理和/或編譯。 -processor <class1>[,<class2>,<class3>...] 要運行的註釋處理程序的名稱; 繞過默認的搜索進程 -processorpath <路徑> 指定查找註釋處理程序的位置 -d <目錄> 指定放置生成的類文件的位置 -s <目錄> 指定放置生成的源文件的位置 -implicit:{none,class} 指定是否爲隱式引用文件生成類文件 -encoding <編碼> 指定源文件使用的字符編碼 -source <發行版> 提供與指定發行版的源兼容性 -target <發行版> 生成特定 VM 版本的類文件 -version 版本信息 -help 輸出標準選項的提要 -A關鍵字[=值] 傳遞給註釋處理程序的選項 -X 輸出非標準選項的提要 -J<標記> 直接將 <標記> 傳遞給運行時系統 -Werror 出現警告時終止編譯 @<文件名> 從文件讀取選項和文件名
經過上面的選項能夠知道在編譯過程當中:
1) 因爲咱們的Android編碼使用的是UTF-8,因此須要指定 -encoding UTF-8
2) 因爲咱們還須要指定生成特定VM版本的類文件,因此咱們須要制定 -target 爲1.7
3) 因爲咱們編譯的是Android項目,因此須要另外Android的jar包,才能在編譯過程當中,避免引入錯誤,所以須要用到 -bootclasspath選項,引入響應android版本的jar包。
4) 因爲咱們須要制定編譯後的class文件的輸出位置,因此咱們還須要用到 -d這個選項
所以,通常狀況下咱們編譯一個安卓項目中的class文件的命令格式爲:
javac -encoding <源文件使用的編碼格式> -target <VM版本> -bootclasspath <覆蓋引導類文件的位置> -d <指定放置生成的類文件的位置> <須要編譯的java文件, 格式是: file1, file2>
下面舉一個例子,直接編譯xiaoxuetu這個Android項目的java文件:
javac -encoding UTF-8 -source 1.6 -target 1.6 -bootclasspath D:\Java\adt-bundle-windows\sdk\platforms\android-10\android.jar -d E:\Workspaces\android\xiaoxuetu\xbin E:\Workspaces\android\xiaoxuetu\src\com\xiaoxuetu\*.java E:\Workspaces\android\xiaoxuetu\gen\com\xiaoxu etu\*.java
終端的執行結果是:
咱們在來看看xbin目錄下,編譯好的class文件都存在了:
相信你們都知道,在Android平臺中,使用的是並無遵循JVM規範的Dalvik虛擬機,他並不直接運行java二進制文件,而是運行它特有的*.dex文件,所以咱們須要經過DX工具將Android應用的*.class文件轉換爲*.dex文件 .
dex工具的經常使用命令格式以下
dx --dex --dump-to <須要編譯到的路徑> --core-library <須要編譯的java文件所在的路徑>
注意:<須要編譯到的路徑> 和 <須要編譯的java文件所在的路徑> 必須是全路徑,不然他是以dx.bat所在的路徑爲相對路徑進行查找和編譯的
下面舉一個例子,假設我要把前面編譯的class文件轉換成*.dex文件,須要執行命令:
dx --dex --dump-to E:\Workspaces\android\xiaoxuetu\xbin\classes.dex --core-library E:\Workspaces\android\xiaoxuetu\xbin
終端的執行結果:
再到E:\Workspaces\android\xiaoxuetu\xbin目錄下咱們就會找到classes.dex這個文件出來了。
緣由:這是由於咱們寫了相對路徑,假設dx.bat所在的路徑是D:\android_dev_tools/platform_tools下,那麼在編譯的時候,它將會到 D:\android_dev_tools/platform_tools 目錄去尋找xbin文件夾,因此找不到xbin文件夾
解決方法:像示例中那樣使用絕對路徑
緣由:通過谷歌,在Stackflow的解釋爲:
Your classes need to be compiled with jdk 5 or 6. You are probably using 7. If that doesn't work, you might also need to make sure that every single class is compiled right, even if in different projects. Solved my problem here.
解決方法:在javac編譯的時候,經過source和target指定版本爲1.6,詳情見示例。
這個工具用於將各類資源打包成一個Android應用。它的使用方法是:
Usage: apkbuilder <out archive> [-v][-u][-storetype STORE_TYPE] [-z inputzip] [-f inputfile] [-rf input-folder] [-rj -input-path] -v Verbose. -d Debug Mode: Includes debug files in the APK file. -u Creates an unsigned package. -storetype Forces the KeyStore type. If ommited the default is used. -z Followed by the path to a zip archive. Adds the content of the application package. -f Followed by the path to a file. Adds the file to the application package. -rf Followed by the path to a source folder. Adds the java resources found in that folder to the application package, while keeping their path relative to the source folder. -rj Followed by the path to a jar file or a folder containing jar files. Adds the java resources found in the jar file(s) to the application package. -nf Followed by the root folder containing native libraries to include in the application package.
下面講解下經常使用的命令吧:
-rf 參照源文件的目錄的結構
-u 建立一個沒有簽名的包
-z 將某個壓縮文件添加到包中
-f 將某個文件添加到保重
那麼經常使用的apkbuilder命令格式就是:
apkbuilder <APK輸出路徑> -u -z <須要添加的壓縮資源包> -f <須要添加的文件> -rf <源文件所在的目錄>
注意:<須要編譯到的路徑> 和 <須要編譯的java文件所在的路徑> 必須是全路徑
下面舉個例子吧:
apkbuilder E:\Workspaces\android\xiaoxuetu\xbin\xiaoxuetu.apk -u -z E:\Workspaces\android\xiaoxuetu\xbin\xiaoxuetu.ap_ -f E:\Workspaces\android\xiaoxuetu\xbin\classes.dex -rf E:\Workspaces\android\xiaoxuetu\src
終端的執行結果是:
同時在E:\Workspaces\android\xiaoxuetu\xbin\咱們能夠打包好的apk文件了。
注意:本文主要是講解打包會用到的經常使用命令的使用方法,並非說根據這些步驟就可以打出一個可用的包,具體一個詳細的打包流程,在後續的博文中會講到,敬請期待。謝謝。