adb常用命令教程


1.Android Debug Bridge -

adb常用命令

1.1簡介

 

Android Debug Bridge,我們一般簡稱為adb,主要存放在sdk安裝目錄下的platform-tools文件夾中,它是一個非常強大的命令行工具,通過這個工具你能夠與你的android設備進行交互。同時這是一個包含了以下三部分的cs模式的程序:

 

1) adb client

  從圖中,我們知道client是運行在PC端的,每當我們發起一個adb命令的時候,就會開啟一個client程序。當然,當我們開啟DDMS或者ADT的時候,也會自動創建client。

  當我們開啟一個client的時候,它首先會去檢測后台是否已經有一個server程序在運行着,否則會開啟一個adb-server進程。

  所有的client都是通過5037端口與adb-server進行通信的。

2)adb daemon(adbd)

  從圖中,我們知道daemon是作為一個后台進程運行在模擬器/真實Android設備中的。

  daemon使用端口的范圍是5554-5585,每個模擬器/設備連接到PC端時,總會開啟這么一個后台進程,並且為其分配了兩個連續的端口,比如:

    Emulator 1, console: 5554

    Emulator 1, adb: 5555

  也正因為每個設備都分一組兩個端口,也已adb連接手機的最大數量為16。

  說回端口的作用,在這兩個端口中,其中偶數端口是用於server 與設備進行交互的,可以讓server直接從設備中讀取數據,而奇數端口是用來與設備的adbd進行連接通信的。

2) adb server

  從圖中,我們同樣可以知道,server也是作為一個后台的程序運行在PC端的,他負責管理client進程以及adb daemon之間的通信。

  當一個server開啟的時候,他會自動綁定並且監聽5037端口,接收client通過該端口發送過來的命令。同時server還會對5555-5585間的奇數端口進行掃描,進行對已連接設備的定位。

1.2 常用的adb命令

首先我們先來介紹一下,adb命令的使用格式吧:

adb [-d|-e|-s <serialNumber>] <command>

adb是必須的,接下來方括號[]里面的內容不是必須的,最后才是我們需要執行的命令操作,例如 adb -s emulator-5554 install UCBrowser.apk (這是安裝UC瀏覽器的意思)

下面先介紹下,前面幾個參數的含義吧:

  -d: 讓唯一連接到該PC端的真實安卓設備執行命令,如果發現USB中連接有多部設備,將會報錯

  -e: 讓唯一連接到該PC端的模擬器執行命令,如果發現開啟了多個模擬器,將會報錯

  -s:通過設備的序列號進行指定設備執行命令

如果設備只連接有一個設備或者一個模擬器的時候,可以不用聲明這三個參數,adb默認會讓這部唯一連接到的設備進行命令執行。

ok,下面開始講解常用的命令吧:

1) 查看當前PC端連接有多少設備:

adb devices

終端中的執行結果為:

 

從上圖中,我們看到了設備有的兩種狀態,其實執行該命令,可能返回的狀態有三種:

  I. device 設備已經成功連接到了adb-server

   II. offline 設備並沒有連接到adb或者沒有響應

  III. no device 並沒有設備/模擬器連接

2) 查看adb的版本

adb version

終端中的執行結果為:

 

3) 給設備進行軟件的安裝

adb -s <serialNumber> install <path-to-apk>
eg: adb -s 99eb07a9 install D://Test.apk

終端中的執行結果為:

 

除了上面這種方法,我們還有另外一個命令:

adb -s <serialNumber> shell pm install [options] <PATH>

其中[options]中最常用的選項是-r,代表着本次安裝是重新安裝,會保留用戶數據。

4) 卸載設備中已經安裝的軟件

adb -s <serialNumber> uninstall <pkg_name>
eg: adb -s 99eb07a9 uninstall cn.uc.test

終端中的執行結果為:

 

除了上面這種方法,我們還有另外一個命令:

adb -s <serialNumber> uninstall [options] <PACKAGE>

這里的options是-k,加上該參數表明卸載軟件后依舊保留用戶數據

5) 將數據從設備復制到PC中

adb -s <serialNumber>pull <remote> <local>
eg: adb -s 99eb07a9 pull /sdcard/stericson-ls D://

終端的執行結果:

 

在D://盤中我們也可以發現stericson-ls文件

6) 講數據從PC端復制到設備中

adb -s <serialNumber>push <local> <remote>
eg: adb -s 99eb07a9 push d://stericson-ls /sdcard/

  終端的執行結果:

 

7) 獲取連接到的手機的序列號

adb get-serialno

  終端的執行結果:

 

8)獲取設備的連接狀態

