在前面《Android學習第一天-adb常用命令》和 《Android學習第二天-android常用命令》兩篇博文中,我們重點講解了adb和android的常用命令,下面我們講解一下打包的時候常用的命令吧
3. emulator
一般情況下,我們使用這個命令進行模擬器的開啟比較多
模擬器的開啟方式如下:
emulator -avd <avd_name> [<options>]
或者
emulator @<avd_name>
一般情況下我們都是直接打開即可,具體的options可以參考http://developer.android.com/tools/help/emulator.html,在此不做重復說明
4. Android Asset Packaging Tool
Android Asset Packaging Tool,簡稱aapt,通過aapt,我們可以對打包的資源進行管理,包括查看,增加,刪除。
4.1 查看資源包內的內容
aapt l[ist] [] <path_to_apk>
eg:
aapt l xiaoxuetu-debug.apk
終端的執行結果是:
4.2 查看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
終端的執行結果:
因為該項目並沒有使用到權限,所以也就顯示為空了。
4.3 打包生成資源壓縮包
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]
上面的參數有點多,下面給出一些常用參數的簡單說明吧:
-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的編譯等流程。
4.4 從壓縮包中刪除指定文件
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。說明已經刪除成功了。
4.5 往壓縮包中添加指定文件
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又回來啦:
4.6查看aapt的版本號
aapt v
終端的執行結果:
5. javac編譯java文件
首先我們來講解下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文件都存在了:
6.使用dex編譯Android應用
6.1 使用方法
相信大家都知道,在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這個文件出來了。
6.2 常見的問題
問題1 : 在編譯過程中,總是出現以下問題:
原因:這是因為我們寫了相對路徑,假設dx.bat所在的路徑是D:\android_dev_tools/platform_tools下,那么在編譯的時候,它將會到 D:\android_dev_tools/platform_tools 目錄去尋找xbin文件夾,所以找不到xbin文件夾
解決方法:像示例中那樣使用絕對路徑
問題2:在編譯過程中,總是出現以下問題:
原因:經過谷歌,在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,詳情見示例。
7.apkbuilder
這個工具用於將各種資源打包成一個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文件了。
注意:本文主要是講解打包會用到的常用命令的使用方法,並不是說根據這些步驟就能夠打出一個可用的包,具體一個詳細的打包流程,在后續的博文中會講到,敬請期待。謝謝。