本文来自:http://bbs.9ria.com/thread-197503-1-1.html
目前为止我为项目共接入了大概7-8家或大或小的平台。深知AIR移动项目接入运营平台在打造ANE过程中会有各种各样的问题。在这里我打算把我遇到的问题 和解决方式记录下来,也许你用得着 也许你已经遇到过 也许你已经解决掉。接下来我会从我的air项目和各种android应用运营平台方的SDK接入过程 中 遇到的问题进行探讨。其中有些问题已经解决 有些问题解决得很差强人意,有些问题尚未解决。也请已经解决了这些问题的朋友 能和我交流。当然我对原生android开发刚刚入门 有一些看法或多或少存在错误。也请看到的朋友能Email我指出。(rectvv[at]gmail[dot]com)
再次声明下,这里仅仅写下我遇到的问题 和我个人的解决方式 关于ANE还有很多很多我没遇到的问题。同样如果同一个问题 您有更好的解决方式 希望能指导下我。小弟不胜感激。
首先关于最近大家都在群里讨论 AIR是生是死的问题,ASER是否转行的问题,我觉得应该把当下的事情做好,就像CODE COMPLETE里面说的一样。程序员应该是超越语言的。当然我目前还没到这水平。接下来进入正题。
在这之前 我之前写了一些关于ANE更早的一些文章:
http://www.shadowkong.com/archives/tag/ane
————————————————–
我的项目信息:
使用的跨平台技术:Adobe Air
使用的GPU加速框架(引擎?):Starling
使用的AIR SDK版本:3.5(AIR3.5打包STARLING项目出来的的APK对于HTC的机器会有一个BUG,更新到AIR3.7之后 HTC的BUG解决了 但是对三星的一款机器又出一个新BUG 目前我还在寻找完美的解决方式 当前我的解决方式并不完美 详细的BUG描述会在后面统计的时候给出)
在接入的那么多平台中 在这里选择一个平台SDK看起来最繁琐 在打包ANE的时候 需要做的处理最多的 平台 做为例子。当然由于这个平台的SDK里面明确表示不允许 向他人 传播。所以我在后面的源码 与 附件中 会把 该平台的相关JAR 文档 等等去掉。但是如果你也接这个平台 那你可以完全拿过来套用。
接入的平台信息:
针对设备:android
需要打包入AIR APK的资源有:res assets两种资源处理方式都有。(在之前我就写过一篇关于ANE如何处理资源的问题的文章)平台方接入的第三方(对于游戏是第四方):微博授权登录 QQ授权登录
平台方需要加入的activity情况:这个平台需要加入的activity声明是最多的 在这个平台的 -app.xml也是最臃肿的,这会涉及到一个SDK activity 与 游戏activity 如何通信切换的问题。在之前就遇到过一个问题 把游戏主activity传给SDK的时候 执行完SDK操作 返回不了游戏activity 详细的解决方式 请看我前面的一篇文章。
平台方需要加入的JAR数量:6个(平台方的JAR最后全部都需要打包成一个JAR 才能生成ANE 这个问题的解决方式后面会给出)
——————————————————-
第一步 准备工作
1.在这之前需要先安装 JDK JRE 并且添加环境变量如图:
(路径自己按照各自环境配置)这两个工具 请自行下载
配置JAR 配置JDK:例如我的路径:C:\Program Files\Java\jdk1.7.0_17\bin 加入 环境变量 系统变量
[attach]79[/attach]
[attach]80[/attach]
2.安装FB6 eclipse androidSDK 按照正常教程配置android开发环境 推荐下载androidSDK :2.2,2.3,4.0
我的项目全部统一使用android SDK2.3.3
这些编辑器 SDK IDE等全部自行下载。。>.<
3.一般平台SDK都会需要在assets加APK或者资源,这就需要命令行 编译 打包。所以建议在环境变量中加入 amxmlc例如我的是在其中加入:D:\FB\Adobe Flash Builder 4.6\sdks\AIR3.5\bin 命名为amxmlc 这样就可以在CMD中直接使用命令行编译了,若想命令行打包 则也一样的 直接加入 ADT所在路径即可。(这并不是必须的 仅仅为了更好的使用命令行)
博文地址:http://www.shadowkong.com/archives/1106 这和编写其他所有ANE类似。网上可以找到一堆的教程。但是我觉得都针对性不太强。如果你已经对编写ANE有足够的把握 那这篇文章完全可以不看。 一点声明:我的水平有限 这里仅仅只能写出我认为可行的方案 和 代码 而且针对接入平台运营商的情况。这种ANE基本都具有四个功能: 初始化SDK -> 登录 -> 付费 -> 退出。 所以我决定针对接入android平台而写一个基本的ANE教程。我接入的所有平台的ANE 都是基于教程中给出的源码而做的改进。 ANE作为AIR调用本地代码的机制 他的组成分为两部分: 在开始之前 先限定一些共同的ID: 接口 ID:com.rect.ane 初始化SDK标识:rect_function_init 登录标识:rect_function_login 付费标识:rect_function_pay 退出SDK标识:rect_function_exit 1.JAVA端项目新建库项目 如图 [attach]81[/attach] 注意包名最好和我们在之前限定的接口 ID一致。然后记得勾选为library
[attach]82[/attach] 然后一直确定 生成项目 Rectane。在eclipse中右键项目属性 – java构建路径 – 源代码 – Rectane/gen – 包括选择[包括]点击编辑 在[包括模式]中 点击 添加 输入 nothing 按确定。完成后如图
[attach]83[/attach] 接下来加入AIR SDK中的 FlashRuntimeExtensions.jar 文件到项目下的lib文件夹 然后导入到项目中 如图
[attach]84[/attach] 接下来就是贴代码的时间了:RectContext.java
RectExtension.java
更多的详细代码 请看附件中的 Rectane_java 项目
RectExtension.as
仔细看这两个类就可以发现 在前面说的 接口ID 和 各个函数调用的 ID 都必须保持一致
[attach]85[/attach] XML文件中要注意的是 必须保存一致4.打包ANE 在 1 2 3进行完了之后 我们去取到一下文件
[attach]86[/attach] |
一点声明:我的水平有限 这里仅仅只能写出我认为可行的方案 和 代码 接入android 运营平台 一般平台方都会提供一个或者更多的jar包。但是我们的ane只能打包一个jar包。这就需要我们把这些jar全部集合到一个去。 我的方法是基于一个兄台的教程的改进:http://bbs.9ria.com/thread-160445-1-1.html 拿我接过的最繁琐的一个SDK来说,它要求我必须连入6个jar。如图
[attach]87[/attach]
需要把 其余的jar 都合并到 flane.jar中。
就可以了。这个方法适用于合并N个jar。 |
一点声明:我的水平有限 这里仅仅只能写出我认为可行的方案 和 代码 文字国际化 其实是android编码的规范之一。但是不同的运营商提供的SDK 这块处理的都不一样。 就目前我接触过的平台来说。当乐 UC 91 360 算做得很好。 但是其他小平台 特别是有一个运营商 他们客户端技术才一个人。 都很不注重android文字国际化的问题。打包进ane的资源 布局文件XML必须是规范的国际化处理的。 否则就会在打包APK的时候报错。
[attach]88[/attach]
一般这个错误在打包ANE的时候是不会报的。而在打包APK的时候就会报出来。如图所示 这个错误主要是由于 ANE中的资源文件夹RES下的layout文件夹下的布局XML中的text 被SDK客户端程序员直接用代码写的。所以会直接写在layout的布局XML里面。而一般android官方开发标准推荐更标准化的写法。把layout中的text的内容写入 value文件夹下的string.xml中。而我们的ADT打包就是遵从这种标准。例如layout某XML的一段:<TextView
Button
使用方式: |
一点声明:我的水平有限 这里仅仅只能写出我认为可行的方案 和 代码 打包ANE会经常遇到找不到资源R.XXX ID的问题,或者是找到的资源ID不对 然后报NULL POINT错 直接程序崩溃。 AIR与android原生取资源方式的区别:
但是原生JAVA取资源的方式是:
ADOBE的取资源方式 是我们在ANE中使用到资源的时候的取法, 其实修改SDK的jar也不是不可能的。对于android逆向有兴趣的同学 可以去试试。 其实android逆向也是一门非常好玩的技术。如果你有兴趣 我们可以一起探讨。 ANE打包资源后生成的R.java特点: 前面的文章说了 ANE打包资源是通过把资源文件夹res放到 Android-ARM下。然后打包的时候就可以在ANE内部生成R.java了。我们反编译一个APK看看AIR生成的R.java有什么特点: [attach]89[/attach] 默认是生成R.java处在 包名为APK的ID下。也就是air+(你程序的-app.xml的ID)。例如(air.xxx.xxx.R) 这就会导致取不到资源ID: [attach]90[/attach] 也就是说 导致取不到ID的原因之一 有可能是(之所以说有可能 是因为取不到资源ID还有其他各种的原因,起码我遇遇到过的是如此): 真正的资源ID 所在的类[air.xxx.xxx.xx.R.java] 与SDK资源ID的包名[wxd.view.R.java]地址不同 A. 最简单的方式。说服运营商 把SDK的取资源的包改为我们AIR生成资源的包,但是这也是最异想天开的方法。永远别梦想着运营商会针对你一家修改它的SDK。虽然想法美好 但是却是痴心妄想。
B.在ANE源码中新建一个包例如上面举例的情况是 在src下新建 包 [wxd.view] 在这个包下新建类R.java。然后把运营商提供的JAVADEMO的gen文件夹下的R.java复制过去 如图:
[attach]91[/attach]
C.也是目前我发现最完美的解决方式:灵活使用context.getResourceId 取AIR生成的R.java下的ID 取填补 SDK下的R.java的资源ID。 如图:
[attach]92[/attach]
例如上图的例子中。加一个resHandle.java类。
当然 在SDK包下的R.java要做一些处理 使得能访问全部静态变量 例如我的
这样外部就能访问 各个变量了。
至此 由于取不到资源ID的问题 就得到了解决。当然再强调一次 取不到资源ID 也有可能是由于其他问题导致的。这仅仅是导致这个问题的原因之一。 |
| 一点说明:打包ANE有很多方式。我的方式比较普遍 把步骤分得太细。最初的时候也是为了了解全过程。其实zrong打包ANE的方式才是王道。举个例子 我打包飞流ANE的命令: "D:\FB\Adobe Flash Builder 4.6\sdks\AIR3.5\bin\adt" -package -storetype PKCS12 -keystore qlwx.p12 -storepass 1234 -target ane com.feiliu.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM . 说明: "D:\FB\Adobe Flash Builder 4.6\sdks\AIR3.5\bin\adt" 本机ADT路径 qlwx.p12 证书文件 1234 证书密码 com.feiliu.ane 生成的ANE文件名字 extension.xml 对接XML |
| 欢迎光临 守望者--AIR技术交流 (http://www.airmyth.com/) |