android aapt (android asset packaging tool)使用详解

[size=medium]最近在研究android自带的编译 打包工具,关于aapt 这位仁兄的文章写的不错!

转自:[url]http://mmmyddd.freeshell.net/blog.cgi/Computer/Android/aapt-decompress-apk[/url]
TOPAAPT 工具介绍

下面是取自"http://www.androidcn.net/wiki/index.php/Reference/aapt"的介绍

aapt stands for Android Asset Packaging Tool and is included in the tools/ directory of the SDK. This tool allows you to view, create, and update Zip-compatible archives (zip, jar, apk). It can also compile resources into binary assets.

aapt即Android Asset Packaging Tool , 在SDK的tools/目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件.

Though you probably won't often use aapt directly, build scripts and IDE plugins can utilize this tool to package the apk file that constitutes an Android application.

尽管你可能没有直接使用过aapt工具, 但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序.

For more usage details, open a terminal, go to the tools/ directory, and run the command:

获取更多的实用信息, 请打开终端控制台, 到tools/目录下, 执行命令:

Linux or Mac OS X:

./aapt

Windows:

aapt.exe

TOPAAPT 的帮助信息

执行上述命令,会在控制台打出相应aapt的信息:

Android Asset Packaging Tool

Usage:
aapt l[ist] [-v] [-a] file.{zip,jar,apk}
List contents of Zip-compatible archive.

aapt d[ump] 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 p[ackage] [-f][-u][-m][-v][-x][-M AndroidManifest.xml] \
[-0 extension [-0 extension ...]] \
[-I base-package [-I base-package ...]] \
[-A asset-source-dir] [-P public-definitions-file] \
[-S resource-sources] [-F apk-file] [-J R-file-dir] \
[raw-files-dir [raw-files-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.

aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]
Delete specified files from Zip-compatible archive.

aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]
Add specified files to Zip-compatible archive.

aapt v[ersion]
Print program version.

Modifiers:
-a print Android-specific data (resources, manifest) when listing
-c specify which configurations to include. The default is all
configurations. The value of the parameter should be a comma
separated list of configuration values. Locales should be specified
as either a language or language-region pair. Some examples:
en
port,en
port,land,en_US
If you put the special locale, zz_ZZ on the list, it will perform
pseudolocalization on the default locale, modifying all of the
strings so you can look for strings that missed the
internationalization process. For example:
port,land,zz_ZZ
-d one or more device assets to include, separated by commas
-f force overwrite of existing files
-j specify a jar or zip file containing classes to include
-m make package directories under location specified by -J
-u update existing packages (add new, replace older, remove deleted files)
-v verbose output
-x create extending (non-application) resource IDs
-z require localization of resource attributes marked with
localization="suggested"
-A additional directory in which to find raw asset files
-F specify the apk file to output
-I add an existing package to base include set
-J specify where to output R.java resource constant definitions
-M specify full path to AndroidManifest.xml to include in zip
-P specify where to output public resource definitions
-S directory in which to find resources
-0 specifies an additional extension for which such files will not
be stored compressed in the .apk. An empty string means to not
compress any files at all.

根据以上帮助信息,用aapt可以使用以下操作:
TOP查看AAPT的版本

./aapt v

得到当前工具的版本:

Android Asset Packaging Tool, v0.2

TOP使用AAPT列出资源包(.apk)文件列表

aapt l[ist] [-v] [-a] file.{zip,jar,apk}
List contents of Zip-compatible archive.

可以用命令查看系统资源包的内容:

./aapt l framework-res.apk

META-INF/MANIFEST.MF
META-INF/CERT.SF
META-INF/CERT.RSA
AndroidManifest.xml
assets/images/android_320x480.png
assets/images/boot_robot.png
assets/images/boot_robot_glow.png

...

assets/webkit/youtube.html
assets/webkit/youtube.png
res/anim/accelerate_decelerate_interpolator.xml
res/anim/accelerate_interpolator.xml
res/anim/app_starting_exit.xml

...

