[Air For Android Of ANE]运营商登录付费接入ANE打包心得

前缀:

关于什么是ANE,如果您都能搜索到这篇文章的话  相信已经不用我过多介绍了。但是还是会发一篇基础教程:点我传送

项目进行到了接入运营商的阶段。而国内除了91等几家声名显赫的运营商会提供已经做好的ANE给ADOBE 的移动开发者之外。其他的运营商一般只会提供IOS封装库 或者是Android 的JAR 封装库。这对于Air For Android 开发的移动应用来说。接入这些运营商就需要应用开发者自己实现ANE。

这几天一直在做android运营商的接入。这里就先把这几天的心得先发上来。大概下一次就会把Air For IOS Of ANE 的心得一并发在这里。

针对Android的ANE打包:

配置JAVA android开发环境 配置各自系统变量等略过。

首先说说我这次拿到运营商提供的JAR库的结构。(如果你拿到的SDK组成和我这次的大同小异,那你可以看完省很多弯路  如果你拿到的SDK比我拿到的复杂 那你仅仅可以参考其中的一些资源打包等方法。很多情况还是有不同的)

我这次运营商提供的有 :

A.JAR库文件一个;

B.还有布局文件库(res文件夹下的一堆UI布局文件);

C.原生android写的DEMO一个;

D.开发文档若干;

接下来说说我从拿到SDK到实现ANE登录接入的过程(由于打包ANE主意事项非常非常的多,稍微错一步  如果没有及时发现,就会郁闷一整天):

1>这里我们需要动手术的只有 A,B ;C只是作为我们实现AS接口的时候的JAVA端编码结构参考DEMO;拿到手后 提醒下大家 应该把D 开发文档仔细研读,我今天就因为这个问题差点和运营商接头的CODER打了一架。淡定淡定。脾气还是不够好。(因为我问一个资源的路径 都说了整整一个下午 对方才知道我要的是什么。。也许是我的表达能力实在不行,好吧 )。

2>把开发文档仔细又仔细的读过一遍之后  我整理了一下思路,我的思路是:自己写一个JAR实现和AS的拓展接口,在自己写的JAR中调用运营商提供的第三方库。从自己写的这一个JAR为跳板 实现接入的最终目的。我相信大家的思路基本都是一样的。

3>分析第三方JAR 和布局文件。把第三方JAR解压发现里面含有图片等资源,(我对android原生开发不太了解,不过据我搞原生开发的朋友说 在JAR中打入资源图片 是一种不可取的方式。),我们都知道 ANE打包的大部分都是源码,是针对源码的拓展。网上很多教程的打包ANE 其实导出自己写的JAR方式都是有误的,其实正确的方法是 取在BIN文件夹中 的那个自动生成的JAR,这个JAR最纯粹 不包含其他杂质。如果是用ECLIPSE直接右键项目打包出来的JAR的话  也是可以用的,但是这个包包含了太多太多没有用到的东西。这样根本是不利于维护的,如果下一位开发者要对你做的ANE进行维护(平台SDK更新 ANE同步更新等情况),解压出来你的一堆东西  会困惑不已的。

所以打包JAR 这里推荐直接 是拿ECLIPSE自动生成的那个 纯代码无杂质的JAR。注意即使是对于有资源的第三方JAR,取的自生成JAR 依然是去BIN文件夹下自动生成的那个,不要去导出JAR  那会大很多,针对移动设备来说 APK大小 和用户的下载量是能构成正比的。

自己构建的连接AS的JAR库编码结构直接找开头的传送门去看入门教程。这里全部都略过。

4>打包成最后的一个JAR,可能很多人疑惑,不是已经自动写了一个JAR么 怎么还要打包成最后一个JAR,原因是这和ANDROID开发的机制有关,这和我们AIR开发不一样,我们AIR开发使用那个SWC  在打包APK的时候 这个SWC都会自动会加进去,但是这里android调用JAR  仅仅是保留调用而已。也就是说 我们的JAR 调用了 运营商的第三方JAR 之后  生成的JAR 仅仅是几个源码文件而已,并没有包含这个第三方JAR。

