首页 文章

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

提问于
浏览
0

我正在尝试为库创建一个绑定,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

1 回答

  • 0

    我已经弄清楚为什么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现在已正确绑定到库中并可访问 .

相关问题