首页 > 代码库 > [工作积累] Google/Amazon平台的各种坑
[工作积累] Google/Amazon平台的各种坑
所谓坑, 就是文档中没有标明的特别需要处理的细节, 工作中会被无故的卡住各种令人恼火的问题. 包括系统级的bug和没有文档化的限制.
继Android的各种坑后, 现在做Amazon平台, 遇到的坑很多, 这里记录一下备忘:
先汇总下Android Native下的各种问题, 当然有些限制有明确文档说明,不算坑,但是限制太多还是很不爽:
android平台下的某些限制: android下的各种坑 (我的C/C++/汇编/计算机原理博客)
OBB的各种bug: OBB的解决方案
arm gcc toolchain 的链接错误和编译器崩溃: NDK: GCC 4.6 crashes [原]android 链接错误
Modified UTF8 崩溃: crash - JNI WARNING: input is not valid modified utf-8: illegal continuation byte
以上这些还不包括其他API, 如GLES, OpenSL ES的坑.
比如GLES2.0用复杂shader编译通过但是runtime崩溃或者渲染不正确, 比如下面代码, GLES2.0某些硬件shader条件分支代码渲染不正确或者黑屏,
//GLES2.0 fragment shaderfloat factor = ( dir >= 0 ) ? 1 : 0; //doesn‘t work! artifacts!float factor = step(0, dir); //f*******k! it works! the hell why?
还比如GLES2.0竟然没有统一的压缩贴图格式, 而且ETC1竟然不支持Alpha等等, 总的来说GLES2.0不适合做大一点儿的3D游戏.
而OpenSLES上也是各种限制, 比如声音数量的限制, 音频解码接口的限制(导致可用声音数量减半)等等, 这些比iOS差远了.
再来说说最近Amazon平台遇到的坑:
1. GameCircle无法登录, 一直为GUEST.
文档里相关的 FAQ 如下
Q: Which countries does Amazon GameCircle support?A: Amazon GameCircle is available in more than 200 countries, including the United States, the United Kingdom (England, Scotland, Wales, and Northern Ireland), Germany, France, Spain, Italy, Japan, and Brazil. In China and other non-supported countries, your customers can earn achievements and track their high scores without logging in; the data is stored locally and not synced to the cloud.
那么在天朝做global app development, 也没法调试了么, 有什么解决办法没? 虽然手里的Kindle Fire设备有全局VPN设定,但是还没有VPN可用啊... 最后在支持论坛(https://forums.developer.amazon.com/forums/thread.jspa?threadID=2946)看到这句话:
GameCircle is not supported for the users using Chinese Amazon account. The users with a non-China account may attempt to use GameCircle from China, however they will be connecting to the US and may be subject to China firewall issues.
好吧, 怎么创建非中国账号? 我的账号是在amazon.com, 非amazon.cn上创建的, 应该不是中国账号吧, 为什么还是不行?... 最后拿着设备折腾了一番, 终于搞定了:
设置 => 我的账号 => 当前国家 : 设置为美国
这样就可以了...
2. GameCircle Jni崩溃.
logcat 输出一堆错误: ... NoClassDefFoundError: com/amazon/ags/api/AGResponseHandle(关键字) ...
一开始以为是library reference 或者 class loader的线程问题, 搜索了所有错误信息后, 最后使用上面关键字, 得到的一下解答(https://forums.developer.amazon.com/forums/thread.jspa?threadID=767):
From my own experimentation it seems that the handles just don‘t work for me.
They make the calls to java and return a handle, but after this, the amazon C++ code try to do something (what I don‘t know) that creates a classdefnotfound exception which crashes the application. I switched to using the callbacks.
查看自己代码发现有部分代码为了省事使用了Handle, 而没有使用callbak, 所以一部分函数调用会崩溃, 一部分不会.
全部改用callback 解决.
3. Amazon AppStore: 没有APK expansion
这个起码有文档说明. 但Google Play的APK和Amazon的限制不同, 导致非常恶心.
Amazon的APK没有大小限制, 100M以上需要用FTP传, 没有expansion file, 这样OBB什么的都是浮云了, 而且要为Amazon做新的包了. 综合之前Google Play的OBB问题,
最佳方案是使用ZIP格式, 因为APK是zip包, 那么使用ZIP可以同时支持OBB模式和APK模式,
使用同一套代码库的维护成本低, 加上复用度高导致稳定性高, 比两套代码要好很多.
目前工作中由于进度原因, 可能选择最快的,而且不降低运行效率的解决方案:
http://stackoverflow.com/questions/7937368/how-to-pass-arguments-to-aapt-when-building-android-apk
http://stackoverflow.com/questions/2651816/reading-resource-files-from-my-own-apk-in-android-native-environment
http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/
即把OBB文件放入APK, 同时禁止APK对OBB的zip压缩, 然后native直接读文件, 这样只需要初始化时通过Jni调用一次Java, 获取seeking offset和size,之后都可以在native读取. 准备着手做这一步.