res/raw-de/loaderror.html
res/raw-de/nodomain.html
res/raw/fallbackring.ogg
res/raw/loaderror.html
res/raw/nodomain.html
res/xml-en/autotext.xml
res/xml/apns.xml
res/xml/autotext.xml
res/xml/preferred_time_zones.xml
res/xml/time_zones_by_country.xml
resources.arsc

如果采用-v选项,会将所有文件的详细信息打印出来:

Archive: framework-res.apk
Length Method Size Ratio Date Time CRC-32 Name
-------- ------ ------- ----- ---- ---- ------ ----
76217 Deflate 25576 66% 04-16-08 07:40 3b7140fa META-INF/MANIFEST.MF
76259 Deflate 25706 66% 04-16-08 07:40 a21d76be META-INF/CERT.SF
1714 Deflate 1156 33% 04-16-08 07:40 ca66d55e META-INF/CERT.RSA
31768 Deflate 5556 83% 01-16-09 12:04 8c137ee8 AndroidManifest.xml
3098 Stored 3098 0% 01-15-09 23:16 ed1132c9 assets/images/android_320x480.png
1001 Stored 1001 0% 01-15-09 23:16 c53ad035 assets/images/boot_robot.png
2083 Stored 2083 0% 01-15-09 23:16 12acc29d assets/images/boot_robot_glow.png

... ...

340 Deflate 155 54% 01-16-09 12:04 cc2ad7f2 res/anim/accelerate_decelerate_interpolator.xml
368 Deflate 179 51% 01-16-09 12:04 c94b9323 res/anim/accelerate_interpolator.xml
568 Deflate 260 54% 01-16-09 12:04 e0972304 res/anim/app_starting_exit.xml

... ...

605 Deflate 296 51% 01-15-09 23:16 88710568 res/raw-de/loaderror.html
996 Deflate 471 53% 01-15-09 23:16 c42ea004 res/raw-de/nodomain.html
10975 Stored 10975 0% 01-15-09 23:16 21dc2fce res/raw/fallbackring.ogg
579 Deflate 282 51% 01-15-09 23:16 11c56b88 res/raw/loaderror.html
890 Deflate 418 53% 01-15-09 23:16 393cf037 res/raw/nodomain.html
25588 Deflate 5051 80% 01-16-09 12:04 cf7826df res/xml-en/autotext.xml
164 Deflate 97 41% 01-16-09 12:04 ee886635 res/xml/apns.xml
116 Deflate 59 49% 01-16-09 12:04 885f246d res/xml/autotext.xml
864 Deflate 312 64% 01-16-09 12:04 65ad9d7e res/xml/preferred_time_zones.xml
61044 Deflate 11755 81% 01-16-09 12:04 0bc79a58 res/xml/time_zones_by_country.xml
747776 Stored 747776 0% 01-16-09 12:04 98f996b3 resources.arsc
-------- ------- --- -------
2246729 1774656 21% 851 files

如果采用-a选项,会在上述文件列表之后,打印出android使用的符号表:

Resource table:
mError=0x0 (Success)
Package Groups (1)
Package Group 0 id=1 packageCount=1 name=android
Package 0 id=1 name=android typeCount=13
type 0 configCount=1 entryCount=599
spec resource 0x01010000 android:attr/theme: flags=0x40000000
spec resource 0x01010001 android:attr/label: flags=0x40000000
spec resource 0x01010002 android:attr/icon: flags=0x40000000
spec resource 0x01010003 android:attr/name: flags=0x40000000
spec resource 0x01010004 android:attr/manageSpaceActivity: flags=0x40000000
spec resource 0x01010005 android:attr/allowClearUserData: flags=0x40000000
spec resource 0x01010006 android:attr/permission: flags=0x40000000
spec resource 0x01010007 android:attr/readPermission: flags=0x40000000
spec resource 0x01010008 android:attr/writePermission: flags=0x40000000
spec resource 0x01010009 android:attr/protectionLevel: flags=0x40000000
spec resource 0x0101000a android:attr/permissionGroup: flags=0x40000000
... ...

