繁体   English   中英

Xamarin Android 在迁移到 AndroidX 后找不到类“androidx.lifecycle.ProcessLifecycleOwnerInitializer”

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

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

  1. \\obj\\Debug\\100\\lp\\117\\jl\\res\\values\\values.xml :在预期项目的位置找到标签 ID

XML 文件内容为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <id name="view_tree_lifecycle_owner"/>
</resources>
  1. \\obj\\Debug\\100\\lp\\121\\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\\Debug\\100\\lp\\123\\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="...并且构建成功(即使我必须重新执行每次我清理/重建时都会这样)。

但是,在应用程序的启动画面之后,应用程序崩溃并显示以下异常:

Java.Lang.RuntimeException:'无法获取提供程序 androidx.lifecycle.ProcessLifecycleOwnerInitializer:java.lang.ClassNotFoundException:在路径上找不到类“androidx.lifecycle.ProcessLifecycleOwnerInitializer”:DexPathList...

我查了一下,发现了许多建议启用和/或配置多 dex 的解决方案,但没有一个有效。

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

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

  • 我尝试在项目属性的Android Options卡中启用/禁用Enable Multi-Dex

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

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

  • 我试图让MainApplication类从手动创建的 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);
        }
    }
}
  • 我试过清理/重建解决方案。
  • 我尝试重新启动 Visual Studio。
  • 我曾尝试在 Visual Studio 的包管理器控制台中执行update-package -reinstall

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

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

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

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

事实证明,这个问题是由r8 dex 编译器误导性报告的。 当我将 dex 编译器更改为dx ,它报告了一个不同的编译错误: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13)即使min-sdk-version不是13 在查找了后一个错误后,多亏了这个线程,我能够通过将Xamarin.AndroidX.Browser降级到1.0.0.1版本(引入问题的1.2.0之前的最新版本)来解决问题。 降级上述包后,我可以成功编译并运行dxd8

我必须设置以下内容

<AndroidUseAapt2>true</AndroidUseAapt2>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM