AAPT基本使用方法
AAPT是终端中的可执行代码,所有的参数也是通过终端命令进行设定的,与一般的脚本程序类似。下面笔者将针对AAPT的常用功能,做进一步讲解(在使用AAPT工具时,需要将AAPT所在build-tool的目录加入环境变量或者在该目录下进行操作)。
列举APK内容文件
该命令的使用格式,如下所示。
- ➜ 23.0.2 ./aapt l[ist] <APK Path>
其中,list参数也可以简写为l。
利用上面的指令,可以列出该APK中的所有内容。例如,对一个测试的APK包执行以上指令,显示效果如下所示。
- ➜ 23.0.2 ./aapt list ……GradleTest/app/build/outputs/apk/app-xys.apk
- AndroidManifest.xml
- res/anim/abc_fade_in.xml
- ……
- res/anim/abc_slide_out_top.xml
- res/color-v11/abc_background_cache_hint_selector_material_dark.xml
- ……
- res/color/switch_thumb_material_light.xml
- res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png
- res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png
- res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png
- ……
- res/drawable/abc_textfield_search_material.xml
- res/layout-v17/abc_alert_dialog_button_bar_material.xml
- ……
- res/layout/support_simple_spinner_dropdown_item.xml
- res/mipmap-hdpi-v4/ic_launcher.png
- res/mipmap-mdpi-v4/ic_launcher.png
- res/mipmap-xhdpi-v4/ic_launcher.png
- res/mipmap-xxhdpi-v4/ic_launcher.png
- res/mipmap-xxxhdpi-v4/ic_launcher.png
- resources.arsc
- classes.dex
- lib/armeabi/test.so
- lib/armeabi-v7a/test.so
- META-INF/MANIFEST.MF
- META-INF/CERT.SF
- META-INF/CERT.RSA
由于一个APK文件包含的内容文件非常多,所以笔者在这里删掉了很多文件。你也可以使用Linux的重定向符“>”,将内容保存到文件中,代码如下所示。
- ➜ 23.0.2 ./aapt list …… /app-xys.apk > ……/apk.txt
这个技巧在很多地方都有使用到,比如最常用的是抓取Log到文件。除了grep命令(筛选)之外,head命令(显示头)、重定向符(定向输出)这些指令也使用得很多。
另外,还有一些更高级的操作指令,例如list命令后面还可以增加一些参数,代码如下所示。
- ➜ 23.0.2 ./aapt l[ist] [-v] [-a] <APK Path>
其中-v参数可以以表格的方式展示查询出来的内容,而-a参数可以输入所有目录下的内容。
查看指定文件信息
该命令的使用格式,如下所示。
- ➜ 23.0.2 ./aapt d[ump] [--values] <APK Path>
其中,dump参数可以简写为d,后面还可以跟上一个values参数。
这个指令使用得非常广泛,通过这个指令可以很方便地查看一个APK内容的详细信息,values参数的取值可以是以下几类。
- 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。
其中,xmltree和xmlstrings两个参数在APK后面需要写出具体的XML文件的路径。
- ➜ 23.0.2 ./aapt dump xmltree ……/app-xys.apk AndroidManifest.xml
可以发现,这个指令的功能非常强大,而且对于开发者来说很常用。事实上,很多PC端的Android助手工具,例如91助手、豌豆荚等也会使用AAPT的这些指令分析APK。
下面笔者就简单演示一下dump指令的使用,代码如下所示。
- ➜ 23.0.2 ./aapt d badging ……/app-xys.apk
- package: name='com.xys.gradletest.xys' versionCode='1'
- versionName='1.0' platformBuildVersionName='6.0-2438415'
- sdkVersion:'14'
- targetSdkVersion:'23'
- application-label:'GradleTest'
- ……
- application-label-kk-KZ:'GradleTest'
- application-label-uz-UZ:'GradleTest'
- application-icon-160:'res/mipmap-mdpi-v4/ic_launcher.png'
- ……
- application-icon-640:'res/mipmap-xxxhdpi-v4/ic_launcher.png'
- application: label='GradleTest' icon='res/mipmap-mdpi-v4/ic_launcher.png'
- launchable-activity: name='com.xys.gradletest.MainActivity' label='' icon=''
- feature-group: label=''
- uses-feature: name='android.hardware.touchscreen'
- uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps'
- main
- supports-screens: 'small' 'normal' 'large' 'xlarge'
- supports-any-density: 'true'
- locales: '--_--' 'ca' 'da' 'fa' 'ja' 'nb' 'de' 'af' 'bg' 'th' 'fi' 'hi' 'vi' 'sk' 'uk' 'el' 'nl' 'pl' 'sl' 'tl' 'am' 'in' 'ko' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'zu' 'lv' 'sv' 'iw' 'sw' 'fr-CA' 'lo-LA' 'en-GB' 'bn-BD' 'et-EE' 'ka-GE' 'ky-KG' 'km-KH' 'zh-HK' 'si-LK' 'mk-MK' 'ur-PK' 'sq-AL' 'hy-AM' 'my-MM' 'zh-CN' 'pa-IN' 'ta-IN' 'te-IN' 'ml-IN' 'en-IN' 'kn-IN' 'mr-IN' 'gu-IN' 'mn-MN' 'ne-NP' 'pt-BR' 'gl-ES' 'eu-ES' 'is-IS' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' 'ms-MY' 'az-AZ' 'kk-KZ' 'uz-UZ'
- densities: '160' '240' '320' '480' '640'
- native-code: 'armeabi' 'armeabi-v7a'
与之前一样,这个指令也会输出很多信息。这里笔者删减了一些信息。
由于dump指令可以显示很多信息,在实际开发中经常配合Linux的grep指令进行筛选,代码如下所示。
- ➜ 23.0.2 ./aapt d badging ……/app-xys.apk | grep package
- package: name='com.xys.gradletest.xys' versionCode='1'
- versionName='1.0' platformBuildVersionName='6.0-2438415'
通过这个方法,就过滤出了保护package的信息。
修改APK包
AAPT指令还提供了修改APK包的指令,如下所示。
- aapt p[ackage]:打包生成资源压缩包。
- aapt r[emove]:从压缩包中删除指定文件。
- aapt a[dd]:向压缩包中添加指定文件。
这些指令对于一般的上层开发者来说并不是很常用,只是在做一些软件汉化、破解的时候会使用得比较多。
显示AAPT版本信息
该指令的使用格式,如下所示。
- ➜ 23.0.2 ./aapt v[ersion] <APK Path>
其中version指令可以简写成v。这个指令用于打印AAPT工具的版本信息,使用示例如下所示。
- ➜ 23.0.2 ./aapt v ……/app-xys.apk
- (ignoring extra arguments)
- Android Asset Packaging Tool, v0.2-2355899
