微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin Android迁移到AndroidX后没有找到类“ androidx.lifecycle.ProcessLifecycleOwnerInitializer”

如何解决Xamarin Android迁移到AndroidX后没有找到类“ androidx.lifecycle.ProcessLifecycleOwnerInitializer”

迁移到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:在路径:DexPathList上找不到类“ androidx.lifecycle.ProcessLifecycleOwnerInitializer”。

我抬起头来,发现了许多解决方案,这些提议建议启用和/或配置multi-dex,但都无济于事。

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

以下某些配置不适用于我:

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

  • 我尝试将android:nameapplication标签中的AndroidManifest.xml属性设置为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,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的发布配置)

在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,我能够通过将Xamarin.AndroidX.Browser降级为1.0.0.11.2.0 {{3}之前的最新版本)来解决该问题。 })。降级提到的软件包后,我可以成功编译并运行dxd8

,

我必须设置以下内容

<AndroidUseAapt2>true</AndroidUseAapt2>
在Android.csproj文件中使用

使其生效。 (将其设置为false,并在csproj文件中多次出现。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。