我经常在这里和那里看到术语android native code
,但不确定其确切含义。那么android的哪个部分是android native code
? Application
,Activity
,Fragment
,View
,Looper
android native code
是吗?
[更多上下文:我试图理解机器人测试中的阴影,并且在文档中据说“ Android本机代码无法在您的开发计算机上执行”,所以我想知道像Application
,[ C0]等Activity
在这里提到?android native code
Android开发中的http://robolectric.org/extending/一词已超载。
通过您为Robolectric提供的native
:
但是有局限性:
- 本机代码-Android本机代码无法在您的开发计算机上执行。
- 进程外调用-开发机器上没有运行Android系统服务。
- 测试API不足-Android几乎没有适合测试的API
Robooletric用一组称为Shadows ...的类填补了这些空白
所以在这种情况下,link引用要么是指:
Android native code
,Activity
,Fragment
,其中只有Android SDK应用程序需要运行模拟器或设备。但是Roboletric带来了自己的Android Framework代码,“影子”可以“增强”代码来测试应用程序。OR
View
使用Java本机接口(JNI)允许Java / Kotlin代码出于性能或兼容性原因而访问C / C ++代码。因此,使用Roboletric,您无法调用JNI代码Android Native Development Kit (NDK)。同一页后:
使用字节码工具Robolectric能够在跨平台伪造的实现中进行编织以替代本机代码,并添加其他API以使测试成为可能。
or at least not without some effort指的是属于Roboletric用来提供测试环境的Android框架的Java / Kotlin API。同样,这些将是您所指的substitute for native code
,Activity
,Fragment
等。
在这种情况下,术语“本机”的用法类似于使用第三方应用程序构建框架(例如“ React Native”,“ Ionic”,“ Flutter”,“ Xamarian”或“ Cordova / Phonegap”,他们可能会使用以Java / Kotlin编写的自定义组件作为View
来实现某些功能,这些功能只能通过与Android框架直接交互才能完成,而不能使用该第三方框架的语言/ API(例如Javascript,Dart,或C#。
Java及其同类(Kotlin,Scala等)是指通过Java Native接口(JNI)调用C / C ++代码为native component
,并且在Android上通过Native进行了开发套件(NDK)。位于移动框架之上的第三方应用程序开发框架会将对原始移动框架的调用称为“本机”。
不幸的是,由于这是移动开发中使用的术语的一部分,因此需要仔细阅读“ native”一词的使用。
我个人希望使用native
一词的文档包含native
或native Java/Kotlin APIs
之类的语言作为链接页面中的第一个实例时,让我来回询问作者的含义。
关注评论中的问题
- [您提到“他们可以使用用Java / Kotlin编写的自定义组件作为本机组件”,您在说自定义组件时指的是Activity,Fragment等,对吧?
在该特定部分中,我指的是第三方应用程序框架,它们会调用进入Android Framework的类或直接调用其中的一部分。通常,这些第三方应用程序框架已经包装/公开了Activity,View等。但是,作为开发人员,您可能需要一个库或其他自定义Java / Kotlin代码,这些代码可由第三方应用程序框架语言(Javascript,Dart, C#)。从第三方应用程序框架的角度来看,“包装的Java / Kotlin库”是native C/C++ APIs
,因为它是移动环境的“本机”。该包装的库代码不是用Javascript,Dart或C#编写的。同样,“本机”的含义也被重载。
- 在链接的第一段中,作者强调我们将以robolectric运行“真正的Android代码”。但是正如我们分析的那样,robolectric正在遮盖像Activity,Fragment之类的基本构建基块,这似乎与我矛盾。因此,我能想到的唯一解释是ShadowActivity包装了Real Activity的原始实现,您认为这是案件?
是的,ShadowActivity正在“包装”实际的Activity的原始实现,我会注意到作者指出:native component
重要的是,在最初定义影子方法的类的相应影子上实现影子方法。否则,Robolectric的查找机制将无法找到它们(即使它们已在影子子类上声明。)
和
Shadow类的继承层次结构并不总是镜像其关联的Android类的继承层次,有时必须通过这些实际对象进行调用,以便Robolectric运行时将有机会根据实际类将其路由到正确的Shadow类的对象
所以常规的Java继承并不是Shadows的正确思维模型。
Android本机代码不是Java或Kotlin。它不是像Activity或Fragment这样的类。 Android本机代码是C / C ++。 Shadow objects are not quite Proxies, not quite Fakes, not quite Mocks or Stubs.
是有关SDK(NDK)的一些信息。并且Here您可以找到NDK(本地开发套件)的概述。
希望有帮助。