解密ADT第一篇-aapt详解

我的出发点

接触AIR将近有一年的时间,这一年里遇到很多很多的问题,从AIR FOR ANDROID 的APK签名错误,到ANE的适应所有调用原生,再到APK的加密解密反编译,然后是跨IOS/ANDROID  一路伴随AIR走来,AIR从3.4到现在的4.0,应该说见证了一些东西的发生与过程.一直以来希望找一个切入点 而形成一系列的分析文章,刚好今天临下班前突然奇想,其实我可以从分析AIR的打包工具ADT开始.于是萌发了写这篇(如果有后续的话 包括后续)文章的想法,现在第一篇我想把aapt这个工具的使用详细分析.并最终给出在写ANE过程中困扰我已久的最有效资源处理方式.

PS:为什么我会从一个工具开始说,因为ADT就像汽车一样,而aapt则是ADT的后轮的轮胎中的打气孔

AIR Developer Tool (ADT)

AIR Developer Tool (ADT) 是用于开发 AIR 应用程序的多用途命令行工具。您可以使用 ADT 执行以下任务:
• 将 AIR 应用程序打包为 .air 安装文件
• 将 AIR 应用程序打包为本机安装程序。例如:在 Windows 上打包为 .exe 安装程序文件,在 iOS 上打包为 .ipa,或者在
Android 上打包为 .apk
• 将本机扩展打包为 AIR 本机扩展 (ANE) 文件
• 使用数字证书对 AIR 应用程序签名
• 更改(迁移)用于应用程序更新的数字签名
• 确定连接到计算机的设备
• 创建自签名的数字代码签名证书
• 远程安装、启动和卸载移动设备上的应用程序
• 远程安装和卸载移动设备上的 AIR 运行时
ADT 是一个 Java 程序,它包含在 AIR SDK 中。必须具有 Java 1.5 或更高版本才能使用该程序。SDK 包括用于调用 ADT 的
脚本文件。若要使用此脚本,必须在路径环境变量中包含 Java 程序的位置。如果路径环境变量中还列出了 AIR SDK bin 目录,
您可以在命令行中键入带有适当参数的 adt,以调用 ADT。(如果您不知道如何设置路径环境变量,请参阅操作系统文档。如
需进一步帮助,

关于aapt

aapt,简单的说就是android开发提供的资源处理工具(android Asset Packaging Tool),随便安装一个版本的AIRSDK 你都可以找到他,例如我的是3.5(\AIR3.5\lib\android\bin\aapt),这个工具负责android所有资源的处理  大体功能有:

  1. 列出apk包的内容;
  2. 查看apk一些信息;
  3. 编译android资源;
  4. 打包好的apk中操作文件;
  5. 显示aapt的版本;

除了3,4 我们无视其他的.下面详细介绍aapt编译android资源.

首先是第4点.

例如给打包好的APK添加文件进去,FlashBuilder打包APK是无法打包apk,jar 等特殊资源进去项目里的,若要打包APK等资源进去项目里面  现在除了使用ADT命令行打包之外 还有一种方式就是通过aapt.例如我要把 command.txt文件打包进去anime.apk里面,aapt轻松可以完成:

[code lang=”java”]

//aapt a apk文件 需要打包进去的文件

aapt a anime.apk command.txt

[/code]

然后是第3点.


在这里我要对aapt每一个命令进行解释,这篇的内容注定又臭又长,但是没关系 对于我这个健忘症患者来说.
aapt编译资源命令比较复杂:

[code lang=”java”]
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] …]
[/code]

  • p[package]:aapt编译资源头命令;
  • -d:包括一个或多个设备资源,由逗号分隔;
  • -f:覆盖现有的文件命令,加上后编译生成直接覆盖目前已经存在的R.java;
  • -m:使生成的包的目录放在-J参数指定的目录;
  • -u:更新现有的包 u = update;
  • -v:详细输出,加上此命令会在控制台输出每一个资源文件信息,R.java生成后还有注释,好人道的命令;
  • -x:创建扩展资源ID;
  • -z:需要本地化的资源属性标记定位,这个命令就是导致写ANE过程中需要资源国际化的罪魁祸首,在ADT中打包android资源恰恰加了这个命令
  • -M:AndroidManifest.xml的路径;
  • -0:指定一个额外的扩展等,. apk文件将不会存储压缩。之前有朋友发现打包音乐文件在ANE被压缩一次 在APK又被压缩一次,正是由于没指定额外文件所导致,不知道那个朋友现在有没解决这个问题.若修改编译资源文件 则估计他的那个ANE音乐文件就可以用了.
  • -g:制定像素迫使图形的灰度,这个命令不是很理解;
  • -j:指定包含一个jar或zip文件包,这个命令很特别 深入研究应该能应用到ANE中;
  • –debug-mode:指定的是调试模式下的编译资源;
  • –min-sdk-versopm VAL:最小SDK版本  如是7以上 则默认编译资源的格式是 utf-8,是不是可以这样理解 如果不是7以上 则不是utf-8,这是不是可以解释为什么在-app.xml中定义的android参数中不可以有中文的原因?看到这个命令 当时遇到的问题还历历在目;
  • –target-sdk-version VAL:在androidMainfest中的目标编译SDK版本;
  • –app-version VAL:应用程序版本号;
  • –app-version-name TEXT:应该程序版本名字;
  • –custom-package VAL:生成R.java到一个不同的包中,这个命令可以解决ANE资源去不到的问题,如果加上了则可以去掉我编写的ANE教程中处理资源的所有过程.;
  • –rename-mainifest-package PACKAGE:修改APK包名的选项;
  • –rename-instrumentation-target-package PACKAGE:重写指定包名的选项;
  • –utf16:资源编码修改为更改默认utf – 16编码;
  • –auto-add-overlay:自动添加资源覆盖
  • –max-res-version:最大资源版本
  • -I:指定的SDK版本中android.jar的路径
  • -A:assert文件夹的路径;
  • -G:一个文件输出混淆器选项,后面加文件逗号隔开.
  • -P:指定的输出公共资源,可以制定一个文件 让资源ID输出到那上面;
  • -S:指定资源目录 一般是 res
  • -F:指定把资源输出到 apk文件中
  • -J:指定R.java输出的路径
  • raw-file-dir:附加打包进APK的文件,在移动MM的ANE中可以使用这个命令来把资源打包进去,这样就省去了繁杂的一堆命令操作.

