`
nbtlxx
  • 浏览: 253675 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

cocos2dx app产品版本更新启动崩溃问题及解决

阅读更多
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来综合分析。

其他的话,如果已经发布的产品,可以通过友盟的数据分析工具来解决问题。有时间我会专门来分享我们在使用友盟过程中的一些体会。
0
0
分享到:
评论

相关推荐

    SublimeText启动cocos2dx3.0项目

    《使用SublimeText高效启动Cocos2dx3.0项目》 Cocos2dx是一款强大的跨平台游戏开发框架,而SublimeText则是一款备受开发者喜爱的文本编辑器,以其高效、轻便和丰富的插件系统著称。将两者结合,可以极大地提升Cocos...

    Cocos2dx中UIWebView替换为WKWebView

    1. **升级Cocos2dx版本**:最理想的解决方案是将Cocos2dx升级到4.0及以上版本。Cocos2dx团队已经在4.0版本中修复了UIWebView的问题,因此,如果你的项目允许,推荐升级到最新稳定版本。这不仅可以解决UIWebView的弃...

    cocos2dx-2.x播放mp4

    请注意,Cocos2dx 3.x及更高版本引入了`ccVideoPlayer`类,可以直接支持视频播放,但对MP4的支持可能仍需FFmpeg作为后端。对于Cocos2dx 2.x,以上步骤是必要的,因为官方没有内置这个功能。 在实际项目中,你可能还...

    cocos2dx 2.2.6版本

    虽然现在Cocos2d-x 已经更新到了更高级的版本,比如3.x、4.x和5.x,每个版本都有新的改进和特性,但2.2.6仍然是一个里程碑,它的源代码和文档可以帮助我们理解游戏引擎的发展历程,以及早期游戏开发的思维方式。...

    android项目中嵌入cocos2dx项目demo

    在Android项目中嵌入Cocos2dx项目是一个常见的需求,特别是在开发混合式游戏或应用时。Cocos2dx是一款高效的游戏开发框架,它基于C++,同时提供了Java、Objective-C和Swift的接口,使得开发者可以方便地在Android和...

    基于cocos2dx的一个小例子

    这个小例子基于Cocos2dx 2.2.2版本,这是一个稳定且功能丰富的版本,广泛应用于各种游戏项目。 首先,我们要理解Cocos2dx的核心概念。Cocos2dx提供了一套图形渲染引擎,可以轻松地创建2D游戏场景。其中,Sprite...

    cocos2dx 工具之CocosBuilder

    《Cocos2dx工具解析:聚焦CocosBuilder》 Cocos2dx是一个广泛使用的开源游戏开发框架,基于C++,支持跨平台的游戏开发,适用于iOS、Android、Windows等多个平台。在Cocos2dx的生态系统中,有一系列强大的辅助工具,...

    cocos2dx3.x游戏开发之旅电子版

    在Cocos2dx 3.x版本中,框架进行了诸多优化和改进,提高了性能,简化了API,使得开发者能够更高效地创建2D游戏。这本书将带你深入理解Cocos2dx 3.x的核心概念,包括场景(Scene)、层(Layer)、节点(Node)、精灵...

    cocos2dx允许播放多个音效及手机版播放声音时崩溃

    在“cocos2dx允许播放多个音效及手机版播放声音时崩溃的解决办法.txt”这个文件中,可能包含了针对这些问题的具体步骤和代码示例,建议详细阅读并尝试应用到项目中。 总的来说,理解和掌握Cocos2d-x的音频系统,...

    Quick-Cocos2dx-Community 3.6.5 Release Note 带官方热更新等demo

    Quick-Cocos2dx-Community 3.6.5版本发布说明是Cocos2d-x社区的一个重要里程碑,这个版本包含了官方支持的热更新功能以及其他一些关键的改进和演示项目。Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,并...

    cocos2dx3.2的ScrollView改良

    基于cocos2dx3.2的ScrollView改良版,...由于cocos库太大,压缩包里已经移除cocos核心库,需要自行下载安装cocos2dx 3.2版本,并任意生成一个cocos2dx项目,把里面的cocos文件夹复制到ScrollViewDemo文件夹下即可。

    cocos2dx 3.2做的一款赛车游戏

    在cocos2dx 3.2版本中制作的赛车游戏,充分利用了这个框架的优势,为玩家提供了流畅的游戏体验和丰富的视觉效果。 1. **Cocos2dx 3.2框架详解**: - **跨平台性**:cocos2dx 3.2版本支持多种操作系统,开发者只...

    cocos2dx教程

    【cocos2dx教程】 cocos2dx是一款广泛应用于手机2D游戏开发的开源游戏引擎,以其强大的功能和跨平台支持而备受开发者喜爱。初学者可以通过学习cocos2dx来...记得持续关注cocos2dx的更新,以获取最新的特性和性能优化。

    cocos2dx 3.x 水波纹

    3. **Shader程序**:OpenGL ES 2.0及更高版本支持自定义着色器,这在Cocos2dx中得到充分利用。我们可以编写顶点和片段着色器,以计算水波纹的位移和颜色变化。顶点着色器处理位置信息,片段着色器则处理颜色和透明度...

    cocos2dx 2048

    《cocos2dx 2048:游戏开发与cocos2dx框架解析》 “cocos2dx 2048”是一个基于cocos2dx框架开发的流行数字拼图游戏,它仿照了2048游戏的玩法,通过编程技术将2D图形、动画和逻辑控制融合在一起,为玩家提供了趣味且...

    cocos2dx 游戏开发系列之三 源码

    《cocos2dx游戏开发系列之三:源码解析与Android工程构建》 在游戏开发领域,cocos2dx是一个广泛使用的开源游戏引擎,尤其在跨平台开发中扮演着重要角色。本篇将深入探讨cocos2dx游戏开发系列的第三部分——源码...

    cocos2dx斗地主服务端,客户端在我的资源列表中

    【标题】"Cocos2dx斗地主服务端与客户端详解" 在游戏开发领域,Cocos2dx是一款广泛使用的开源游戏引擎,它基于C++,并提供了对多种平台的支持,包括iOS。本资源包含了斗地主游戏的服务端和客户端代码,这为我们提供...

    cocos2dx 水果忍者 2.0 简单版本

    《cocos2dx水果忍者2.0简单版本》是一款基于Cocos2dx游戏引擎开发的轻量级游戏,旨在为玩家提供与1.0版本相比更为流畅且问题较少的游戏体验。Cocos2dx是一个开源的跨平台2D游戏开发框架,支持iOS等多个操作系统,...

    COCOS2DX实现线程后台运作与推送

    在iOS开发中,COCOS2DX是一款广泛使用的2D游戏开发框架,它基于C++,为开发者提供了高效的游戏开发工具。本主题聚焦于如何利用COCOS2DX实现线程后台运作以及推送通知功能,特别是在用户按下HOME键后进入后台模式时。...

Global site tag (gtag.js) - Google Analytics