解密ADT第六篇-DIY MY ADT

前言

拔开云雾见到明月之后才发现柳暗花明又一村.

    这篇文章是解密ADT系列中解密air for android的最终篇(希望是最终,本来上一篇想做最终篇的 但是发现越写越多越乱,于是就把它拆开了),在前四篇文章中说的东西可能没什么实际用途,那么这一篇 我就说说之前那么多分析 对于我们的项目究竟有什么用?下面我就列举几个ANE巨坑(所谓的坑,即使归根到底是由于自己当初的无知),这篇文章即将要针对这几个问题给出完美解决方式的,当然这些问题我在之前的ANE教程中已经有当时认为是完美的解决方式.
 
 

修改的内容


1.自定义AIR主activity的launchMode,解决平台支付过程中activity堆栈被切掉的问题.

说明:改为默认的launchMode:android:launchMode="standard"

2.去除包名前缀"air.",虽然这无伤大雅 但是前缀带air总有一种不太好的感觉.

说明:默认为设置环境变量“AIR_NOANDROIDFLAIR=true”可去掉,

3.去除android资源国际化限制.

说明:修改aapt编译参数

4.彻底解决android资源ID找不到的问题.

说明:增加资源库复制,输入自定路径可生成相应的路径ID文件。

具体做法为在Android-ARM下建RDT/RDT.xml。然后配置<resourceid>属性

详细的请看demo。

5.解决ANE中引用so库调试版发行版不一致的问题.

说明:统一改为armeabi-v7a下。

6.ANE中加入多jar库引用,去除ANE中合并jar的步骤.

说明:把SDK的所有jar库放到Android-ARM/RDT/下

7.ANE中彻底解决资源ID错乱问题.(不是找不到ID,是ID数值偏差,在ANE中偶有发生).

8.可打包任意文件进APK根目录,以应对类似移动MM 联想支付等问题.

说明:把需要打包进APK根目录的文件放到Android-ARM/ROOT下

9.更改程序风格,实现默认全部activity全屏(适用于游戏项目)

说明:修改程序<application>默认风格。

10.修改默认raw下的文件,用以解决部分ANE需要在raw文件夹下操作音频文件的内存冲突

11.尽最大限度让AIR for android项目在打包上无限接近原生android项目.


已实现:1,2,3,4,5,6,7,9

