所以我花了一些时间让绑定为此工作。我将以下内容添加到 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 类包含一个 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/
完成此操作后,它就会运行!