Aly*_*dad 2 c# xamarin.android xamarin xamarin.forms androidx
迁移到 AndroidX 并将所有 AndriodX 包更新到最新版本后,构建将失败,在obj文件夹中构建生成的 XML 文件中向我显示三个类似的错误:
\obj\Debug\100\lp\117\jl\res\values\values.xml:在预期项目的位置找到标签 IDXML 文件内容为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<id name="view_tree_lifecycle_owner"/>
</resources>
Run Code Online (Sandbox Code Playgroud)
\obj\Debug\100\lp\121\jl\res\values\values.xml:在预期项目的位置找到标签 IDXML 文件内容为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<id name="view_tree_saved_state_registry_owner"/>
</resources>
Run Code Online (Sandbox Code Playgroud)
\obj\Debug\100\lp\123\jl\res\values\values.xml:在预期项目的位置找到标签 IDXML 文件内容为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<id name="view_tree_view_model_store_owner"/>
</resources>
Run Code Online (Sandbox Code Playgroud)
在网上寻找解决方案后,我只是在每个生成的文件中更改<id name="...为<item type="id" name="...并且构建成功(即使我每次清理/重建时都必须重新执行此操作)。
但是,在应用程序的启动画面之后,应用程序崩溃并显示以下异常:
Java.Lang.RuntimeException:'无法获取提供程序 androidx.lifecycle.ProcessLifecycleOwnerInitializer:java.lang.ClassNotFoundException:在路径上找不到类“androidx.lifecycle.ProcessLifecycleOwnerInitializer”:DexPathList...
我查了一下,发现了许多建议启用和/或配置多 dex 的解决方案,但没有一个有效。
仅当链接设置为Sdk Assemblies Only或时才会出现此问题Sdk and User Assemblies。
以下是一些对我不起作用的配置:
我曾尝试启用/禁用 Enable Multi-Dex在Android Options项目属性选项卡。
我试过将标签中的android:name属性设置为.applicationAndroidManifest.xmlandroidx.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
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
update-package -reinstall在 Visual Studio 的包管理器控制台中执行。| 归档时间: |
|
| 查看次数: |
1072 次 |
| 最近记录: |