aapt是Android sdk中提供的一个小工具,功能十分强大。appt:Android Asset Packaging Tool ,在sdk的build-tools下,这个工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件。我们可能没有直接使用过这个命令,但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序,具体位于adt-bundle-mac-x86_64-20140702/sdk/build-tools/ 这个目录下,可能在里面存在不同api的目录。
这个和你下载的api版本有关,但里面都有aapt工具,下面来说说具体用法,在windows上aapt存在方式为aapt.exe,直接appt就可以执行;Linux或Mac上是一个可执行文件aapt,通过./aapt 执行。如果没有配置环境变量,可以到aapt所在目录执行对应命令;当然你也可以按照配置adb命令那样配置aapt,这样在Terminal或dos窗口就能直接执行aapt命令。
在~/.bash_profile文件里添加如下:
export PATH=${PATH}:/your_path/sdk/build-tools/25.0.2
具体路径可以先进到build-tools目录,然后执行pwd命令获取路径,其实通过aapt 就会打印所有的用法。
下面简单总结下几个用法
1、列举apk里所有文件
aapt l qq.apk
aapt l 有如下参数:
-v:会以table的形式输出目录,table的表目有:Length、Method、Size、Ratio、Date、Time、CRC-32、Name。
aapt l -v qq.apk
其中Method表示压缩形式,有:Deflate及Stored两种,即该Zip目录采用的算法是压缩模式还是存储模式;可以看出resources.arsc、*.png采用压缩模式,而其它采用压缩模式,Ratio表示压缩率,CRC-32循环冗余校验
-a:会详细输出所有目录的内容.比如想知道apk包名,可以配合grep命令
aapt l -a *.apk | grep "package"
2、aapt d[ump] [--values] [--include-meta-data] WHAT file.{apk} [asset [asset ...]]
strings Print the contents of the resource table string pool in the APK. //查询字符串
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. 以树形结构输出的xml信息
xmlstrings Print the strings of the given compiled xml assets. 输出xml文件中所有的字符串信息
利用aapt dump查看apk包的packageName、versionCode、applicationLabel、launcherActivity、permission等各种详细信息
aapt d badging *.apk
当然如果只想查询权限或string只需把badging替换成strings或permissions就行,具体dump后接的参数可以看上面
aapt d permissions *.apk
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] \
[-D main-dex-class-list-file] \
[-S resource-sources [-S resource-sources ...]] \
[-F apk-file] [-J R-file-dir] \
[--product product1,product2,...] \
[-c CONFIGS] [--preferred-density DENSITY] \
[--split CONFIGS [--split CONFIGS]] \
[--feature-of package [--feature-after package]] \
[raw-files-dir [raw-files-dir] ...] \
[--output-text-symbols DIR]
Package the android resources. It will read assets and resources that are supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R options control which files are output.
-f 如果编译出来的文件已经存在,强制覆盖。
-m 使生成的包的目录放在-J参数指定的目录。
-J 指定生成的R.Java的输出目录
-S res文件夹路径
-A assert文件夹的路径
-M AndroidManifest.xml的路径
-I 某个版本平台的android.jar的路径
-F 具体指定apk文件的输出
将工程的资源编译R.java文件
aapt package -m -J -S -I -M
将工程的资源编译编译到一个包里
aapt package -f -S -I -A -M -F <输出的包目录>
4、从打包好的文件中删除指定文件
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 c[runch] [-v] -S resource-sources ... -C output-folder ...
Do PNG preprocessing on one or several resource folders and store the results in the output folder.
aapt s[ingleCrunch] [-v] -i input-file -o outputfile
Do PNG preprocessing on a single file.
7、aapt v[ersion] 查看aapt版本号