这些符号表的格式还需要进一步研究才能搞明白 -_-!
TOP使用AAPT打包资源文件

使用以下命令查看android的build系统是如何打包framework-res模块的:

cd ~/android/src
make -n --debug framework-res

以下是从输出提取的关键步骤:

1. 第一步,生成资源apk包,由以下命令完成:

out/host/linux-x86/bin/aapt package -z -u -x -M frameworks/base/core/res/AndroidManifest.xml -S frameworks/base/core/res/res
-A frameworks/base/core/res/assets -F out/target/product/generic/obj/APPS/framework-res_intermediates/package.apk

2. 第二步,为生成的资源包做签名:

java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/secur
ity/platform.pk8 out/target/product/generic/obj/APPS/framework-res_intermediates/package.apk.unsigned out/target/product/gene
ric/obj/APPS/framework-res_intermediates/package.apk.signed

3. 第三步,为生成的包做对齐处理:

out/host/linux-x86/bin/zipalign -f 4 out/target/product/generic/obj/APPS/framework-res_intermediates/package.apk.unaligned ou
t/target/product/generic/obj/APPS/framework-res_intermediates/package.apk.aligned

如此生成的framework-res.apk包可以被用来替换system.img中的资源包。(在CupCake前的稳定版本中测试可行)

具体步骤:

1. 首先用生成的framework-res.apk替换在~/android/src/out/target/product/generic/system/framework中的同名文件。
2. 用make snod生成新的system.img,替换sdk目录下的images/system.img
3. 用-wipe-date参数启动emulator

TOP使用AAPT解压资源包(.apk)

./aapt d xmltree framework-res.apk res/anim/fade_in.xml

N: android=http://schemas.android.com/apk/res/android
E: alpha (line=21)
A: android:interpolator(0x01010141)=@0x10a0006
A: android:duration(0x01010198)=(type 0x10)0x12c
A: android:fromAlpha(0x010101ca)=(type 0x4)0x0
A: android:toAlpha(0x010101cb)=(type 0x4)0x3f800000

./aapt d xmlstrings framework-res.apk res/anim/fade_in.xml

String #0: interpolator
String #1: fromAlpha
String #2: toAlpha
String #3: duration
String #4: android
String #5: http://schemas.android.com/apk/res/android
String #6:
String #7: alpha

而没有经过编译的文件为:

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/decelerate_interpolator"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="300" />

相应的R.java文件为:

package com.android.internal;

