Xamarin Android 在迁移到 AndroidX 后找不到 class "androidx.lifecycle.ProcessLifecycleOwnerInitializer"

Xamarin Android getting Didn't find class "androidx.lifecycle.ProcessLifecycleOwnerInitializer" after migrating to AndroidX

迁移到 AndroidX 并将所有 AndriodX 软件包更新到最新版本后,构建将失败,在 obj 文件夹中的构建生成的 XML 文件中显示三个类似的错误:

  1. \obj\Debug0\lp7\jl\res\values\values.xml: 在需要项目的位置找到标签 ID

XML文件内容为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <id name="view_tree_lifecycle_owner"/>
</resources>
  1. \obj\Debug0\lp1\jl\res\values\values.xml: 在需要项目的位置找到标签 ID

XML文件内容为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <id name="view_tree_saved_state_registry_owner"/>
</resources>
  1. \obj\Debug0\lp3\jl\res\values\values.xml: 在需要项目的位置找到标签 ID

XML文件内容为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <id name="view_tree_view_model_store_owner"/>
</resources>

在网上查找解决方案后,我只是将每个生成的文件中的 <id name="... 更改为 <item type="id" name="... 并且构建成功(尽管我每次 clean/rebuild).

但是,在应用启动画面之后,它立即崩溃并显示以下异常:

Java.Lang.RuntimeException: 'Unable to get provider androidx.lifecycle.ProcessLifecycleOwnerInitializer: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwnerInitializer" on path: DexPathList...

我查了一下,发现许多解决方案建议启用 and/or 配置多 dex,其中 none 曾经有效。

仅当链接设置为Sdk Assemblies OnlySdk and User Assemblies时才会出现问题

以下是一些对我不起作用的配置:

  • 我已经在项目属性的 Android Options 选项卡中尝试了 enabling/disabling Enable Multi-Dex

  • 我尝试将 AndroidManifest.xmlapplication 标签中的 android:name 属性设置为 androidx.multidex.MultiDexApplication

  • 我试图让 MainApplication class 继承自 Android.Support.MultiDex.MultiDexApplication(在 XamarinLibrary.Xamarin.Android.Support.Multidex 中定义)而不是 Android.App.Application

  • 我试图让 MainApplication class 继承手动为 AndroidX MultiDexApplication 创建的绑定,如下所示:

MultiDex.cs:

using Android.Content;
using Android.Runtime;

using Java.Interop;

using System;

namespace OnePoint
{
    [Register("androidx/multidex/MultiDex", DoNotGenerateAcw = true)]
    public sealed class MultiDex : Java.Lang.Object
    {
        private static readonly JniPeerMembers _members = new XAPeerMembers("androidx/multidex/MultiDex", typeof(MultiDex));

        internal static IntPtr class_ref => _members.JniPeerType.PeerReference.Handle;

        public override JniPeerMembers JniPeerMembers => _members;

        protected override IntPtr ThresholdClass => _members.JniPeerType.PeerReference.Handle;

        protected override Type ThresholdType => _members.ManagedPeerType;

        internal MultiDex(IntPtr javaReference, JniHandleOwnership transfer)
            : base(javaReference, transfer)
        {
        }

        [Register("install", "(Landroid/content/Context;)V", "")]
        public static unsafe void Install(Context context)
        {
            try
            {
                JniArgumentValue* ptr = stackalloc JniArgumentValue[1];
                *ptr = new JniArgumentValue(context?.Handle ?? IntPtr.Zero);
                _members.StaticMethods.InvokeVoidMethod("install.(Landroid/content/Context;)V", ptr);
            }
            finally
            {
            }
        }

        [Register("installInstrumentation", "(Landroid/content/Context;Landroid/content/Context;)V", "")]
        public static unsafe void InstallInstrumentation(Context instrumentationContext, Context targetContext)
        {
            try
            {
                JniArgumentValue* ptr = stackalloc JniArgumentValue[2];
                *ptr = new JniArgumentValue(instrumentationContext?.Handle ?? IntPtr.Zero);
                ptr[1] = new JniArgumentValue(targetContext?.Handle ?? IntPtr.Zero);
                _members.StaticMethods.InvokeVoidMethod("installInstrumentation.(Landroid/content/Context;Landroid/content/Context;)V", ptr);
            }
            finally
            {
            }
        }
    }
}

MultiDexApplication.cs:

using Android.App;
using Android.Runtime;

using Java.Interop;

using System;

namespace MyNamespace
{
    [Register("androidx/multidex/MultiDexApplication", DoNotGenerateAcw = true)]
    public class MultiDexApplication : Application
    {
        internal static readonly JniPeerMembers _members =
            new XAPeerMembers("androidx/multidex/MultiDexApplication", typeof(MultiDexApplication));

        internal static IntPtr java_class_handle;

        private static IntPtr id_ctor;

        [Register(".ctor", "()V", "", DoNotGenerateAcw = true)]
        public MultiDexApplication()
            : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
        {
            if (Handle != IntPtr.Zero)
                return;

            try
            {
                if (GetType() != typeof(MultiDexApplication))
                {
                    SetHandle(
                        JNIEnv.StartCreateInstance(GetType(), "()V"),
                        JniHandleOwnership.TransferLocalRef);
                    JNIEnv.FinishCreateInstance(Handle, "()V");
                    return;
                }

                if (id_ctor == IntPtr.Zero)
                    id_ctor = JNIEnv.GetMethodID(class_ref, "<init>", "()V");
                SetHandle(
                    JNIEnv.StartCreateInstance(class_ref, id_ctor),
                    JniHandleOwnership.TransferLocalRef);
                JNIEnv.FinishCreateInstance(Handle, class_ref, id_ctor);
            }
            finally
            {
            }
        }

        protected MultiDexApplication(IntPtr javaReference, JniHandleOwnership transfer)
            : base(javaReference, transfer)
        {
        }

        internal static IntPtr class_ref => JNIEnv.FindClass("androidx/multidex/MultiDexApplication", ref java_class_handle);

        protected override IntPtr ThresholdClass => class_ref;

        protected override Type ThresholdType => typeof(MultiDexApplication);

        public override void OnCreate()
        {
            base.OnCreate();
            MultiDex.Install(this);
        }
    }
}
  • 我已经尝试了 cleaning/rebuilding 解决方案。
  • 我已经尝试重新启动 Visual Studio。
  • 我已经尝试在 Visual Studio 的包管理器控制台中执行 update-package -reinstall

我遇到了同样的问题,但仅限于您提到的第一个 XML (<id name="view_tree_lifecycle_owner"/>)

我找到了一个适合我的答案(链接设置为 Sdk Assemblies Only 的发布配置)

在 Android 项目属性中,我启用了“Android 选项”下的“使用增量 Android 打包系统”复选框。这解决了问题。

我在 this 线程中找到了解决方案。

原来这个问题是由 r8 dex 编译器误报的。当我将 dex 编译器更改为 dx 时,它报告了一个不同的编译错误:invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13) 即使 min-sdk-version 不是 13。后查找后错误,感谢this thread, I was able to resolve the problem by downgrading Xamarin.AndroidX.Browser to version 1.0.0.1 (the latest version before 1.2.0 where the problem was introduced)。降级上述包后,我可以使用 dxd8.

成功编译和 运行

我必须设置以下内容

<AndroidUseAapt2>true</AndroidUseAapt2>

在 Android.csproj 文件中使其正常工作。 (它被设置为 false 并在 csproj 文件中多次出现)。