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.aar
、geckoview-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.aar
、geckoview-nightly-93.0.20210823092315-sources.jar
和geckoview-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 - 构建时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章