adb -s <serialNumber> get-state eg: adb -s 99eb07a9 get-stat

  終端的執行結果:

 

9) 等待設備連接成功

adb wait-for-device

該命令將會阻塞一直到默認連接的那部機器狀態變為device,也就是連接成功。

10) adb-server 的開啟與關閉

adb kill-server adb start-server

終端的執行結果:

 

有時候我們開啟server會失敗,這是因為我們裝了的手機助手,豌豆莢或者其他軟件自帶有自己的adb,導致端口沖突開啟失敗。主要關掉那些軟件並且殺掉那些軟件自帶的adb進程重來即可。

1.2 手機執行Shell命令

眾所周知,Android的內核本身就是Linux,所以Android本身也支持Linux命令,但是因為是手機系統,所以進行了一定的刪減,部分命令不支持,而不支持的部分,我們可以通過安裝busybox這個軟件進行

填補。

下面我們講解下如何在手機中執行Shell命令:

  1) 每次都加上adb shell來進行命令的發送與執行

adb shell <command> 

  2) 先通過adb shell進入手機Shell執行狀態,然后直接輸入Linux命令,如圖:

  

1.3 Activity Manager 常用命令與參數說明

一般情況下,我們最常用它來進行app的開啟,並且傳遞一定的參數過去,比如:

adb shell am start -a android.intent.action.VIEW -n cn.uc.test/.MainActivity -d http://www.baidu.com

詳情的可以參考:http://developer.android.com/tools/help/adb.html#IntentSpec

在這里就不做太過詳細和重復的說明了

1.4 Package Manager 常用命令與參數說明

1) 使一個apk處於禁用狀態,相當於卸載了:

disable <PACKAGE_OR_COMPONENT>
其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobile
eg:
adb shell su disable com.UCMobile/.main.UCMobile

終端執行結果:

 

同時我們在手機上發現,UC瀏覽器的圖標不見了

2) 讓一個apk從禁用狀態恢復過來

enable <PACKAGE_OR_COMPONENT>
其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobile
eg: adb shell su enable com.UCMobile/.main.UCMobile

終端執行結果:

 

同時我們從手機上發現,UC瀏覽器的圖標又回來啦。

3) 查看一個apk所在的路徑

pm path <Package>
eg: adb shell pm path com.UCMobile

終端執行結果:

 

4) 查看手機中裝的所有的包

pm list packages 

具體更多的詳情,可以參考:http://developer.android.com/tools/help/adb.html#IntentSpec

再次不做過多的說明

1.5其他常用的adb命令

1) 屏幕錄像

例如,屏幕開始錄像並且儲存到/sdcard中,同時名字為demo.mp4

adb shell screenrecord /sdcard/demo.mp4

2) 關閉設備請求,開啟設備

adb shell stop
adb shell start

3)設備關機以及重啟

adb reboot
adb shutdown

 

 

2 android -

android常用命令

2.1 查看機器上所有已經安裝的Android版本和AVD設備

2.1.1查看機器上已經安裝的AVD(Android Virtual Device)設備

 

通過下面的命令我們可以查看機器上安裝了的所有的AVD:

android list avd

終端執行結果:

 

從圖中我們可以看到,在我的機器上總共建立了兩個avd,其中一個是2.3.3版本的 ,另一個是4.0版本的

2.1.2 查看機器上所有已經安裝的Android版本

通過下面這個命令,我們可以查看到機器上已經安裝了的Android版本:

android list target

終端執行結果:

 

上圖中顯示的只是其中的 一部分。

2.2 AVD設備管理

2.2.1創建AVD設備

首先,通過上面的命令我們可以查詢到我們機器上所安裝又的android版本,接下來,我們就可以根據我們的需求以及已安裝的版本進行avd設備的創建。具體命令格式如下:

android create avd -n <avd名稱> -t <Android 版本> -b <CPU架構> -p <AVD 設備保存位置> -s <選擇AVD皮膚>

舉個例子:

android create avd -n test_avd -t 4

這樣子我們就可以創建一個最簡單的avd了,通過android list avd我們可以查看到這個avd:

 

2.2.2 升級AVD設備使之符合新的SDK環境

android update avd -n <AVD 名稱>

舉個例子:

android update avd -n test_avd

2.2.3 重命名AVD設備或者修改路徑

android move avd 
Options:
  -p --path : Path to the AVD's new directory. -n --name : Name of the AVD to move or rename. [required] -r --rename : New name of the AVD.

2.2.4 刪除AVD設備

android delete avd -n <AVD 名稱>

2.3 Android項目管理

