守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1213|回复: 1

[Android] 解密ADT第一篇-aapt详解

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51717
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-19 10:41:08 | 显示全部楼层 |阅读模式
    本帖最后由 破晓 于 2015-1-20 15:14 编辑

    我的出发点

    接触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开发提供的资源处理工具(androidAsset 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轻松可以完成:


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

    2. aapt a anime.apk command.txt
    复制代码
    然后是第3点.

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


    1. aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z]/
    2. [-M AndroidManifest.xml] /
    3. [-0 extension [-0 extension ...]]/
    4. [-g tolerance] [-j jarfile] /
    5. [--debug-mode] [--min-sdk-version VAL]/
    6. [--target-sdk-version VAL] /
    7. [--app-version VAL] [--app-version-name TEXT] /
    8. [--custom-package VAL] /
    9. [--rename-manifest-package PACKAGE] /
    10. [--rename-instrumentation-target-package PACKAGE] /
    11. [--utf16] [--auto-add-overlay] /
    12. [--max-res-version VAL] /
    13. [-I base-package [-I base-package ...]] /
    14. [-A asset-source-dir] [-G class-list-file]/
    15. [-P public-definitions-file] /
    16. [-S resource-sources [-S resource-sources ...]]/
    17. [-F apk-file] [-J R-file-dir] /
    18. [--product product1,product2,...] /
    19. [raw-files-dir [raw-files-dir] ...]
    复制代码
    • 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的所有命令都解析了一遍了,下面编写一个命令来编译资源  :
    1. //无资源国际化:
    2. aapt package
    3.    -f -m -J out -S res
    4.     -I D:\ANE\android\android-2.1_r01-windows\platforms\android-17\android.jar
    5.      -M AndroidManifest.xml
    6. //加了-z之后强制资源国际化
    7. aapt package
    8.      -f -m -z -J out -S res
    9.      -I D:\ANE\android\android-2.1_r01-windows\platforms\android-17\android.jar
    10.      -M AndroidManifest.xml
    复制代码
    现在给出答案,之前编写ANE教程中的打包res资源文字国际化的问题 正是因为ADT在编译android资源的时候增加了 -z 命令~


    案例地址


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




    本文来自:http://shadowkong.com/archives/1393



    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51717
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-19 11:03:55 | 显示全部楼层
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-9-15 14:24 , Processed in 0.042509 second(s), 30 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表