Android Binding - 找不到嵌套类型的***祖先,但存在于 aar 文件中

Posted

技术标签:

【中文标题】Android Binding - 找不到嵌套类型的***祖先,但存在于 aar 文件中【英文标题】:Android Binding - top ancestor not found for nested type but is present in aar file 【发布时间】:2018-08-09 14:11:56 【问题描述】:

我正在尝试为一个库 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>

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

绑定之后,这是我在程序集浏览器中看到的结果:

【问题讨论】:

您好,您能给我提供重现问题的步骤吗?或者提供一个demo? 嗨,Joe,我已经添加了对我的步骤的描述以及我对标准绑定项目所做的更改。我希望这已经足够了。 【参考方案1】:

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

我已经添加了

<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 现在已正确绑定到库中并且可以访问。

【讨论】:

我有一个项目很忙,我遇到了同样类型的错误。我不知道如何解决它。你能帮忙吗? @DonaldJansen 当然,给我发电子邮件 creytensp@gmail.com,我很乐意提供帮助

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

RowCategoryBinding 找不到符号

Xamarin.Android Binding 源自github第三方库的绑定(中级教学)----aar文件

Xamarin Android - 找不到类型或命名空间“上下文”

解析服务器:找不到推送类型 android 的发件人

通过 sbt-android 的 Scala/Idea/Android:找不到类型化 (TR) 的东西

Android Studio AIDL 自定义类型找不到问题