2.3.1創建一個新的Android項目

android create project <options>

Options: -n --name : 項目名字<Project name>,當你去build該項目的時候,這個選項將會用來做你的apk的文件名<即是:name.apk> -t --target : 項目針對的Android版本,同時在編譯的時候也會使用該Android版本.這個可以使用android list target查詢到. [required] -p --path : 項目將要建立的路徑. [required]  -k --package : 項目應用的包名. [required] -a --activity: 默認的Activity的名字. [required]

舉個例子,我要在當前路徑下的xiaoxuetu文件夾中創建一個名字為xiaoxuetu,包名是com.xiaoxuetu,activity名字為MainActivity的項目:

android create project -n xiaoxuetu -t 4 -p ./xiaoxuetu -k com.xiaoxuetu -a MainActivity

終端的執行結果為:

 

從結果中,我們就可以看到,執行命令后他為我們生成了一系列的文件,關於一個項目的具體架構,我們后面講到。

2.3.2 更新一個Android項目

所謂的更新是什么呢?意思就是可以為一個已經存在的Android項目,添加庫,修該項目名字,設置項目的針對的Android版本,同時還可以更新他的子項目,如測試項目。

android update project <options>

Options: -l --library : Directory of an Android library to add, relative to this project's directory. -p --path : The project's directory. [required] -n --name : Project name. -t --target : Target ID to set for the project. -s --subprojects: Also updates any projects in sub-folders, such as test projects.

我們先來給個簡單的使用例子,后來再來介紹 -l 和 -s參數吧:

android update project -p ./xiaoxuetu -n xiaoxuetu -t 4

終端的執行結果:

 

2.3.3 創建庫項目(lib project)

上面的屬性 -l 其實指的就是庫項目,而庫項目(lib project)本身也是一個標准的android 項目。我們可以像之前那樣創建一個庫項目,也可以直接利用android工具本身自帶的工具進行創建:

android create lib-project <options>

Options: -n --name : Project name. -t --target : Target ID of the new project. [required] -k --package : Android package name for the library. [required] -p --path : The new project's directory. [required]

下面我們來舉一個例子吧:

android create lib-project -n xiaoxuetu_lib -t 4 -k com.xiaoxuetu.lib -p ./xiaoxuetu_lib

終端的執行結果為:

 

看起來,他本身和標准的Android 項目沒有什么區別,差別主要在於project.properties文件中多了這么一個屬性:

android.library=true

如果你想吧其他已經存在的項目更改成庫項目,只要在它的project.properties文件中加入上面那一句即可。

2.3.4 更新庫項目

更新庫項目,比如說更新庫項目針對的Android版本:

android update lib-project <options>

Options: -p --path : The project's directory. [required] -t --target : Target ID to set for the project.

具體使用方法,跟前面 2.3.2 更新一個Android項目 一樣,在此不做過多的說明

2.3.5 庫項目的引入

其實這個在前面 Android項目創建和更新 的時候已經講解過,使用的就是 -l (或者--library)這個參數:

android update project \
--target <target_ID> \ --path path/to/your/project --library path/to/library_projectA

當引入成功后,我們就會發現在project.properties文件中多了這么一行:

android.library.reference.1=path/to/library_projectA

如果你引入的是多個庫項目,那么將會使用.n來決定各個庫項目的優先權:

android.library.reference.1=path/to/library_projectA android.library.reference.2=path/to/library_projectB android.library.reference.3=path/to/library_projectC

當然我們也可以給library_projectC較高的優先權:

android.library.reference.2=path/to/library_projectA android.library.reference.3=path/to/library_projectB android.library.reference.1=path/to/library_projectC

注意:.n一定是從1開始的

2.3.6 創建測試項目(test-project)

創建一個測試用的項目,可以用來測試安卓應用的Activity,Service等等,具體后面的博客會講,在此不做詳細的講解,如果現在就想了解的話,可以先參考:http://developer.android.com/tools/testing/testing_android.html

android create test-project <options>

Options: -p --path : The new project's directory. [required] -n --name : Project name. -m --main : Path to directory of the app under test, relative to the test project directory. [required]
 

下面主要講解下-m這個參數,如果有這么一個項目/source/projectA,我們要建立一個測試項目/source/projectATest用於測試/source/projectA,那么,我們的m必須是../projectA,下面給出一個簡單的例子,測試的是同一目錄下之前創建的xiaoxuetu項目:

android create test-project -p ./xiaoxuetu_test -n xiaoxuetu_test -m ../xiaoxuetu

終端中的執行結果是:

 

2.3.7 更新測試項目(test-project)