这里把 我们写的JAR  第三方JAR 打包成最后一个JAR  就是这个ANE 生成的最需要注重的部分。在几天的摸索之后,发现天地会某兄台的方式可以拓展并使用。原帖传送,使用这里方法提供的命令行如下:
[cc lang=”java”]@echo off
::转到当前盘符
%~d0
::打开当前目录
cd %~dp0
::你做的主JAR包的路径
set MainJar=MYANEJavaLib.jar
::第三方JAR包的路径
set ExternalJar=3rdApiLib.jar
::第三方JAR包顶级包名称
set packageName=com
echo =========== start combin ==============
::解压第三方包
jar -xf %ExternalJar%
::合并主JAR包
jar -uf %MainJar% %packageName%
::如果还有别的顶级包可以接着合并,例如:
::jar -uf %MainJar% %packageName2%
::jar -uf %MainJar% org
::jar -uf %MainJar% cn
echo =========== over ==============
echo 再点一下就结束了–小Q
pause
[/cc]

我们就在最后的合并中拓展下。最后的合并顶级包中,在我解压出来的运营商的JAR中 是有好几个顶级包的,如图

其中ASSETS 就是所包含的资源文件夹,我们不需要打进去,其中另外的两个 也是源码文件夹。一并打进去。只要修改打包命令行就可以了。现在把资源文件夹提出来。接下来说资源的处理

5>打包ANE重中之重之  打包资源

打包资源是我搜索的所有朋友都会遇到的问题。在ADOBE的官方教程中 提到的也 只是只言片语。毫无教程可言。但是对于这个问题是不是没有办法了呢。其实并不是。接下来是我总结的资源图片 和布局文件的处理方式。说是打包 其实也不算是打包。其实有方法可以避免资源问题,那就是和运营商沟通,使用动态路径取资源。在初始化SDK的时候  传入资源文件路径 等 是最完美的解决方式。但是但是但是但是。。有那个运营商会听你说呢?答案是根本没有。

我们总是不能让运营商听我们的话。而只能选择自己的方法解决问题,因为老大的期限摆在那里。你拖一分 挨骂的几率就大一分。

打包资源文件 分为两种:

A,这一种在ADOBE的官方文档中有一句话提到了。就是关于RES文件夹下的文件,处理方式是在打包ANE的时候 把RES文件夹全部复制到响应平台的文件夹下,例如Android-ARM,Android-x86,Windows-x86 ,下(不要告诉我 你不知道这几个文件夹怎么来的。。如果实在不知道 请点开文章开头的传送门。)

就像这样:

这是91的打包方式,91的接入把资源全部放到res文件夹下,这种情况下即使91不提供ane  实现91的ane也是最最简单的;

B,如我这次遇到的情况,资源在外面。在ASSETS文件夹下。我们都知道ASSETS是android项目默认的资源文件夹?(不知道真假 但是我看过的几个项目都是这样的),这种情况下的解决方式是(感谢A闪提醒)把ASSETS下的文件或者文件夹(注意注意注意!!并不是连同ASSETS文件夹 而是ASSETS文件夹下的所有文件 文件夹)复制到你的AIR项目的src文件夹下 就是源文件文件夹下(注意注意注意注意!!是你的项目的src文件夹 不是ane文件夹)。这样打包APK的时候 会把资源放在你ane可以调用的地方。

总结的来说就是:打包ANE的时候  资源如果是ASSETS的话 就放在ane外部 并不是打包进去ane。

OK  总结完毕。

附打包ane命令:

“XX:\XXX\Adobe Flash Builder 4.6\sdks\AIR3.5\bin\adt” -package -s
toretype PKCS12 -keystore qlwx.p12(密匙文件) -storepass 1234(密匙密码) -target ane XXX.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM .
注意注意注意注意。命令括号不能作为命令。。是解释用的要去掉

