我的出发点
接触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)
关于aapt
aapt,简单的说就是android开发提供的资源处理工具(android Asset Packaging Tool),随便安装一个版本的AIRSDK 你都可以找到他,例如我的是3.5(\AIR3.5\lib\android\bin\aapt),这个工具负责android所有资源的处理 大体功能有:
- 列出apk包的内容;
- 查看apk一些信息;
- 编译android资源;
- 打包好的apk中操作文件;
- 显示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
这篇教程是非常宝贵的经验,会让我们后来者少走很多弯路,非常感谢。估计你是被ANE坑惨了才摸索出来的吧……
我准备写成一个系列分析文章,不算是坑,应该说是之前的无知导致的后来一系列问题@airycanon
我们应该建议Adobe在ADT上面暴露更多的aapt参数,这样就可以省很多事了。
这个几乎
不可能,因为AIRSDK打包中加入了很多他自己定制的东西.例如包名的air等.我想问下,这几个adt有弄个pdf出来吗?我觉得挺不错的
http://www.shadowkong.com/archives/870这篇文章打不开了,求助啊
抱歉我也刚刚发现,博客升级之后出现了一点问题我先看看怎么解决,你先看E文版的吧.@wushi333333
你好,aapt中这个参数具体是指什么意思?自动添加覆盖资源?他的作用是什么?
–auto-add-overlay
@Andy Ding, 添加了这个参数之后 有更新的资源 会自动覆盖而不提示,如果没有 则会提示一下需要输入 yes或者no
有很多sdk不支持横屏,或者是支付会变竖屏,请问你们有没有好的解决办法。我看过你们对Uc的修改,很精彩。但是,挨家挨户都这么做是不是太复杂了?
@大宝, 我当时并没有找到能一下解决全部平台的方案.