BindingGenerator - 构建时出现语法错误

Posted

技术标签:

【中文标题】BindingGenerator - 构建时出现语法错误【英文标题】:BindingGenerator - Syntax Error when building 【发布时间】:2021-10-23 23:45:07 【问题描述】:

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

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

要复制问题,请按照步骤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 文件构建绑定库时遇到过此类问题?


编辑每条评论

版本信息

VS版本:16.10.4 Xamarin.Android.SDK 版本:11.3.0.4 Xamarin 版本:16.10.000.234

复制步骤

    创建一个新项目(Android 绑定库 Xamarin C#) 导航到Mozilla Maven 并下载geckoview-nightly-93.0.20210823092315.aargeckoview-nightly-93.0.20210823092315-sources.jargeckoview-nightly-93.0.20210823092315-javadoc.jar 文件。 将这3个文件移动到Jars目录并包含在项目中(您可能需要通过文件属性解除对文件的阻止)。这是我的Jars 目录的样子: 为文件设置构建操作如下:javadoc.jar => JavaDocJar sources.jar => JavaSourceJar.aar => LibraryProjectZip 重建解决方案(您应该会看到至少 5 个错误),例如:BINDINGSGENERATOR : Syntax error 沿着这些线。

【问题讨论】:

您使用的是哪个 aar?我们如何重现这个问题?可以发一下步骤吗? @JessieZhang-MSFT 希望我的更新能让帖子更清晰,谢谢。 你真的需要javadoc吗?对我来说,它看起来像是与 javadoc 相关的事情失败了。 在我看来它们是可选的。我只是在我的机器上尝试了只有 aar。它似乎在构建。 我有点快,为 AAR 选择了错误的目标。至少我现在得到的错误与你得到的那些 java doc 不同。您可能需要通过元数据转换对此进行调整。 【参考方案1】:

所以我花了一些时间让绑定为此工作。我将以下内容添加到 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 *** 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可以解释为:

    首先remove-node 删除了一些您无论如何都不会使用的内部组件。因此无需为此创建绑定。 第二个删除字段mWindow,由于某种原因被公开。我刚刚删除了它,我们也可以更改可见性。 第三个我不是 100% 确定如何修复。 RuntimeSettings 类包含一个 NewSettings 方法,该方法在 RuntimeSettings 和生成代码中的构建器之间有所不同。我只是选择删除它。 重命名生成的属性名称是由于 Java 8 的一项功能,您可以在 Java 的接口中拥有 static 字段。这将在生成的代码中生成一个抽象类。此类名称与为这些委托的 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(Android 版本)的 .jar 文件并添加为 EmbeddedReferenceJar:https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/

完成此操作后,它就会运行!

【讨论】:

这是伟大的工作,谢谢!看来我的问题确实是我的Metadata 文件被搞砸了,我已经在你的帮助下构建了它。我将进一步研究org.yaml.snakeyaml.constructor.Constructor 问题,现在不确定。 查看我的更新答案。让它运行。只需要在运行时添加一些 GeckoView 需要的依赖项。 你可以在这里获取完整的项目:github.com/Cheesebaron/GeckoViewBinding 再次感谢@Cheesebaron 感谢您抽出宝贵的时间。我现在已经完成了我需要的一切工作。 @Chessebaron 我会在被允许的情况下给予赏金,你必须等待 ~24 小时才能给予。截至目前,大约再过 4 小时,我可以奖励它。

以上是关于BindingGenerator - 构建时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

构建时出现构建顺风弃用错误

尝试离子构建时出现角度firebase构建错误

在 iOS 中构建 Flutter 时出现构建错误

为啥我在为 Flutter 使用 codemagic 构建代码时出现“无法为 iOS 构建”?

使用 CMake 构建 fmt 时出现问题

构建 presto 时出现异常