我把个人定制的ADT命名为RDT(Rect`s ADT)

RDT v1.0版:https://github.com/recter/Anti-ADT/tree/master/RDT

配置说明:

把Anti-ADT/RDT/RDT.bat 放到 Adobe Flash Builder 4.6\sdks\AIR3.5\bin 下

把Anti-ADT/RDT/RDT.jar 放到 Adobe Flash Builder 4.6\sdks\AIR3.5\lib 下

ANE文件配置案例:

查看:传送门

调用说明:

查看 传送门

 

36 评论

  1. 没用软件..我是直接改反汇编的.jar库文件可以反编译成反汇编代码,反汇编代码可以回编译成jar,原理就是这样,对于反汇编怎么读懂的话,如果您有兴趣我建议先从16位的汇编开始.@卓天

  2. 使用RDT编译我的项目不成功。其它的都能看懂不知道DEMO里面的swf.和-app.xml你是怎么来的。我是找包APk然后解压COPY出来。用RDT打包不了包。跑求指导一下。

  3. rdt如何把air运行时打包进去?我用-target apk-captive-runtime 打包出来的apk安装报错。

    1. @fantasy, 使用RDT打包APK, ANE的配置组合是和官方的不同的哟,详细请看我的demo,还有报什么错呢?

      1. @Rect, 嗯 方法都是按照你的demo做的,问题解决了,是我之前配置问题~谢谢~

  4. 我写了一个简单的测试项目,就是把一个生成的ANE放到FB里了,然后导出发行版,发现只有FB的bin-debug文件夹下有*.xml根*.swf,没有bin-release文件夹,然后我拿这这两个文件去生成APK,安装的时候说安装包损坏,我把FB导出发行版的APK反编译出来的SWF放进去也是安装包损坏,那个XML里面我有把所有根debug相关的删除过。现在的问题是我不知道这两个文件怎么取得的,XML根SWF。我还是初学,可能之前的有问题,我在检查检查,但是这两个文件我不知道在哪取,请指教下。

    1. @DH, 经过检查,已经可以用bin-debug文件夹下的两个文件正常运行了,我用的是FB4.6,Rect 用的是不是4.7啊,4.6就没bin-release这个文件夹。请问:4.6有啥办法能生成XML根SWF么

        1. @Rect, 你用命令生成的XML和SWF。请问命令怎么写呢。能提供一个例子吗?我是新手。谢谢前辈

      1. @DH, 你好。我也在学习。但是我就是弄不出来。能加我一下QQ吗?我们能在线交流一下吗?我的QQ号是:136155184

  5. 05-22 11:33:01.834: W/dalvikvm(13969): VFY: unable to resolve static field 872 (activity_main) in Lcom/example/testane/R$layout;
    我写了一个DEMO。然后把buildANE 和buildAPK中替换成我DEMO相关的文件。打包成功啦。安装运行。还是没有解压R文件问题啊。

    1. @范加伟, SDK版本?我的RDT只支持到4.0..后面的更新由于技术转型我就没在关注了..

  6. Rect大神,帮分析下,我之前打包一个简单的ANE没资源没配置文件,是好的,这次打了资源根配置文件进去,在导出APK的时候就报 String index out of range: -1错,请问,知道是什么原因么?我要是把ROOT下的配置文件删除就不报这个错了,报个dx什么的错误,但是理论上配置文件是不应该删除的。配置文件是第三方JAR包反编译出来的,应该没问题。执行日志以及报错如下:
    C:\Users\Administrator\Desktop\UmengAne\buildAPK>”C:\Program Files\Adobe\Adobe F
    lash Builder 4.6\sdks\flexsdk4.11\bin\RDT” -package -target apk-captive-runtime
    -storetype pkcs12 -keystore DH.p12 -storepass 123456 umengtest.apk umengtest-ap
    p.xml umengtest.swf -extdir .
    RDT:RDT\android-support-v4.jar
    RDT:RDT\mmbilling.2.4.0.jar
    RDT:RDT\ThranSDK.jar
    ROOT:ROOT\CopyrightDeclaration.xml
    ROOT:ROOT\mmiap.xml
    ROOT:ROOT\VERSION
    SDKLibs:3
    ANEFileInRdt:android-support-v4.jar
    prefix:j
    jarFiles:1
    newJarFiles:2
    SDK addJarFile:android-support-v4.jar
    ANEFileInRdt:mmbilling.2.4.0.jar
    prefix:j
    jarFiles:2
    newJarFiles:3
    SDK addJarFile:mmbilling.2.4.0.jar
    ANEFileInRdt:ThranSDK.jar
    prefix:j
    jarFiles:3
    newJarFiles:4
    SDK addJarFile:ThranSDK.jar
    RootFiles:3
    unexpected failure: String index out of range: -1
    java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at com.adobe.air.apk.RDTPacker.ANEFileInRoot(RDTPacker.java:50)
    at com.adobe.air.apk.APKPackager.processExtensions(APKPackager.java:241)

    at com.adobe.air.ApplicationPackager.createPackage(ApplicationPackager.j
    ava:65)
    at com.adobe.air.ADT.parseArgsAndGo(ADT.java:591)
    at com.adobe.air.ADT.run(ADT.java:435)
    at com.adobe.air.ADT.main(ADT.java:485)

    C:\Users\Administrator\Desktop\UmengAne\buildAPK>pause
    请按任意键继续. . .

    1. @DH, ROOT下的配置文件打不进去,后来选择的了 aapt a的办法打的 已经OK了。

        1. @Rect, 4.0SDK,移动MM的JAR包解压出来有个VERSON的文件,没有后缀名,我怀疑是这个文件的问题,后来用aapt a的方法打的

  7. Rect 我遇到问题了,我单独接入友盟统计和移动MM都是好的,但是把两个放到一起打包APK的时候就报错了。

    C:\Users\Administrator\Desktop\xxxxxx\UmengAne\buildAPK>”C:\Program
    Files\Adobe\Adobe Flash Builder 4.6\sdks\flexdsk4.11\bin\RDT” -package -target
    apk-captive-runtime -storetype pkcs12 -keystore DH.p12 -storepass 152300 BoneMc
    FstPet.apk BoneMcFstPet-app.xml BoneMcFstPet.swf icon -extdir .
    RDT:RDT\android-support-v4.jar
    RDT:RDT\ThranSDK.jar
    RDT:RDT\umeng-sdk-analytics_v5.2.2.jar
    SDKLibs:3
    ANEFileInRdt:android-support-v4.jar
    prefix:j
    jarFiles:2
    newJarFiles:3
    SDK addJarFile:android-support-v4.jar
    ANEFileInRdt:ThranSDK.jar
    prefix:j
    jarFiles:3
    newJarFiles:4
    SDK addJarFile:ThranSDK.jar
    ANEFileInRdt:umeng-sdk-analytics_v5.2.2.jar
    prefix:j
    jarFiles:4
    newJarFiles:5
    SDK addJarFile:umeng-sdk-analytics_v5.2.2.jar
    dx tool failed:warning: Ignoring InnerClasses attribute for an anonymous inner c
    lass that doesn’t come with an associated EnclosingMethod attribute. (This class
    was probably produced by a broken compiler.)
    warning: Ignoring InnerClasses attribute for an anonymous inner class that doesn
    ‘t come with an associated EnclosingMethod attribute. (This class was probably p
    roduced by a broken compiler.)

    trouble processing:
    class name (com/umeng/analytics/d/A) does not match path (com/umeng/analytics/d/
    a.class)
    …while parsing com/umeng/analytics/d/a.class
    …while processing com/umeng/analytics/d/a.class

    UNEXPECTED TOP-LEVEL EXCEPTION:
    java.lang.IllegalArgumentException: already added: Lcom/umeng/analytics/Analytic
    sConfig;
    at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:12
    3)
    at com.android.dx.dex.file.DexFile.add(DexFile.java:143)
    at com.android.dx.command.dexer.Main.processClass(Main.java:301)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:278)
    at com.android.dx.command.dexer.Main.access$100(Main.java:56)
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:229)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpen
    er.java:244)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.j
    ava:130)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java
    :108)
    at com.android.dx.command.dexer.Main.processOne(Main.java:247)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:183)
    at com.android.dx.command.dexer.Main.run(Main.java:139)
    at com.android.dx.command.dexer.Main.main(Main.java:120)
    at com.android.dx.command.Main.main(Main.java:89)
    1 warning
    1 error; aborting

    C:\Users\Administrator\Desktop\xxxxxx\UmengAne\buildAPK>

    大神的帮我分析下吧,求助啊。

  8. 问题已经解决,两个ANE的JAR包有冲突,导致的。发现打ANE这个东西必须要细心,某个环节错一点都会导致打包失败。

    1. @DH, 要解决这些问题,最完美的方式是把AIRSDK的打包工具逆向了

  9. 银联ANE 坑爹啊·
    求大神帮忙· 打包一切正常 就是打不开银联的插件·
    QQ:23559768

        1. @孙巍, 一般解决ANE问题的思路是:1.打开eclipse的Logcat查看报错的Log, 2.通过Log定位基本问题. …我遇到的所有问题 都在博客中和github的Readme记录过.

  10. vivo的xml里,最后这里,打包以后在机器上,会无限跳出登录界面,就是登录完成就自动再跳出来,如果改成NoTitle,那么登录完成就不会再跳一次,不过这个黑屏的activity也会显示,要按一下返回才可以。这个可能是什么原因造成的?

    1. android:name=”us.sanguo.ane.vivo.funs.IABLoginActivity” android:theme=”@android:style/Theme.NoDisplay

      刚才带了个括号没显示出来

        1. 就是说,如果按照你的例子做出来以后,登录界面会一直过不去,登录了以后又弹出来登录界面,如果把登录activity的NoDisplay改成NoTitleBar的话,不会再次登录了,当然也会有一个黑屏的activity在,返回一次才可以。要么加一下qq ZZO777I

          1. 你了解下activity的生命周期.在登陆成功的时候有消息回调的.在消息回调的时候设置个哨兵.然后倘若哨兵已经被设置 则在onCreate之类的函数直接finish即可.

发表评论

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