Android 尝试构建片段时崩溃

Android crashes trying to build fragments

我有一个 Android 应用程序,它最近在构建一些片段时崩溃了。这种情况不会总是发生,只是偶尔发生。

这是典型的崩溃日志:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.myapp./com.mycompany.myapp..ui.activities.MainActivity}: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.mycompany.myapp..l.a.a1: could not find Fragment constructor
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3534)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3689)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:100)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2239)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loop(Looper.java:227)
       at android.app.ActivityThread.main(ActivityThread.java:7822)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1026)

到目前为止,我是这样构建片段的:

    String fragmentName = MyFragment.class.getName()
    Fragment fr = Fragment.instantiate(this, fragmentName);
    final FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.frame_content, fr, fragmentName);
    ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
    ft.commit();
    fm.executePendingTransactions();

而这次崩溃直到几个月前才发生。我不知道我是否更改了某些内容或者它与 Android 版本有关(我正在使用 SDK 29 进行编译)。

为了解决问题,我更改了构建片段的方式以使用 FragmentFactory:

    String fragmentName = MyFragment.class.getName()
    final FragmentManager fm = getSupportFragmentManager();
    FragmentFactory ff = fm.getFragmentFactory();
    Fragment fr = ff.instantiate(getClassLoader(), fragmentName);
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.frame_content, fr, fragmentName);
    ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
    ft.commit();
    fm.executePendingTransactions();

但崩溃仍在发生。

考虑到日志,片段 class 名称似乎被混淆了或类似的东西并且 Android 无法对其进行反混淆。 如果它很重要,我有这个 gradle 配置:

buildTypes {
    release {
        minifyEnabled true
        firebaseCrashlytics {
            mappingFileUploadEnabled true
        }
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

我的 Proguard-rules.pro 文件包括:

-keepattributes SourceFile,LineNumberTable        # Keep file names and line numbers.
-keep public class * extends java.lang.Exception  # Optional: Keep custom exceptions.

不要使用“实例化”功能启动您的片段,要修复错误,请查看此答案