据我了解,用Xamarin构建的应用在每个应用中都部署了一个单体运行时,在ART旁边工作,相互之间进行交流。
了解到目前安卓系统的限制,开始 API-28
你不能启动二进制文件,我想知道运行时实际上是如何启动的?
在这里的Xamarin文档中简单介绍了这一点。https:/docs.microsoft.comen-usxamarinandroidinternalsarchitecture#application-startup。
如果你看一下你的应用程序的构建输出在 obj/Debug/android/src/mono
你会注意到几个java文件。
MonoRuntimeProvider.java。
这将创建一个ContentProvider,它负责启动mono运行时和启动你的App。
MonoPackageManager_Resources.java。
这个类被MonoRuntimeProvider调用,MonoRuntimeProvider是一个帮助类,用于查找包含App的Assembly。
MonoRuntimeProvider被注册在AndroidManifest.xml中的Application标签中。这意味着当你的App启动时,Content provider也会启动,并反过来启动Mono Runtime。
在构建时,Android可调用的封装器(ACW)将为你的Activity(以及许多其他类型)生成。这是一种从Android世界中调用托管(C#代码)的方式。
如果你试着反编译你的App,你会看到在这种ACW的构造函数中,有一个对mono运行时寄存器的调用,并激活托管类型。
至于API-28中的限制,我在文档中没有看到任何地方提到不能启动二进制文件。对非SDK接口的限制. 如果你不能在你的Android应用中使用二进制文件,这意味着所有使用CC++ NDK库的应用都会被破坏。在过去,你可以在你的应用程序范围之外使用一些二进制文件,这些二进制文件是与Android捆绑在一起的,现在不允许了,你需要自己将其与你的App捆绑在一起。