LG G4在基于Lunar Lander的Android游戏开始时崩溃

问题描述:

我写了一个基于Google的Lunar Lander示例(使用Android Canvas进行2D绘图)的Android游戏。自2009年以来,该游戏在所有Android设备上都运行良好,除非用户最近报告说未能在LG G4上启动。有时G4会完全冻结,因此用户必须卸下电池才能重新启动。LG G4在基于Lunar Lander的Android游戏开始时崩溃

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

我发现了一种似乎可以解决问题的解决方法,所以我在回答我自己的问题,以防其他人遇到此问题。 (虽然真正的解决方案是LG不会将错误引入到Android操作系统中。)

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

如果我在呈现线程尝试获取锁之前立即插入thread.sleep(),问题就会消失。我完全意外地发现了这一点:我在那里插入了一条日志语句,并且日志语句本身造成游戏开始工作的延迟足够了!这是我(简化)代码结构和修复:

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); 
        } 
       } 

} 

的1ns的延迟很短,以至于我只是说这所有的手机。 (这应该不用说,但显然这只是LG G4定制版Android操作系统中一个令人讨厌的潜在错误的缓解,客户报告说,它不会发生在其他LG手机上。这个问题分别给LG)。

+1

如果程序崩溃了,99%的时间里有logcat中的堆栈跟踪,告诉你哪一行崩溃了。没有理由对日志进行二分查找。如果你正在增加睡眠来修复某些东西,那么你并没有真正修复它。花点时间找出真正的解决方案,而不是在这里发布恶意攻击。 –

+0

@GabeSechan正如我在问题中所说的那样,它没有提出任何例外。只是一个操作系统级别的崩溃。我记录了避免操作系统级别崩溃的解决方法。你如何建议我进一步调试LG的Android系统函数的闭源版本中发生的崩溃,当我正确地调用该函数? – Luke