创建新版本时启动后崩溃

问题描述 投票:0回答:1

我在真实设备和模拟器上启动了 Android TV 应用程序,但没有收到任何错误

当我发布新版本并收到“启动后崩溃”消息时,我多次修复它并收到相同的消息和拒绝状态。

这是来自goolge的邮件内容,我不知道如何解决!

 `App Status: Rejected Your app has been rejected and wasn't published due to the policy issue(s) listed below. If you submitted an update, the previous version of your app is still available on Google Play.      Issue found: Crashing after launch Your app crashes after launch, which means we cannot review your app for Android TV inclusion. Please refer to our TV Activity documentation for details.  Issue details  We found an issue in the following area(s):  Version code 156: In-app experience About the Android TV App Quality Guidelines We do not accept apps into Android TV that don't adhere to Android TV App Quality Guidelines.`

我编写了一个类来将错误消息记录到远程,但 crashHanlder 没有被命中


I put crashHandler code in launcher activity
public class TvActivity extends FragmentActivity {
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tv);

    
    Thread.setDefaultUncaughtExceptionHandler(new CrashHandler());

...do stuff
    }
}
 


public class CrashHandler implements UncaughtExceptionHandler {

    private static final String TAG = "CrashHandler";
    private  boolean _enableRemoteLog = true;

    private UncaughtExceptionHandler defaultUEH;

    public CrashHandler() {
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {

        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);

        // Inject some info about android version and the device, since google can't provide them in the developer console
        StackTraceElement[] trace = ex.getStackTrace();
        StackTraceElement[] trace2 = new StackTraceElement[trace.length+3];
        System.arraycopy(trace, 0, trace2, 0, trace.length);
        trace2[trace.length+0] = new StackTraceElement("Android", "MODEL", android.os.Build.MODEL, -1);
        trace2[trace.length+1] = new StackTraceElement("Android", "VERSION", android.os.Build.VERSION.RELEASE, -1);
        trace2[trace.length+2] = new StackTraceElement("Android", "FINGERPRINT", android.os.Build.FINGERPRINT, -1);
        ex.setStackTrace(trace2);

        ex.printStackTrace(printWriter);
        String stacktrace = result.toString();
        printWriter.close();
        Log.e(TAG, stacktrace);


        if (_enableRemoteLog)
        {
            remoteLog(stacktrace);
        }

        defaultUEH.uncaughtException(thread, ex);
    }

   
    private void remoteLog(String content){
        String url = "https://xxx/log?msg=" + content;
        LogHelper loader = new LogHelper();        
        String[] args = new String[2];
        args[0] = url;
        args[1] = "90";
        loader.execute(args);        
        Log.d(TAG, "remoteLog: " + content);
    }
}

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
  package="xxxx">
<activity
      android:name=".ui.TvActivity"
      android:theme="@style/LightBgBrowse"
      android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <action android:name="android.intent.action.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION"/>
        <action android:name="android.intent.action.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION"/>
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
      </intent-filter>
    </activity>
java google-play android-tv
1个回答
0
投票

按照你的方法

public class TvActivity extends FragmentActivity {
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tv);

    
    Thread.setDefaultUncaughtExceptionHandler(new CrashHandler());

...do stuff
    }
}

您正在呼叫

Thread.setDefaultUncaughtExceptionHandler(new CrashHandler())

所以,了解顺序..

首先会调用

new CrashHandler()
。 在该构造函数中,您正在调用
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler()
。 但是,请注意,
Thread.setDefaultUncaught...()
尚未被调用,其参数仍在构建中以供调用。因此,
defaultUEH
不会被设置为
CrashHandler
的实例。它可能仍然是
null
或之前设置为默认值的其他处理程序的实例。

然后一个

CrashHandler
实例将返回给调用者。

Thread.setDefaultUncaught...(ch)
将在创建这个新实例时被调用。

在此之后,

Thread.getDefaultUncaught...
将返回正确的值。

尝试在 TvActivity.onCreate() 方法中这样做:

CrashHandler ch = new CrashHandler();
Thread.setDefaultUncaughtExceptionHandler(ch);
ch.setDefaultUEH();  // New method which will get the default UEH set by above statement

在CrashHandler类中添加一个新方法:

public void setDefaultUEH() {
    this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
}

并且构造函数

public CrashHandler() {}
不必在那里。其中唯一的语句应该被删除。整个构造函数本身可以删除,因为它将是没有任何逻辑的默认构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.