Android绑定 - 找不到嵌套类型的顶级祖先,但存在于aar文件中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android绑定 - 找不到嵌套类型的顶级祖先,但存在于aar文件中相关的知识,希望对你有一定的参考价值。

我正在尝试为库创建一个绑定,Firebase.Messaging,因为Nuget上的当前版本不是最新的,但是这个.aar库中的一个类没有被添加到绑定中。这是RemoteMessage.class。

当我反编译firebase-messaging.aar时,我确实看到.aar文件中存在RemoteMessage.class但是当我将这个.aar文件添加到我的绑定项目并运行时,我得到以下错误:

警告BG8604:找不到嵌套类型Firebase.Messaging.RemoteMessage.Builder的顶级祖先RemoteMessage。 (BG8604)

这意味着例如该方法 public override void OnMessageReceived(RemoteMessage message) 将不会添加到我的绑定,因为找不到RemoteMessage。我试图通过使用<add-note ...手动将其添加到我的绑定,但到目前为止没有运气。

在我的绑定中,我添加了对firebase-common,firebase-iid,googleplayservices-basement,googleplayservices-tasks的引用。

有没有人知道如何强制我的绑定识别RemoteMessage类并将其添加到绑定?

编辑:我做的是为android创建一个新的Xamarin Binding项目,将aar文件添加到Jars文件夹并更新Metadata.xml

这是我目前使用的metadata.xml:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<!-- Rename Namespaces -->
<attr path="/api/package[@name='com.google.firebase.messaging']" name="managedName">Firebase.Messaging</attr>
<!-- Remove *zz* obfuscated classes, interfaces, methods, etc. -->
<remove-node path="/api/package/class[contains(@name, 'zz')]" />
<remove-node path="/api/package/interface[contains(@name, 'zz')]" />
<remove-node path="/api/*/*/method[contains(@name, 'zz')]" />
<remove-node path="/api/*/*/field[contains(@name, 'zz')]" />

<!-- Fix params for some inherited parcelable types -->
<attr path="/api/*/*/method[@name='createFromParcel']/parameter[@name='p0']" name="managedName">source</attr>
<attr path="/api/*/*/method[@name='newArray']/parameter[@name='p0']" name="managedName">size</attr>
<attr path="/api/*/*/method[@name='writeToParcel']/parameter[@name='p0']" name="managedName">dest</attr>
<attr path="/api/*/*/method[@name='writeToParcel']/parameter[@name='p1']" name="managedName">flags</attr>

</metadata>

添加文件夹,EnumFields或EnumMethods中没有任何内容,目前我正在使用firebase-messaging-11.8.0.aar进行此绑定。

在Binding之后,这是我在Assembly Browser中看到的结果:Assembly Browser Image

答案

我已经弄清楚为什么RemoteMessage无法绑定,因此对于几个方法和类,无法找到顶级祖先。 GooglePlay地下室和任务库已更改。这导致了内部问题,因为依赖于混淆的类RemoteMessage现在再次不可见,我使用的元数据依赖于11.4.2但是从11.8.0开始,在任务库中找不到这个混淆的类,但在地下室库中,也有不同的名字。

我已经添加了

<attr path="/api/package[@name='com.google.android.gms.internal']/class[@name='zzbfm']" name="obfuscated">false</attr>
<!-- Fix plural name - legacy compatibility -->
<attr path="/api/package[@name='com.google.android.gms.common.api']/class[@name='Status']" name="managedName">Statuses</attr>
<attr path="/api/package[@name='com.google.android.gms.common.api']/class[@name='Status']" name="extends">Java.Lang.Object</attr>

<add-node path="/api/package[@name='com.google.android.gms.common.api']/class[@name='Status']">
    <method abstract="false" deprecated="not deprecated" final="true" name="describeContents" native="false" return="int" static="false" synchronized="false" visibility="public"></method>
</add-node>

对于Metadata.xml,zzbfm是RemoteMessage所依赖的类,因此是需要进行非模糊处理的类。

在我的Basement Metadata.xml中更新它并重新绑定Firebase.Messaging库后,RemoteMessage现在已正确绑定在库中并可访问。

以上是关于Android绑定 - 找不到嵌套类型的顶级祖先,但存在于aar文件中的主要内容,如果未能解决你的问题,请参考以下文章

IllegalStateException:在父或祖先上下文类 android.support.v7.widget.AppCompatButton 中找不到方法 insert(View)

WPF 从后面的代码添加的 UserControl 绑定到祖先

Android 数据绑定:在生成的数据绑定文件中找不到 ...BindingImpl

Android 数据绑定:如何避免“找不到 KaptTask”警告

如何解决:使用自定义视图实现双向数据绑定时“找不到属性'android:text'的getter”?

数据绑定找不到标识符“视图”