Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LG G4在基于月球着陆器的Android游戏开始时崩溃_Java_Android_Crash_Jvm Crash_Lg - Fatal编程技术网

Java LG G4在基于月球着陆器的Android游戏开始时崩溃

Java LG G4在基于月球着陆器的Android游戏开始时崩溃,java,android,crash,jvm-crash,lg,Java,Android,Crash,Jvm Crash,Lg,我基于谷歌的月球着陆器(Lunar Lander)示例编写了一个Android游戏(使用Android画布进行2D绘图)。自2009年以来,这款游戏在所有Android设备上都运行良好,但用户最近报告说,它未能在LG G4上启动。有时G4会完全冻结,因此用户必须取出电池才能重新启动 我用LG的开发者程序借用了一台LG G4,并重现了这个问题。基本上,应用程序会停止,不会抛出任何异常。通常它最终会给出一个“应用程序没有响应”错误。我还观察到操作系统偶尔会完全崩溃,而且很少有游戏成功启动 我找到了一

我基于谷歌的月球着陆器(Lunar Lander)示例编写了一个Android游戏(使用Android画布进行2D绘图)。自2009年以来,这款游戏在所有Android设备上都运行良好,但用户最近报告说,它未能在LG G4上启动。有时G4会完全冻结,因此用户必须取出电池才能重新启动

我用LG的开发者程序借用了一台LG G4,并重现了这个问题。基本上,应用程序会停止,不会抛出任何异常。通常它最终会给出一个“应用程序没有响应”错误。我还观察到操作系统偶尔会完全崩溃,而且很少有游戏成功启动

我找到了一个似乎可以解决问题的解决办法,所以我在下面回答我自己的问题,以防其他人遇到这个问题。(虽然真正的解决方案是LG不要在Android操作系统中引入bug。)

我通过添加日志语句来执行“二进制搜索”,以查找程序冻结的行。我发现冻结发生在初始启动时,当渲染线程试图获取画布上的锁时

如果在渲染线程尝试获取锁之前插入thread.sleep(),问题就会消失。我发现这完全是偶然的:我在那里插入了一个log语句,而log语句本身造成了足够的延迟,游戏开始工作了!以下是我的(简化)代码结构和修复程序:

public class theview extends SurfaceView implements SurfaceHolder.Callback {
    private final SurfaceHolder mSurfaceHolder;
    public theview(Context context, AttributeSet attrs) {
        super(context, attrs);
        mSurfaceHolder = getHolder();
        //(other game-initialization code omitted)
        thread = new LunarThread();

    public void surfaceCreated(SurfaceHolder holder) {
        //(other game-resuming code omitted)
        mRun=True;
        thread.start();
    }

    class LunarThread extends Thread {
        @Override
        public void run() {
            Canvas c=null;
            while (mRun) {
                try {
                    LunarThread.sleep(0, 1); // <---the LG G4 needs this line or the game doesn't load! Sleep duration didn't matter.
                }catch(InterruptedException ignored){}

                if(c==null){
                    LunarThread.yield();//app is still loading; wait for it.
                }
                try {
                    c = mSurfaceHolder.lockCanvas(null); // <---- this is the line where the LG G4 freezes without the above sleep()
                    if (c != null) {
                        synchronized (mSurfaceHolder) {
                            if (mMode == STATE_RUNNING) doPhysics();
                            doDraw(c);
                        }
                    }
                }
                finally {
                    // do this in a finally so that if an exception is thrown
                    // during the above, we don't leave the Surface in an
                    // inconsistent state
                    if (c != null) {
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }

}
public类视图扩展了SurfaceView,实现了SurfaceHolder.Callback{
私人最终表面持有人;
公共视图(上下文、属性集属性){
超级(上下文,attrs);
mSurfaceHolder=getHolder();
//(其他游戏初始化代码省略)
线程=新的LunarThread();
已创建的公共空白表面(表面持有人){
//(其他游戏恢复代码省略)
mRun=真;
thread.start();
}
类LunarThread扩展线程{
@凌驾
公开募捐{
c=null;
while(mRun){
试一试{

LunarThread.sleep(0,1);//如果程序正在崩溃,99%的时间logcat中都有一个堆栈跟踪,告诉你哪一行崩溃了。没有理由对日志进行二进制搜索。如果你正在添加睡眠来修复某个问题,那么你并不是真的在修复它。花些时间找出真正的解决方案,而不是在这里发布糟糕的攻击。@Gabeschen,正如我在文章中所说的那样。@据估计,它没有引发任何异常。只是一个操作系统级崩溃。我正在记录一个避免操作系统级崩溃的解决方案。当我正确调用某个函数时,您建议我如何进一步调试LG的Android系统函数的封闭源代码版本中发生的崩溃?