gpt4 book ai didi

c# - Xamarin Android 迁移到 AndroidX 后找不到类 "androidx.lifecycle.ProcessLifecycleOwnerInitializer"

转载 作者:行者123 更新时间:2023-12-04 14:44:43 24 4
gpt4 key购买 nike

在迁移到 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: 'Unable to get provider androidx.lifecycle.ProcessLifecycleOwnerInitializer: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwnerInitializer" on path: DexPathList...

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

问题仅在链接设置为Sdk Assemblies Only 时出现或 Sdk and User Assemblies .

以下是一些不适用于我的配置:

  • 我已尝试启用/禁用 Enable Multi-DexAndroid Options项目属性中的选项卡。

  • 我试过设置android:name application 中的属性标记 AndroidManifest.xmlandroidx.multidex.MultiDexApplication .

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

  • 我尝试过制作MainApplication类继承自为 AndroidX MultiDexApplication 手动创建的绑定(bind),如下所示:

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。
  • 我已尝试执行 update-package -reinstall在 Visual Studio 的包管理器控制台中。

最佳答案

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

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

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

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

关于c# - Xamarin Android 迁移到 AndroidX 后找不到类 "androidx.lifecycle.ProcessLifecycleOwnerInitializer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63940997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com