[工作积累] 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 shader

float	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读取. 准备着手做这一步.

[工作积累] Google/Amazon平台的各种坑

时间: 2024-10-12 14:03:20

[工作积累] Google/Amazon平台的各种坑的相关文章

[工作积累] Google Play Game SDK details

https://developers.google.com/games/services/cpp/api/structgpg_1_1AndroidSupport For apps which target android 4.0+ (API Version greater than or equal to 14), most of these function calls are unnecessary. For such apps only the OnActivityResult funct

蒋步星:报表&数据分析平台里的坑

报表平台(或BI.数据分析平台)是指提供报表.统计图及其它BI组件(仪表盘.数据看板.分析报告等)的组织管理.权限控制.调度生成.发布订阅等功能的软件系统,让业务用户能随时随地地访问全企业的报表和数据.这是近五六年来报表和BI领域的一个热门需求,在基本业务系统建设较完善后,许多用户都希望把各系统中的报表和数据分析功能打通后统一管理. 在业界混久了,经常还能听到客户在实际用过某个报表工具后表扬该产品的话(当然骂声可能更多),但是用过之后还表扬某个报表或数据分析平台的话却几乎从没听说过!对于这类平台

工作积累之NDK编译STL (zhuan)

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL :=  stlport_static  右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用. gnust

Google云平台对于2014世界杯半决赛的预测,德国阿根廷胜!

由于本人是个足球迷,前段日子Google利用自己云平台预测世界杯八进四的比赛并取得了75%的正确率的事情让我振动不小.虽然这些年一直听说大数据的预测和看趋势能力如何如何强大,但这次的感受更加震撼,因为世界杯是很多人都在关注并尝试去预测的比赛,Google云平台在这个时候站出来预测比赛无疑很让人充满期待. 当然有件事情必须要讲的是,世界杯从来都是冷门出现在小组赛最多,而进入淘汰赛之后就越来越少,所以Google在八进四才开始预测无疑是件很讨巧的做法.不过不管怎么说,靠大数据预测小概率事件本来就非常

工作积累(五)——使用[email protected]注解实现常量功能

之前的博客中提到过如何通过 java.util.ResourceBundle 和 java.util.Properties类通过读取 key-value 文件的形式实现常量功能.其实 spring 已经通过@Value 注解实现,下面看看如何使用. 1.创建.properties文件: 在如下目录创建 keyvalue.properties文件src/main/resources/META-INF/spring/keyvalue.properties ,写入如下内容: test.value=il

互联网颠覆工作模式,全新平台型就业浮现

在经济新常态和新经济下的大背景下,个人的就业方式得到了极大的丰富,组织的用工模式和管理方式也产生了相应的变革,随着科学技术的进一步发展,未来势必将会呈现更加多元化.灵活性.弹性化的特点. 新常态下新就业的若干观察与思考 李克强总理在第十二届全国人民代表大会第四次会议指出"新经济"的覆盖面和内涵是很广泛的,涉及一.二.三产业,不仅仅是指三产中的"互联网+".物联网.云计算.电子商务等新兴产业和业态,也包括工业制造当中的智能制造.大规模的定制化生产等,还涉及到一产当中像

[工作积累] NDK通过Java获取package name 和version

////////////////////////////////////////////////////////////////////////// //Java code snippet //get APK's versionCode in AndroidManifest.xml public int getVersionCode() { int versionCode = 1; try{ PackageInfo packageInfo = this.getPackageManager().g

HAL层Camera模块Dump图片--工作积累

导出YUN数据进行调试,分析问题: 1 // dump图像数据 事列 2 void dump(const int width, const int height, void *yBuf, void *uvBuf) 3 { 4 char buf[256] = {'\0'}; 5 FILE* file_fd = fopen(buf, "wb"); 6 snprintf(buf, sizeof(buf), "/data/Effect/%dx%dvideodenoiser%d.yuv

Google协作平台

本博文的主要内容有 .Google协作平台的介绍 1.Google协作平台的介绍 https://zh.wikipedia.org/wiki/Google%E5%8D%8F%E4%BD%9C%E5%B9%B3%E5%8F%B0 Google协作平台,http://sites.google.com/ Google协作平台,是一个在线应用程序.