cocos2dx app产品版本更新启动崩溃
具体log如下:
W/dalvikvm( 7931): threadid=12: thread exiting with uncaught exception (group=0x42048930)
E/AndroidRuntime( 7931): FATAL EXCEPTION: GLThread 12293
E/AndroidRuntime( 7931): java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
E/AndroidRuntime( 7931): at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:224)
E/AndroidRuntime( 7931): at org.cocos2dx.lib.Cocos2dxHelper.getStringForKey(Cocos2dxHelper.java:302)
E/AndroidRuntime( 7931): at org.cocos2dx.lib.Cocos2dxRenderer.nativeRender(Native Method)
E/AndroidRuntime( 7931): at org.cocos2dx.lib.Cocos2dxRenderer.onDrawFrame(Cocos2dxRenderer.java:94)
E/AndroidRuntime( 7931): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1524)
E/AndroidRuntime( 7931): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
通过./adb logcat运行,也可以看到上述的错误堆栈
ndk-stack -asy 查找真机上的bug,因为是安装在真机上,还看不出具体的错误;
从上面的log信息看,貌似要从SharedPerence读取一个错误数据类型,比如保存的是int, 但是外部当作string类型来读取,所以系统自动做了类型的转换,但是类型转换失败导致崩溃。
另外一个奇怪的情况下,全新安装可以正常运行,但是如果升级安装的话就会崩溃。为了验证猜测是否正确,在新版本安装后,通过android中删除应用的缓存和数据文件,结果可以正常运行。
具体步骤:1. 设置, 2. 应用程序 3. app名称 4. 清除数据
综合上面2点,应该是旧版本的代码SharedPerences保存了int类型,但是新版本尝试使用string方式来读取出来。
然后找到相关代码修复
旧版本的cpp代码
int announcement_id = UserDefaultUtil::getIntForKey(KEY_ANNOUNCEMENT_ID);
if (announcement_id != announcement.id) {
setAnnouncementVisible(true);
UserDefaultUtil::saveIntToXml(KEY_ANNOUNCEMENT_ID, announcement.id);
}
错误代码: lua
-- getStringForKey此处有错误,强行取出一个String(但是文件保存为int类型)
if CCUserDefault:sharedUserDefault():getStringForKey(KEY_ANNOUNCEMENT_ID) ~= announcement_content["id"] then
CCUserDefault:sharedUserDefault():setStringForKey(KEY_ANNOUNCEMENT_ID, announcement_content["id"])
setAnnouncementVisible(pLayer, true)
end
修复后代码:
if announcement_content["id"] then
announcement_id = tonumber(announcement_content["id"]) + 1
if CCUserDefault:sharedUserDefault():getIntForKey(KEY_ANNOUNCEMENT_ID) ~= announcement_id then
CCUserDefault:sharedUserDefault():setIntForKey(KEY_ANNOUNCEMENT_ID, announcement_id)
setAnnouncementVisible(pLayer, true)
end
end
而且比较奇怪的事情,同样的代码在ios平台上运营通过,看来ios的平台比较健壮,而android c++环境相对比较严格,如果出现类型无法匹配的话,就会崩溃。
最近经常碰到android平台崩溃问题。 推荐大家多看logcat, 另外掌握ndk-stack来综合分析。
其他的话,如果已经发布的产品,可以通过友盟的数据分析工具来解决问题。有时间我会专门来分享我们在使用友盟过程中的一些体会。
分享到:
相关推荐
SublimeText 启动cocos2dx3.0项目 按readme.txt里面说明去修改路径之后 直接在lua文件里按F7即可运行项目
该问题的解决方案有两种:1)升级Cocos2dx的版本,在查看Cocoas官网及Cocoas论坛,cocoas在4.0修复了这个问题,如果可以更新到4.0以上,建议更新;不想更新的话,可以修改UIWebView为WKWebView。具体的修改方式使用...
基于cocos2dx3.2的ScrollView改良版,...由于cocos库太大,压缩包里已经移除cocos核心库,需要自行下载安装cocos2dx 3.2版本,并任意生成一个cocos2dx项目,把里面的cocos文件夹复制到ScrollViewDemo文件夹下即可。
cocos2dx scrollview优化
现在老版本都很难找到,赶紧收藏吧
cocos2dx 模糊效果代码提供,尽情下载吧!
cocos2dx中使用精灵的例子,新手可参考。
使用cocos2dx新建的helloword工程,嵌入到android原生项目中的demo
此代码在cocos2dx2.1.4下面编译有部分错误,我修改后,正常。 下下来后,请在VC++包含目录中链接(F:\cocos2d-x-2.1.4\cocos2dx\platform\win32;F:\cocos2d-x-2.1.4\cocos2dx\platform\third_party\win32\OGLES\GL\;...
萝莉快跑cocos2dx 3.0beta版本,从2.2改过来的,去掉了关于功能和计分功能,重写了触屏回调部分以兼容3.0
我所理解的cocos2dx pdf
使用cocos2dx2.2.2游戏引擎,让游戏背景循环滚动。让滚动界面无缝连接起来
【Cocos2d-x】实现资源热更新
cocos2dx可用3d粒子编辑器,支持pc、mac、iphone、android等平台
关于cocos2dx客户端程序的自动更新解决方案.docx
基于ldt的cocos2d x lua代码提示 cocos2dx版本2 2 3
Cocos2dx 2.x版本播放mp4格式的文件 这里只是代码部分,还有.a文件,由于太大无法下载,有需要找本人私传给你
cocos2dx 2048
解决Cocos2dx中文乱码的文件 ToolsThreePart
某手游cocos代码