更新該測試項目要測試的Android項目:

android update test-project <options>

Options: -m --main : Directory of the app under test, relative to the test project directory. [required] -p --path : The project's directory. [required]

具體注意事項和執行結果跟前面的差不多,在此就不做多說明了。

 

 

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文件轉換為*.dexwenjian .

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文件了。

 

 

8.keytool -

簽名常用命令

 

這是我們JDK自帶的密鑰和證書管理工具

 
命令:

 -certreq 生成證書請求 -changealias 更改條目的別名 -delete 刪除條目 -exportcert 導出證書 -genkeypair 生成密鑰對 -genseckey 生成對稱密鑰 -gencert 根據證書請求生成證書 -importcert 導入證書或證書鏈 -importkeystore 從其他密鑰庫導入一個或所有條目 -keypasswd 更改條目的密鑰口令 -list 列出密鑰庫中的條目 -printcert 打印證書內容 -printcertreq 打印證書請求的內容 -printcrl 打印 CRL 文件的內容 -storepasswd 更改密鑰庫的存儲口令
 

一般情況下,我們都是直接通過以下格式的命令進行證書生成:

keytool -genkeypair -alias <整數的別名>-keyalg RSA -validity <有效天數> -keystore <keystore文件的路徑+文件名>.keystore

比如生成一個別名為 tbb 證書名字為tbb.keystore的證書:

keytool -genkeypair -alias tbb -keyalg RSA -validity 180 -keystore d:\tbb.keystore

執行該命令后,按照提示進行密碼等情況的輸入即可。

9.jarsigner

使用這個工具我們可以給apk進行簽名:

 
用法: jarsigner [選項] jar文件 別名 jarsigner -verify [選項] jar文件 [別名...] [-keystore <url>] 密鑰庫位置 [-storepass <口令>] 用於密鑰庫完整性的口令 [-storetype <類型>] 密鑰庫類型 [-keypass <口令>] 私有密鑰的口令 (如果不同) [-certchain <文件>] 替代證書鏈文件的名稱 [-sigfile <文件>] .SF/.DSA 文件的名稱 [-signedjar <文件>] 已簽名的 JAR 文件的名稱 [-digestalg <算法>] 摘要算法的名稱 [-sigalg <算法>] 簽名算法的名稱 [-verify] 驗證已簽名的 JAR 文件 [-verbose[:子選項]] 簽名/驗證時輸出詳細信息。 子選項可以是 all, grouped 或 summary [-certs] 輸出詳細信息和驗證時顯示證書 [-tsa <url>] 時間戳頒發機構的位置 [-tsacert <別名>] 時間戳頒發機構的公共密鑰證書 [-altsigner <類>] 替代的簽名機制的類名 [-altsignerpath <路徑列表>] 替代的簽名機制的位置 [-internalsf] 在簽名塊內包含 .SF 文件 [-sectionsonly] 不計算整個清單的散列 [-protected] 密鑰庫具有受保護驗證路徑 [-providerName <名稱>] 提供方名稱 [-providerClass <類> 加密服務提供方的名稱 [-providerArg <參數>]]... 主類文件和構造器參數 [-strict] 將警告視為錯誤
 

一般情況下,對apk文件進行簽名的命令格式為:

jarsigner -verbose -keystore <證書所在的路徑> -signedjar <簽名后apk的名字> <需要簽名的apk> <證書別名>

-verbose : 指定生成詳細輸出

下面舉一個例子,為我們前面博文中建立的xiaoxuetu.apk進行簽名:

E:\Workspaces\android\xiaoxuetu>jarsigner -verbose -keystore tbb.keystore -signedjar xiaoxuetu_sign.apk xiaoxuetu.apk tbb

終端的執行結果為:

 

10 zipalign

zipalign是Android自帶的一個檔案整理工具,可用於優化APK安裝包,從而提升Android應用與系統之間的交互效率,提升應用程序的運行速度。

Usage: zipalign [-f] [-v] <align> infile.zip outfile.zip zipalign -c [-v] <align> infile.zip <align>: alignment in bytes, e.g. '4' provides 32-bit alignment -c: check alignment only (does not modify file) -f: overwrite existing outfile.zip, 即是強制覆蓋已有的文件 -v: verbose output, 指定生成詳細輸出

一般情況下,我們直接使用該命令的基本格式為:

zipalign -f -v <檔案整理所基於的字節數> <需要優化的文件> <經過優化后的文件>

下面就針對我們的xiaoxuetu.apk進行一次優化做為例子:

zipalign -f -v 4 xiaoxuetu.apk xiaoxuetu_zip.apk


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM