BindingGenerator - 构建时出现语法错误

BindingGenerator - Syntax Error when building

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

1>BINDINGSGENERATOR : error (37: 14): Syntax error, expected: #PCDATA, , , , , {@code, {@docRoot}, {@inheritDoc}, {@link, {@linkplain, {@literal, {@value}, {@value, UnknownHtmlElementStart, @author, @apiSince, @deprecated, @deprecatedSince, @exception, @param, @return, @see, @serialData, @serialField, @since, @throws, @[unknown], @version

要重现问题,请按照步骤 Binding an .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 绑定库 Xamarin C#)
  2. 导航至 Mozilla Maven 并下载 geckoview-nightly-93.0.20210823092315.aargeckoview-nightly-93.0.20210823092315-sources.jargeckoview-nightly-93.0.20210823092315-javadoc.jar 文件。
  3. 将这 3 个文件移动到 Jars 目录并将它们包含在项目中(您可能需要通过文件属性取消阻止文件)。这是我的 Jars 目录的样子:
  4. 为文件设置生成操作如下:javadoc.jar => JavaDocJar sources.jar => JavaSourceJar and .aar => LibraryProjectZip
  5. 重建解决方案(您应该看到至少 5 个错误)例如:BINDINGSGENERATOR : Syntax error 沿着这些线。

所以我花了一些时间让绑定工作。我将以下内容添加到 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 class 包含一个 NewSettings 方法,该方法在 RuntimeSettings 和生成代码中的构建器之间有所不同。我只是选择删除它。
  4. 重命名生成的 属性 名称是由于 Java 8 功能,您可以在 Java 的界面中拥有 static 字段。这将在生成的代码中生成一个摘要class。此 class 名称与为这些代表的 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

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

完成后它就会运行!