public final class R {
public static final class anim {
public static final int accelerate_decelerate_interpolator=0x010a0004;
public static final int accelerate_interpolator=0x010a0005;
public static final int app_starting_exit=0x010a0007;
public static final int decelerate_interpolator=0x010a0006;
public static final int dialog_enter=0x010a0008;
public static final int dialog_exit=0x010a0009;
... ...

也可以从符号表中得到这些索引值:

resource 0x010a0006 android:anim/decelerate_interpolator: t=0x03 d=0x00001132 (s=0x0008 r=0x00) (PUBLIC)

配合系统预定的framework/base/core/res/res目录的模版,就可以重建/res文件.

具体过程后续。
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当你在使用Android开发中的aapt2编译资源时,可能会遇到"android aapt2 error: check logs for details"的错误提示。这个错误通常是由于资源文件的问题引起的。 首先,我们需要检查错误日志以获取更多的详细信息。你可以在命令行中运行aapt2编译资源的命令时,添加"--verbose"或者"--debug"的参数来获取详细的日志输出。 错误日志可能会包含有关具体资源文件的错误信息。例如,它可能指示某个资源文件不存在、资源文件命名不规范、资源文件中的内容格式错误等。通过查看错误日志,你可以找到具体的错误原因,从而采取相应的修复措施。 在排除资源文件中可能存在的问题后,你还应该检查项目的依赖情况。确保所需的库和插件已正确添加到项目中,并且版本兼容。有时候,错误可能是由于不兼容的库或插件引起的。 此外,你还可以尝试清理项目并重新构建,以确保所有的资源文件都被正确编译和链接。清理项目可以清除可能存在的缓存文件和临时生成的资源文件,从而消除潜在的问题。 总之,"android aapt2 error: check logs for details"是一个相对较常见的错误,通常与资源文件有关。通过检查错误日志以及确定项目的依赖情况是否正确,你应该能够解决这个问题并成功编译你的Android应用程序。 ### 回答2: Android aapt2错误是指在使用aapt2(Android Asset Packaging Tool 2)时出现问题。aapt2是一个用于将资源文件编译和打包成Android应用的工具。当出现aapt2错误时,系统会提示"check logs for details",即检查日志获取详细信息。 要解决这个错误,首先要查看日志以获取具体的错误信息。可以通过以下步骤来检查日志: 1. 在Android Studio中打开项目。 2. 在底部工具栏中找到"Gradle Console"(Gradle控制台)。 3. 点击Gradle Console,在控制台中查看相关错误信息。 在日志中可能会显示以下类型的错误信息: - 缺少资源:aapt2在编译过程中发现某些资源文件缺失。可以通过确认资源文件的存在性,并在项目中确保它们的正确引用来解决此问题。 - 命名冲突:aapt2发现两个或多个资源具有相同的名称。要解决此问题,请确保所有资源的名称唯一,并在代码中正确引用它们。 - 资源格式错误:aapt2无法处理某些资源文件,可能是因为其格式不正确。可以尝试重新生成或转换这些资源文件,以确保其格式符合要求。 调试解决aapt2错误可参考以下方法: 1. 确保使用最新版本的Android SDK和Gradle插件。 2. 清理和重新构建项目,以确保资源文件正确编译。 3. 检查项目中的资源文件,确保它们的格式正确并且没有命名冲突。 4. 检查项目中的引用,确保资源文件的路径和名称正确。 5. 在项目的build.gradle文件中,尝试禁用aapt2并启用aapt1。可以通过将以下代码添加到android块中来实现: ``` aaptOptions { useNewCruncher false } ``` 这将使用aapt1而不是aapt2来处理资源文件。 总之,一般来说,通过查看aapt2的错误日志,并根据其中的提示进行调试和解决,可以解决android aapt2错误。 ### 回答3: 当我们在使用Android开发中遇到"aapt2 error: check logs for details"错误时,这通常表示我们在构建Android项目时遇到问题。具体原因可能有很多,但是我们可以通过检查日志文件来获得详细的错误信息和解决方法。 要查看日志文件,我们可以按照以下步骤操作: 1.打开Android Studio,并定位到项目结构视图。 2.在项目结构视图中,选择app模块,然后展开它。 3.在app模块中,我们可以找到一个名为"Build"或"Gradle"的文件夹。展开该文件夹以查看更多选项。 4.在Gradle文件夹中,我们可以找到名为"aapt2"的文件夹。在该文件夹中,我们可以找到一个名为"aapt2_stderr.log"的日志文件。 5.通过双击"aapt2_stderr.log"文件,我们可以打开它并查看其中的错误信息。 这个日志文件会提供关于错误的详细信息,帮助我们找出造成"aapt2 error"的具体原因。通常,它会包含有关资源文件的问题,比如重复的资源名称、无效的资源文件等。 根据错误日志中提供的信息,我们可以采取适当的措施来解决问题。一些常见的解决方法包括: 1.检查你的资源文件,确保命名正确,没有重复的资源名称。 2.确保所有的资源文件都是有效的,没有损坏或格式错误。 3.尝试清理和重建项目,以防止一些临时的构建问题。 4.确保你的Gradle版本和插件版本是兼容的,可以尝试更新Gradle版本或插件版本来解决一些已知的问题。 需要注意的是,每个错误都有不同的原因和解决方法,因此我们需要根据具体的错误信息来进行调查和处理。如果问题仍然存在,我们可以通过在网上搜索相关错误信息或在社区论坛提问来获取更多帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值