如何在 Android 中查找导致 Cordova 应用程序崩溃的原因?

Posted

技术标签:

【中文标题】如何在 Android 中查找导致 Cordova 应用程序崩溃的原因?【英文标题】:How to find what crashes a Cordova App in Android? 【发布时间】:2019-01-30 05:57:51 【问题描述】:

我使用 Cordova 为 iosandroid 编写了一个混合游戏。游戏在 iOS 和 Android 上运行完美,我几乎准备好发布它,但我只需要制作几个启动画面。完成后,我在两个平台上进行了最后一次测试,结果在玩几分钟后发现游戏在 Android 上崩溃了!它以前从未这样做过,我不知道是什么原因造成的。还有新的是,我的手机在玩游戏的时候很烫,一会就握不住了(我测了126F)。

我只使用了两个插件:cordova-plugin-admob-free 和 cordova-plugin-splashscreen。出于测试目的,我删除了两者以查看它们是否导致崩溃,但崩溃仍然存在。

当使用 Cordova(cordova run android --devices)构建游戏时,如果我在 PhoneGab Build 上构建它并手动安装 apk,游戏也会崩溃。

我已尝试使用 chrome://inspect 进行调试,但我没有看到控制台上出现任何错误。我也跑过

adb logcat

但是日志太复杂了,我无法理解导致崩溃的原因。如果有人想看一下,我已经上传了日志的副本here。游戏的名称是“mygame”(这不是它的真正名称,但我在日志文件中将其更改为)。

我不知道如何找出导致此崩溃的原因。在 iOS 上,一切正常。只有 Android 会导致此问题。如果您需要更多信息或者我需要更具体的信息,请让我知道您需要更多信息,我会将其添加到这篇文章中。

2018 年 8 月 24 日编辑: 我已经能够在另一部 Android 手机和模拟器上对其进行测试,并且它没有在那里崩溃。我仍然需要找出导致崩溃的原因,因为它是我的手机上唯一崩溃的应用程序。我还想知道是什么导致我运行它时大量消耗电池。这也是新的。

2018 年 8 月 26 日编辑: 好吧,更多的 Android 设备正在经历崩溃。我在我的设备上做了一些测试。我删除了两个 Cordova 插件 (AdMob en SplashScreen) 并开始了游戏。我让它坐在打开的屏幕上,所以那时还没有创建任何游戏对象,它所做的只是一些简单的计算和一些 context.drawImage() 调用。一段时间后手机仍然会变热并崩溃。会不会是 context.drawImage() 有内存泄漏?

2018 年 8 月 27 日编辑: 我剥离了应用程序,因此在游戏的主循环中只剩下两个 drawImage()(和一个 requestAnimatonFrame())。一个 drawImage() 有一个画布作为源,另一个是 img 对象。一段时间后它仍然崩溃。然后我删除了以 img 对象为源的 drawImage(),经过一个小时的测试,它仍然没有崩溃。然后,我添加了更多的 drawImage(),所有这些都以画布作为源 - 并且没有崩溃。然后我用一个 img 对象作为源替换了画布,几分钟后它就崩溃了。所以我认为可以安全地假设以 img 对象为源的 drawImage() 导致崩溃?

2018 年 8 月 29 日编辑: 我更改了代码中的所有 drawImages() 以使用画布作为源。画布仅填充一次图像。我第一次运行游戏时,它没有崩溃!我以为我已经解决了这个问题,但经过更多测试后,我发现它确实崩溃了,但游戏崩溃需要更长的时间。因此,尽管这是朝着解决方案迈出的良好一步,但它仍然不是解决方案。

2018 年 8 月 30 日编辑: 我能够通过 Android Studio 运行游戏,当它崩溃时,调试控制台显示:

E/chromium: [ERROR:gl_fence_egl.cc(55)] Failed to get EGLSync attribute. error code:12300
W/google-breakpad: ### ### ### ### ### ### ### ### ### ### ### ### ###
                   Chrome build fingerprint:
                   68.0.3440.91
                   344009152
                   ### ### ### ### ### ### ### ### ### ### ### ### ###
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 13865 (Chrome_InProcGp)

谁能帮我调试一下?

【问题讨论】:

没有看到我们无法调试的代码。再次检查您的逻辑并使用drawImage(src, x, y, w, h, destX, destY, w, h) 的所有参数。确保您的图像与画布大小相同,然后渲染画布会更快 使用所有参数的原因是什么? 检查gamedev.stackexchange.com/questions/32221/…和developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/… 看看这个答案***.com/a/38309034/4564200 【参考方案1】:

你的问题有点笼统,所以答案也是这样:

$ adb logcat ActivityManager:I <com.your.application>:V -e INFO:CONSOLE*

这使您能够仅获取有关您正在测试的应用程序的日志。将尖括号中的所有内容(包括尖括号)替换为项目的点式应用程序名称。

在详细了解编辑更新时,如果您希望获得详细帮助,请考虑提供示例和来源。

【讨论】:

以上是关于如何在 Android 中查找导致 Cordova 应用程序崩溃的原因?的主要内容,如果未能解决你的问题,请参考以下文章

Cordova硬件访问和安全

使用 chrome devtools 检查每个 USB 的 Cordova android 应用程序会导致黑屏

构建Cordova Android项目导致“com.android.builder.dexing.DexArchiveMergerException:无法合并dex”错误

ionic cordova 运行 android 导致 PANIC: Missing emulator engine program for 'x86' CPU

如何在android studio中cordova的混合开发

使用cordova媒体插件录制音频会导致空文件