如何修复 Android 10 中的崩溃处理

Hik*_*kki 5 java android unity-game-engine uncaught-exception google-cardboard

我有一个使用 Cardboard SDK 构建的 Unity 场景,并导出为 Android 库。该库用于在 Android 应用程序上以纸板模式播放视频。它不是整个应用程序,而是其中的一部分。Android 应用程序的其余部分是使用 Kotlin 和 Java 构建的。

我已经实现了,所有功能都按预期工作,但是退出场景会使 android 崩溃。

我们尝试了各种方法来清除玩家首选项,甚至在关闭场景之前清除内存。但在安卓上总是崩溃。我有两部 Android 手机(Android 9 和 10)用于测试。

在 Android 应用程序中,我已经做到了,一旦应用程序崩溃,我就会尝试恢复。我的崩溃是一些lateinit var变量被破坏了。它们的值变为 null 并且恢复先前的活动会使其崩溃。因此,在退出 Unity 场景后,我将取消引用的变量加载回内存中,一切都会恢复正常。

注意:我尝试过使用Application.Quit();unity,但它只是关闭了整个应用程序。另一方面,我只想关闭跑步场景

在统一中[我调用goBackandroid部分中的一个函数来关闭应用程序]:

public void GoToHome()
    {
        Pause();
        Stop();
        Resources.UnloadUnusedAssets();
        PlayerPrefs.DeleteAll();
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("goBack");
    }
Run Code Online (Sandbox Code Playgroud)

在应用程序中:

public void goBack()
    {
       UnityPlayer.currentActivity.finish();
       finish();
       loadDerereferencedVars();
    }
Run Code Online (Sandbox Code Playgroud)

这在 android 9 上完美运行。在另一部装有 android 10 的手机上,关闭场景后,应用程序继续运行,但是出现一条消息

应用程序不断停止

当我单击关闭应用程序时,该应用程序继续工作。

我检查了日志,null pointer dereference崩溃的原因是Unity Main >...

如果您想在 Android Studio 中查看来自 LogCat 的 Unity 崩溃日志

因此,由于应用程序仍在运行,我认为最好隐藏崩溃报告,让用户不知道此崩溃,但仍然报告它。

我尝试将我的应用程序封装起来Application并添加一个方法来捕获 uncaughtException。

这是我的应用程序类:

public class MyApp extends Application {

    private static final String TAG = "MyAPP";

    @Override
    public void onCreate() {
        super.onCreate();
        Thread.setDefaultUncaughtExceptionHandler(
                new Thread.UncaughtExceptionHandler() {
                    @Override
                    public void uncaughtException (Thread thread, Throwable e) {
                        handleUncaughtException (thread, e);
                    }
                });
    }

    /**
     * Handles Uncaught Exceptions
     */
    private void handleUncaughtException (Thread thread, Throwable e) {

        // The following shows what I'd like, though it won't work like this.
        Toast.makeText(getApplicationContext(), "Looks like I am having a bad day!", Toast.LENGTH_LONG).show();
        Log.e("UncaughtException", "I found an exception!");
        // Add some code logic if needed based on your requirement
    }


}

Run Code Online (Sandbox Code Playgroud)

同样,这在 Android 9 中完美运行,我也收到了错误报告。然而,在使用 Android 10 的手机中,我只收到如上图所示的崩溃报告,并且没有报告任何错误。

我想知道为什么崩溃处理不起作用以及如何修复它?

小智 0

我不会完成您来自的 Activity,而是仅打开一个新意图(在 UnityActivity 上)。当您结束此意图时,应用程序将返回到最后一个活动的Activity。我将以我的脚本为例:

public void sendJobToUnity(String fileName, boolean isNewJob){
    //creates a new job. It exists inside the JobSelector Activity
    isUnityLoaded = true;

    //this is what you are looking for part1
    Intent i = new Intent(JobSelector.this, MainUnityActivity.class); //same as (CurrentActivity.this, UnityActivity.this)

    //those are how I send some data across the app. just ignore it
    //i.putExtra("jobName", fileName);
    //i.putExtra("isNewJob",isNewJob);
    //i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    startActivityForResult(i, 1); //this is what you are looking for part2
}
Run Code Online (Sandbox Code Playgroud)

为了关闭它,在MainUnityActivity Activity 中,我有一个 Unity 发送到 Android 的覆盖,以便卸载该 Activity(不是完全退出,因为如果执行此操作,您将无法再次加载它),如下所示:

@Override
protected void receiveJobAndUnloadUnity(String data){
    saveCurrentJob(data); //saves the job it receives from Unity
    mUnityPlayer.unload(); //this is what you are looking for part3
}
Run Code Online (Sandbox Code Playgroud)

如果你想从 Android 卸载 Unity,你可以输入“mUnityPlayer.unload();” 只要您按照我向您展示的方式开始活动,就可以在任何您想要的地方进行。请注意,“mUnityPlayer”是默认的 Unity 变量,无法重命名