首页 > 解决方案 > BindingGenerator - 构建时出现语法错误

问题描述

我正在尝试构建一个绑定库(.AAR 绑定)并不断收到错误,如下所示:

1>BINDINGSGENERATOR : error (37: 14): 语法错误,预期:#PCDATA, , , , , {@code, {@docRoot}, {@inheritDoc}, {@link, {@linkplain, {@literal, { @value},{@value,UnknownHtmlElementStart,@author,@apiSince,@deprecated,@deprecatedSince,@exception,@param,@return,@see,@serialData,@serialField,@since,@throws,@[unknown] , @版本

要复制问题,请按照绑定 .AAR的步骤操作。

文件、.AAR文档和来源来自Gecko Nightly Build geckoview-nightly-90.0.20210420095122.aargeckoview-nightly-90.0.20210420095122-javadoc.jar并且 geckoview-nightly-90.0.20210420095122-sources.jar

目标框架:(Android 10.0(Q)我也尝试过 9.0,没有运气)

*这是我得到的错误的屏幕截图,除了错误之外别无其他BINDINGSGENERATOR

在此处输入图像描述

从文件构建绑定库时,有没有其他人遇到过此类问题.AAR


编辑评论

版本信息

重现步骤

  1. 创建一个新项目(Android Bindings Library Xamarin C#)
  2. 导航到Mozilla Maven并下载geckoview-nightly-93.0.20210823092315.aar,geckoview-nightly-93.0.20210823092315-sources.jargeckoview-nightly-93.0.20210823092315-javadoc.jar文件。
  3. 将这 3 个文件移动到Jars目录并将它们包含在项目中(您可能需要通过文件属性取消阻止文件)。这是我的Jars目录的样子:在此处输入图像描述
  4. 为文件设置构建操作如下:javadoc.jar=> JavaDocJar sources.jar=>JavaSourceJar.aar=>LibraryProjectZip
  5. 重建解决方案(您应该看到至少 5 个错误),例如:BINDINGSGENERATOR : Syntax error沿着这些思路。

标签: javac#xamarin

解决方案


所以我花了一些时间让绑定为此工作。我将以下内容添加到 Metadata.xml 文件以使其绑定。

<metadata>
    <remove-node path="/api/package[contains(@name,'org.mozilla.thirdparty')]" />
    <remove-node path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/field[@name='mWindow']" />
    <remove-node path="/api/package[@name='org.mozilla.geckoview']/class[@name='RuntimeSettings.Builder']/method[@name='newSettings' and count(parameter)=1 and parameter[1]]" />

    <!-- Because of interfaces contain const fields Xamarin generate abstract classes, which clash with property name. Renaming properties -->
    <attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='getHistoryDelegate' and count(parameter)=0]" name="propertyName">SessionHistoryDelegate</attr>
    <attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='setHistoryDelegate' and count(parameter)=1 and parameter[1][@type='org.mozilla.geckoview.GeckoSession.HistoryDelegate']]" name="propertyName">SessionHistoryDelegate</attr>

    <attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='getNavigationDelegate' and count(parameter)=0]" name="propertyName">SessionNavigationDelegate</attr>
    <attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='setNavigationDelegate' and count(parameter)=1 and parameter[1][@type='org.mozilla.geckoview.GeckoSession.NavigationDelegate']]" name="propertyName">SessionNavigationDelegate</attr>

    <attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='getPermissionDelegate' and count(parameter)=0]" name="propertyName">SessionPermissionDelegate</attr>
    <attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='setPermissionDelegate' and count(parameter)=1 and parameter[1][@type='org.mozilla.geckoview.GeckoSession.PermissionDelegate']]" name="propertyName">SessionPermissionDelegate</attr>

    <attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='getSelectionActionDelegate' and count(parameter)=0]" name="propertyName">SessionSelectionActionDelegate</attr>
    <attr path="/api/package[@name='org.mozilla.geckoview']/class[@name='GeckoSession']/method[@name='setSelectionActionDelegate' and count(parameter)=1 and parameter[1][@type='org.mozilla.geckoview.GeckoSession.SelectionActionDelegate']]" name="propertyName">SessionSelectionActionDelegate</attr>
</metadata>

remove-node可以解释为:

  1. 首先remove-node删除一些您无论如何都不会使用的内部组件。所以不需要为此创建绑定。
  2. 第二个删除由于mWindow某种原因公开暴露的字段。我刚刚删除了它,我们也可以更改可见性。
  3. 第三个我不是 100% 确定如何解决。该类RuntimeSettings包含在生成的代码中与构建器NewSettings不同的方法。RuntimeSettings我只是选择删除它。
  4. 生成的属性名称的重命名是由于 Java 8 的特性,您可以static在 Java 的接口中拥有字段。这将在生成的代码中生成一个抽象类。此类名称与为这些委托的 Setter/Getter 生成的属性名称冲突。

这使得绑定构建。然后,我在 MainActivity 中添加了一个带有以下代码的简单示例项目,以在屏幕上显示一些内容:

public class MainActivity : AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
            
        var geckoView = new GeckoView(this);
        geckoView.LayoutParameters = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent);
        SetContentView(geckoView);

        var session = new GeckoSession();
        GeckoRuntime runtime = GeckoRuntime.Create(this);
        session.Open(runtime);

        geckoView.Session = session;

        session.LoadUri("https://blog.ostebaronen.dk");
    }
}

一切都建立了,但现在它在运行时崩溃,声称丢失org.yaml.snakeyaml.constructor.Constructor。不确定这个 aar 是否需要一些额外的依赖,需要在绑定时添加。

编辑:

我检查了您链接到的 GeckoView 版本的 POM,没有 SnakeYAML 的痕迹。但是,找到的最新版本 (93.0.20210825095400) 确实有它:

<dependency>
  <groupId>org.yaml</groupId>
  <artifactId>snakeyaml</artifactId>
  <version>1.24</version>
</dependency>

它还具有运行时需要的其他一些依赖项。在绑定项目中安装以下 NuGet 包:

  • Xamarin.AndroidX.Annotation
  • Xamarin.AndroidX.Legacy.Support.V4
  • Xamarin.AndroidX.Lifecycle.Extensions

此外,下载.jarSnakeYAML 1.24(android 版本)的文件并添加为EmbeddedReferenceJarhttps ://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/

在此处输入图像描述

完成此操作后,它运行!

在此处输入图像描述


推荐阅读