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.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
and .aar
=> LibraryProjectZip
- 重建解决方案(您应该看到至少 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
可以解释为:
- 首先
remove-node
删除一些您无论如何都不会使用的内部构件。因此无需为此创建绑定。
- 第二个删除由于某种原因公开暴露的字段
mWindow
。我刚刚删除了它,我们也可以更改可见性。
- 第三个我不是 100% 确定如何修复。
RuntimeSettings
class 包含一个 NewSettings
方法,该方法在 RuntimeSettings
和生成代码中的构建器之间有所不同。我只是选择删除它。
- 重命名生成的 属性 名称是由于 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 文件)并添加为 EmbeddedReferenceJar
:https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/
完成后它就会运行!
我正在尝试构建绑定库(.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.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
and.aar
=>LibraryProjectZip
- 重建解决方案(您应该看到至少 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
可以解释为:
- 首先
remove-node
删除一些您无论如何都不会使用的内部构件。因此无需为此创建绑定。 - 第二个删除由于某种原因公开暴露的字段
mWindow
。我刚刚删除了它,我们也可以更改可见性。 - 第三个我不是 100% 确定如何修复。
RuntimeSettings
class 包含一个NewSettings
方法,该方法在RuntimeSettings
和生成代码中的构建器之间有所不同。我只是选择删除它。 - 重命名生成的 属性 名称是由于 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 文件)并添加为 EmbeddedReferenceJar
:https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/
完成后它就会运行!