Android apk打包過程

概述

android打包過程,下面這張圖取自Android開發權威指南,非常清晰。

整個過程使用的工具有

 

名稱 功能介紹 在操作系統中的路徑
aapt Android資源打包工具 ${ANDROID_SDK_HOME}/platform-tools/appt
aidl Android接口描述語言轉化為.java文件的工具 ${ANDROID_SDK_HOME}/platform-tools/aidl
javac Java Compiler ${JDK_HOME}/javac或/usr/bin/javac
dex 轉化.class文件為Davik VM能識別的.dex文件 ${ANDROID_SDK_HOME}/platform-tools/dex
apkbuilder 生成apk包 ${ANDROID_SDK_HOME}/tools/apkbuilder
jarsigner .jar文件的簽名工具 ${JDK_HOME}/jarsigner或/usr/bin/jarsigner
zipalign 字節碼對齊工具 ${ANDROID_SDK_HOME}/tools/zipalign

 

 

使用aapt生成R文件

例如:aapt l <你的apk文件>,這個命令就是查看apk內容
permissions 打印app包的權限
resources 打印資源表
configurations 打印配置信息
xmltree 打印制定的xml信息
xmlstrings 打印制定字符串
[-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,…] /

[raw-files-dir [raw-files-dir] …]

使用javac命令編譯java源碼

java [options] [sourcefiles] [@files]
其中:
options:命令行選項;
sourcefiles:一個或多個要編譯的源文件;
@files:一個或多個對源文件進行列表的文件,有時候要編譯的文件很多,一個個敲命令會顯得很長,也不方便修改,可以把要編譯的源文件列在文件中,在文件名前加@,這樣就可以對多個文件進行編譯,對編譯一個工程很有用,方便,省事。
有幾個比較重要的選項:
-d 用於指定編譯成的class文件的存放位置,缺省情況下不指定class文件的存放目錄,編譯的class文件將和源文件在同一目錄下;
-classpath 可以簡寫成-cp,用於搜索編譯所需的class文件,指出編譯所用到的class文件的位置,如jar、zip或者其他包含class文件的目錄,指定該選項會覆蓋CLASSPATH的設定;
-sourcepath用於搜索編譯所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目錄;
需要註意windows下和linux下文件路徑分隔符和文件列表(即-classpath和-sourcepath指定的文件)分隔符的區別:
windows下文件路徑分隔符用 \ ,文件列表分隔符用分號 ;
linux下文件路徑分隔符用 / ,文件列表分隔符用冒號 :

 

下面我們來一步一步的分析一下。

aapt的用法有:

 

1. 列出apk包的內容

aapt l[ist] [-v] [-a] file.{zip,jar,apk}

-v 以table形式列出來

-a 詳細列出內容

2. 查看apk一些信息

aapt d[ump] [–values] WHAT file.{apk} [asset [asset …]]

badging 打印app包的label和icon

例如:aapt d permissions , 這個就是顯示這個apk所具有的權限

3. 編譯Android資源

aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] /

這個比較復雜,隻解釋幾個關鍵參數。

-f 如果編譯出來的文件已經存在,強制覆蓋。

-m 使生成的包的目錄放在-J參數指定的目錄。

-J 指定生成的R.java的輸出目錄

-S res文件夾路徑

-A assert文件夾的路徑

-M AndroidManifest.xml的路徑

-I 某個版本平臺的android.jar的路徑

-F 具體指定apk文件的輸出

例如:

1). 將工程的資源編譯R.java文件

aapt package -m -J -S -I -M

2). 將工程的資源編譯編譯到一個包裡

aapt package -f -S -I -A -M -F <輸出的包目錄>

4. 打包好的apk中移除文件

aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 …]

例如:aapt r <你的apk文件> AndroidManifest.xml, 這個就是將apk中的AndroidManifest移除掉

5. 添加文件到打包好的apk中

aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 …]

例如:aapt a <你的apk文件> <要添加的文件路徑>, 這個就是將文件添加到打包好的apk文件中

6. 顯示aapt的版本

aapt v[ersion]

例如:aapt v, 就是打印這個結果 Android Asset Packaging Tool, v0.2

javac 用於編譯Java文件,格式為:

使用Dex工具將class文件打包成dex文件

dx –dex [–debug] [–verbose] [–positions=

] [–no-locals]
[–no-optimize] [–statistics] [–[no-]optimize-list=] [–no-strict]
[–keep-classes] [–output=] [–dump-to=] [–dump-width=]
[–dump-method=[*]] [–verbose-dump] [–no-files] [–core-library]
[–num-threads=]
[.class | .{zip,jar,apk} | ] …
Convert a set of classfiles into a dex file, optionally embedded in a
jar/zip. Output name must end with one of: .dex .jar .zip .apk. Positions
options: none, important, lines.
dx –annotool –annotation= [–element=]
[–print=]
dx –dump [–debug] [–strict] [–bytes] [–optimize]
[–basic-blocks | –rop-blocks | –ssa-blocks | –dot] [–ssa-step=]
[–width=] [.class | .txt] …
Dump classfiles, or transformations thereof, in a human-oriented format.
dx –junit [-wait]
Run the indicated unit test.
dx –find-usages
Find references and declarations to a field or method.
declaring type: a class name in internal form, like Ljava/lang/Object;
member: a field or method name, like hashCode
dx -J …
Pass VM-specific options to the virtual machine that runs dx.
dx –version 打印版本號
dx –help 打印幫助信息
-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.

使用aapt打包文件,命令已經在上面介紹過。

使用apkbuildert生成未簽名的apk安裝文件

需要註意的是,最新的android sdk已經找不到apkbuider這個命令瞭,

而使用sdklib.jar裡面的com.android.sdklib.build.ApkBuilderMain這個類

使用jarsigner對未簽名的包進行apk簽名

第一步:生成keystore
第二步:jarsigner簽名apk

keytool -genkey -v -keystore android.keystore -alias android.keystore -keyalg RSA -validity 20000

jarsigner -verbose -keystore android.keystore -signedjar android_signed.apk android.apk android.keystore

jarsigner用法:[選項]
jar文件別名

jarsigner -verify [選項] jar文件

[-keystore ]密鑰庫位置

[-storepass ]用於密鑰庫完整性的口令

[-storetype ]密鑰庫類型

[-keypass ]專用密鑰的口令(如果不同)

[-sigfile ] .SF/.DSA文件的名稱

[-signedjar ]已簽名的JAR文件的名稱

[-digestalg ]摘要算法的名稱

[-sigalg ]簽名算法的名稱

[-verify]驗證已簽名的JAR文件

[-verbose]簽名/驗證時輸出詳細信息

[-certs]輸出詳細信息和驗證時顯示證書

[-tsa ]時間戳機構的位置

[-tsacert ]時間戳機構的公共密鑰證書

[-altsigner ]替代的簽名機制的類名

[-altsignerpath ]替代的簽名機制的位置

[-internalsf]在簽名塊內包含.SF文件

[-sectionsonly]不計算整個清單的散列

[-protected]密鑰庫已保護驗證路徑

[-providerName ]提供者名稱

[-providerClass 加密服務提供者的名稱

[-providerArg ]] …主類文件和構造函數參數

使用Zipalign優化程序包

Usage: zipalign [-f] [-v] infile.zip outfile.zip

zipalign -c [-v] infile.zip

: alignment in bytes, e.g. ’4′ provides 32-bit alignment

-c: check alignment only (does not modify file)

還有一些沒有提到,比如編譯so庫,編譯aidl文件。以後單獨說明。

歡迎掃描二維碼,一起學習交流

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *