在研究Android4.4KitKat中Phone模块的变化挺大的,详细可参考http://blog.csdn.net/yihongyuelan/article/details/19930861,当然这不是本文所讨论的重点,在修改编译了package/app/InCallUI后,将生成的InCallUI.apk push到对应的目录下,打电话测试并没有修改后的痕迹,最后经过尝试,编译了package/app/Dialer,将生成的Dialer.apk push到对应的目录,问题解决。为什么修改的InCallUI的内容却要编译Dialer呢?查看mk文件发现
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.android.contacts.common \
--extra-packages com.android.incallui
这样就引出了本来所要讨论的重点:AAPT
1. 什么是AAPT?
AAPT(Android Asset Packaging Tool) 在SDK的tools/目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具, 但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序.
2.以下是AAPT的指令
2.1 列出apk包的内容
aapt l[ist] [-v] [-a] file.{zip,jar,apk}
-v 以table形式列出来
-a 详细列出内容
2.2 查看apk一些信息
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 asse
比如 aapt dump badging <file_path.apk>
2.3 编译android资源
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,...] /
[raw-files-dir [raw-files-dir] ...]
这个比较复杂,只解释几个关键参数。
-f 如果编译出来的文件已经存在,强制覆盖。
-m 使生成的包的目录放在-J参数指定的目录。
-J 指定生成的R.java的输出目录
-S res文件夹路径
-A assert文件夹的路径
-M AndroidManifest.xml的路径
-I 某个版本平台的android.jar的路径
-F 具体指定apk文件的输出
2.4 打包好的apk中移除文件
aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]
例如:aapt r <你的apk文件> AndroidManifest.xml, 这个就是将apk中的AndroidManifest移除掉
2.5. 添加文件到打包好的apk中
aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]
例如:aapt a <你的apk文件> <要添加的文件路径>, 这个就是将文件添加到打包好的apk文件中
到这里对于AAPT我们有了一个初步的认识,那么和我们刚开始讨论的问题有什么联系呢?其实上面MK文件中的那段代码是一种将多个工程合并成一个apk的方法。也就是将 com.android.contacts.common和com.android.incallui一起打包到Dialer.apk,具体做法如下:
1. 加入以上的LOCAL_AAPT_FLAGS
LOCAL_AAPT_FLAGS := \--auto-add-overlay \--extra-packages com.android.contacts.common \--extra-packages com.android.incallui
2. 将com.android.contacts.common和com.android.incallui的AndroidManifest.xml文件中的内容移植到Dialer的AndroidManifest.xml
3. 再用mm指令编译并生成Dialer.apk,到此就将com.android.contacts.common和com.android.incallui一起打包到Dialer.apk中了,因此当我们替换InCallUI.apl的时候并不起作用。