《[Air For Android Of ANE]运营商登录付费接入ANE打包心得》有106个想法

  1. 大哥~我最近在弄支付宝的ane搞了几天没搞好,希望能指点一下啊,能加qq么 308203080 谢谢了

    1. 91 点金 UC 会提供。小米ANE源码我给他们官方了 不知道他们会不会开放。。另外 我把我写的ANE源码全部分享了。。项目地址:希望能帮到你。https://github.com/platformanes

  2. 您好,想请教一个问题:我最近做MM android接入的时候,发现MM的接入jar包中有一部分资源在jar下(不再res和assets下),请问你有没有遇到这种情况,怎么样解决?。。。上次遇到一个人使用了先打包apk,然后解压,把资源放入,再打包成apk的解决方案,他成功了,我试了下,擦,失败了。这中间不知道什么地方错了。请问你有其他的打包方法么?

    1. 1.如果jar的资源 是在res文件夹下把jar的资源取出来放到 android-ARM文件夹下和res合并 打包进去ANE
      2.如果是在assets文件夹下 则取出来打包进APK
      3.是MM内付费么?www.shadowkong.com/platformanes 我做了一个测试版的MM内付费 你可以参考下。

  3. 你好我上github上看了你们那个项目,好像就是按正常ane打包一样的(没有看到对这三个资源有处理的部分),或许是我还没看明白么,请指教下,给下qq@Rect

  4. 这篇教程里面专门有讲处理assets资源 处理res资源的部分。注意红色的字体,github的ANE资源是我已经处理好了的。@忧小小

  5. 我试了一下你项目的\androidMM-master\androidMM-master\aneTest 下的mm.apk(这个是项目最终打成的apk吧?),其实它是没有初始化成功的,没有回调或是回调是null,看android logcat 提示failed to find resource file(mmiap.xml) apk中缺少mmiap.xml、VERSION、CopyrightDeclaration.xml这三个文件(我在上面说的那三个资源,它们在mmbilling.2.1.0.jar里面,但不在assets或是res目录下,所以我才那样问啊)。
    @Rect

  6. 使用apktool么,我不太会,试了几次,这几个文件都没有打包到apk….哎。。。@Rect

    1. 我提供一种方案 你试试:
      1.按照我github上的方式 打包APK
      2.用压缩工具把三个文件 (两个XML 一个VERSION)放进包跟目录
      3.重新签名
      4.我这种方法并没有成功 由于我没接过这个平台 不知道CopyrightDeclaration.xml中的key是否是平台方单独给的。
      5.其实这个问题还有一个一劳永逸的方式,就是修改SDK代码,把获取这三个文件的路径给它改到资源文件目录。但是这对技术要求比较高,需要能读懂反编译代码。@忧小小 @浪客剑心

  7. 有一个问题不太清楚,打包jar的最优方案是不是把bin里的jar和libs里用到的库合并为一个jar,然后和res一起生成ane?

  8. 没有最优方案 只有对于你最适合的方案。我个人比较喜欢把东西都细化 所以我的ANE源码中都是一步一步来的,例如zrong兄就讲究高效,把ane的生成简化到修改一点点java代码然后就一键生成的水平了。@airycanon

  9. 呃,可能我表述有点问题,在你文中提到的,推荐直接从jar项目的bin文件夹中拿jar来打包ANE,但是我把bin中的jar和导出的jar比较发现,前者没有libs文件夹,里面包含了android.jar和FlashRuntimeExtensions.jar,是否需要把这两个库与bin中的jar合并,才是一个完整的jar?

  10. A.直接去bin文件夹去jar 比较好,这个jar只包含你写的代码,最干净。你可以把两个方式取的jar反编译看看。B.不需要合并 不需要管android.jar和FlashRuntimeExtensions.jar @airycanon

  11. 昨晚测试ANE,用bin中的jar打包,最终生成的ANE没有作用,而用导出的jar打包的ANE则功能正常,对比一下,两者的区别主要是后者包含了android-support-v4.jar及FlashRuntimeExtensions.jar这两个库,跟你确认过不需要这两个文件的,现在百思不得其解,可否帮忙看看是什么原因?

  12. 非常确定,我的所有ANE都是取的bin文件夹下的jar。FlashRuntimeExtensions.jar这个类的函数本身在打包APK的时候AIRSDK给会加上,具体你我建议你详细看看我写的教程 其中有一步是讲合并jar的 @airycanon

  13. 如果不涉及商业机密的话,请把SDK发到我的邮箱。我晚上写一份通用的ANE。rectvv[at]gmail[dot]com.(涉及你项目的key注意去掉) @兜来都去

  14. 上面的那个问题 你是说写法有问题 我改了 它又抱错

    哎 我给你描述下 gfansdk_pay.jar 这个就是机锋sdk提供的jar
    res 里面有很多资源,布局文件, 图片,应用的字符等,问题就是 air所生成的app 他要用到很多这个gfansdk_pay.jar 所提供的activity,我在怎么搞都整不出来,就比如说你没登陆,它会弹出登陆界面,等很多,我晕额… 我也把 jar合成了 就是看你提供的那个发法,res也放在了android-arm 里面,

    我给你说嘛, 原声里面它就一句话就可以实现 支付了如下:public FREObject call(final FREContext ctx, FREObject[] obj) {
    // TODO Auto-generated method stub

    if(RectContext.pay!=null){
    pay();
    }

    return null;
    }
    public void pay() {
    // TODO Auto-generated method stub
    Order order = new Order(“product name”, “product description”, 10,”order” + System.currentTimeMillis());
    RectContext.pay.pay(order, new GfanPayCallback() {

    @Override
    public void onSuccess(User arg0, Order arg1) {
    // TODO Auto-generated method stub

    }

    @Override
    public void onError(User arg0) {
    // TODO Auto-generated method stub

    }
    });

    }

    我真的晕啦

  15. 您是否能认真的,仔细的,详细的,稍微花一点点时间,去看我写的ANE完全教程。你问的问题那里我全写出来了。如果再有问题我们在往下讨论,你看是否可行。传送门:http://www.shadowkong.com/archives/1090 @兜来都去

  16. 如果你看了我写的教程,你就应该知道你的res之所以不能用,是由于A.没有android文字国际化,B.资源ID取不正确。这两个原因。而这两个问题的解决方式我也分析出来了。显然你没仔细看嘛。@兜来都去

  17. 楼主,请问,我在打飞流的ANE时,打入RES资源后,打包APK就报错
    aapt tool failed: (skipping index file ‘C:\Documents and Settings\Administrator\Local Settings\Temp\f328009e-a228-4eb3-9eb8-8852f8dc81ad\res\drawable-hdpi\Thumbs.db’)
    Warning: AndroidManifest.xml already defines versionCode (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines versionName (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines minSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines targetSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    是怎么回事啊?

  18. 这次发现了一个问题 师兄,我现在在做 有米广告ane 者的很神奇, LinearLayout adLayout = (LinearLayout) findViewById(R.id.adLayout);

    AdView adView = new AdView(this, AdSize.SIZE_320x50);
    (adLayout.addView(adView);)加了这句就不行了
    就报错了 上面那个已经能独立做了

  19. 是这么回事,主activity 要启动别的 activity 在启动的activity用到广告sdk的内容,以前你写的那个如何启动别的activity我看了 也实现了,但是在启动的activity中用到sdk后, 一点击启动的activity的按钮后,程序报错 说意外出错,爱这种东西没哥指点,死都做不出来

  20. A.意外退出,B.秒退,C.NullPoint 等情况一般都是由于程序取不到资源ID或者资源ID错乱导致的,android程序和很多OS的程序都有一个共同点,就是在操作系统载入它运行的时候 会特定给给一块内存让它访问,(如果您有兴趣 可以仔细研究一下被解剖得非常详细了的PE文件结构和XP的PE载入器原理)如果它试图访问没权限的内存 系统就会直接把程序Kill掉。你的这些问题不够详细我无从解答。PS:程序员周末要多多户外运动 无论你是师弟还是老油条。@兜来都去

  21. 请问兄弟打包时出现
    C:\Documents and Settings\Administrator\Local Settings\Temp\e15e65ca-a229-422a-8928-07039baf4b07\res\layout\activity_main.xml:14: error: Error: This attribute must be localized. (at ‘text’ with value ‘ 返回’).
    C:\Documents and Settings\Administrator\Local Settings\Temp\e15e65ca-a229-422a-8928-07039baf4b07\res\layout\activity_main.xml:64: error: Error: This attribute must be localized. (at ‘text’ with value ‘账号管理 ‘).
    错误怎么回事?

  22. 资源 师兄,这资源不只是布局文件的资源,我可以保证布局资源没问题,我没加有米sdk语句,他就能正常显示,加了就不行了

  23. 请问我在打包APK时遇到
    C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\cec4c0dd-6c9e-471e-bfc5-64ed10a2b546\AndroidManifest.xml:58: error: Error: No resource found that matches the given name (at ‘theme’ with value ‘@style/Transparent’).
    C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\cec4c0dd-6c9e-471e-bfc5-64ed10a2b546\AndroidManifest.xml:63: error: Error: No resource found that matches the given name (at ‘theme’ with value ‘@style/Transparent’).
    C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\cec4c0dd-6c9e-471e-bfc5-64ed10a2b546\AndroidManifest.xml:68: error: Error: No resource found that matches the given name (at ‘theme’ with value ‘@style/Transparent’).
    错误,看起来不像是编码问题,好象是找不到资源,兄弟遇到过吗

  24. 请问,兄弟遇到过打包APK时要打入一个lib文件夹在,res同级目录吗?

  25. @浪客剑心 @Rect
    抱歉,好久以后才看到。我把这类在使用fb打包时不见的资源称为第三类资源,MM,小米,360的接入的时候都会有这种资源需要打包到apk(就是直接项目路径下,或是jar目录下的文件),是不能打包到ane(res)和放在air项目下(assets)就能成功的。以下是我的步骤(我上面说的三个渠道使用这种方法都已经成功)
    1.先使用fb打包出apk.
    2.a.使用jar命令解压apk
    b.把这类资源放入到解压的目录中(删除签名相关)
    c.使用jarsigner命令重新打包签名
    bat命令:

    set pa=%cd%
    echo %pa%
    cd %pa%
    cd oyp

    jar -xf 123.apk

    del META-INF\CERT.RSA

    del META-INF\CERT.SF

    copy ..\libcasdkjni.so lib\armeabi-v7a\libcasdkjni.so
    copy ..\libidentifyapp.so lib\armeabi-v7a\libidentifyapp.so

    copy ..\CopyrightDeclaration.xml CopyrightDeclaration.xml
    copy ..\mmiap.xml mmiap.xml
    copy ..\VERSION VERSION

    del 123.apk

    jar -cf 1234.apk .

    jarsigner -verbose -keystore ..\**.keystore -storepass ****-keypass ****-signedjar oyp-sign.apk 1234.apk android.keystore

    echo =========== over ==============

    echo 再点一下就结束了–小Q

    pause

  26. 你好 我想请问一下,我现在手上有个叫做mimigigi平台的SDK,里面有相应mimigigi的jar文件,这个jar文件中提供了通过facebook提登录后获取的openId来注册他的平台的账户的功能,而我们游戏需要接入mimigigi平台,这种情况是否需要将facebook的jar和res资源一起打包到ane中。

  27. 你好 我的ane打包后无法使用,想请教一下可能的原因和解决方案。我们的情况是 有3个jar包合并成1个jar包,2个jar中都有res资源,我在合并jar包后把 2个res目录合并成了一个res目录,layout 配置文件里中文和英文我也替换过了。
    打包ane后 我们打印出来的log发现,sdk中的View loginBeanfun = loginUI.findViewById(R.id.ib_login_beanfun); loginBeanfun返回为null。我们想把findViewById取资源的方式改成_context.getResourceId(“R.id.ib_login_beanfun”);但是发现这是平台sdk内部的方法且封装到sdk主文件内调用的。所以这个_context是无法获取。

    求指点。。

  28. 大哥,https://github.com/platformanes/,这个网站为什么唯独没有91的,哥,亲哥啊,上传一下吧

  29. 您好.首先感谢您上述攻略的分享, 其次 想请教,关于 第三方SDK 需要传递activity 该如何操作.

  30. @Rect
    搞定了,谢谢,原来不是activity的问题, 是我meta-data没取到第三方的配置..是我粗心写错地方了.

  31. @yen
    您好,还有个问题..在把res打包进Android-ARM,这是打包的路径game.ane\META-INF\ANE\Android-ARM\res..然后再打包apk报下面错误..
    打包应用程序时出错:

    aapt tool failed:Warning: AndroidManifest.xml already defines versionCode (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines versionName (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines minSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines targetSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    C:\Users\Administrator\AppData\Local\Temp\9b63dabf-76e8-4052-9025-466a57272cfa\res\layout\ggod_main.xml:7: error: Error: This attribute must be localized. (at ‘text’ with value ‘notland’).
    C:\Users\Administrator\AppData\Local\Temp\9b63dabf-76e8-4052-9025-466a57272cfa\res\layout\ggod_main_land.xml:7: error: Error: This attribute must be localized. (at ‘text’ with value ‘land’).
    C:\Users\Administrator\AppData\Local\Temp\9b63dabf-76e8-4052-9025-466a57272cfa\res\layout\loading.xml:18: error: Error: This attribute must be localized. (at ‘text’ with value ‘TextView’).
    C:\Users\Administrator\AppData\Local\Temp\9b63dabf-76e8-4052-9025-466a57272cfa\res\layout\login.xml:63: error: Error: This attribute must be localized. (at ‘text’ with value ‘ 登陆 ‘).
    C:\Users\Administrator\AppData\Local\Temp\9b63dabf-76e8-4052-9025-466a57272cfa\res\layout\login.xml:69: error: Error: This attribute must be localized. (at ‘text’ with value ‘ 注册 ‘).
    C:\Users\Administrator\AppData\Local\Temp\9b63dabf-76e8-4052-9025-466a57272cfa\res\layout\login.xml:75: error: Error: This attribute must be localized. (at ‘text’ with value ‘快速开始’).

  32. 请教个问题。如果碰到某个sdk,指定必须继承他们的application,可以做到么?

  33. 请问是那个类继承呢?如果是其他类 可以在ANE的java端尝试,如果是主activity类的话也是可以的,但是技术难度比较大,方式有几种,A.修改默认activity代码,需要反编译ADT,B.打包好APK后 使用apktool反编译修改activity 相关字节码@叶叶

  34. 大哥,我按照你之前写的安智ane为模板来更新最新的SDK(之前的版本没有安智小球,登陆不能记住密码);可是遇到调用登陆方法login()时就提示“很抱歉,****已停止运行”(最新的SDK的登陆方法有了一点修改,多加了个boolean型的参数,不过官方说不影响没什么关系),怎么办?大神,有没有时间更新一下

  35. Rect兄 想請教 FLASH端的AS該寫甚麼 或者用甚麼方式去與ANE或支付寶溝通呢?

      1. @Rect, 我有找到AS 但我該怎麼使用它呢?我使用import的方式導入了兩個as 發布卻出錯…希望大師能指點迷津!!

        1. @strike, 把支付宝ANE导入你的AIR项目.
          操作步骤:项目右键属性-构建路径-本机拓展-添加ANE-切换到构建打包-选择平台(android or IOS) – 本机拓展 – 勾选之前导入的ANE

  36. 我目前的步驟是….

    新建檔案 > air for android > 編輯action script設定 > 導入ANE

    然後我該怎麼做呢?

    1. @strike, 我不清楚你用什么IDE工具,不过推荐改用命令行,用命令行生成swf,用命令行生成APK,

      具体的命令行样式在这里可以查看:https://gist.github.com/recter

      用IDE编译打包有个缺点 就是出现问题无法准确定位.

      1. C:\Users\Administrator\Desktop\aa>jar -xf aliypc-api.jar
        ‘jar’ 不是内部或外部命令,也不是可运行的程序
        或批处理文件。

        大哥 我这里还是包这个错

罗超进行回复 取消回复

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