到此基本上aapt的所有命令都解析了一遍了,下面编写一个命令来编译资源  :

[code lang=”java”]
//无资源国际化:
aapt package
-f -m -J out -S res
-I D:\ANE\android\android-2.1_r01-windows\platforms\android-17\android.jar
-M AndroidManifest.xml
//加了-z之后强制资源国际化
aapt package
-f -m -z -J out -S res
-I D:\ANE\android\android-2.1_r01-windows\platforms\android-17\android.jar
-M AndroidManifest.xml
[/code]

现在给出答案,之前编写ANE教程中的打包res资源文字国际化的问题 正是因为ADT在编译android资源的时候增加了 -z 命令~

案例地址

Anti-ADT:https://github.com/recter/Anti-ADT

《解密ADT第一篇-aapt详解》有11个想法

  1. 这篇教程是非常宝贵的经验,会让我们后来者少走很多弯路,非常感谢。估计你是被ANE坑惨了才摸索出来的吧……

  2. 我们应该建议Adobe在ADT上面暴露更多的aapt参数,这样就可以省很多事了。

  3. 这个几乎不可能,因为AIRSDK打包中加入了很多他自己定制的东西.例如包名的air等.

  4. 你好,aapt中这个参数具体是指什么意思?自动添加覆盖资源?他的作用是什么?
    –auto-add-overlay

    1. @Andy Ding, 添加了这个参数之后 有更新的资源 会自动覆盖而不提示,如果没有 则会提示一下需要输入 yes或者no

  5. 有很多sdk不支持横屏,或者是支付会变竖屏,请问你们有没有好的解决办法。我看过你们对Uc的修改,很精彩。但是,挨家挨户都这么做是不是太复杂了?

发表评论

邮箱地址不会被公开。 必填项已用*标注