Android Native Code的定义是什么?



我总是在这里和那里看到这个词android native code但不确定它到底是什么。那么安卓的哪一部分android native code呢?ApplicationActivityFragmentViewLooperandroid native code吗?

更多上下文:我试图理解机器人测试中的阴影,并且在文档中说"Android 本机代码无法在您的开发机器上执行",所以我想知道这里是否android native code引用ApplicationActivity等类? http://robolectric.org/extending/

Android开发中的单词native是重载的。

通过您为 Robolectric 提供的链接:

但是,存在一些限制:

  1. 原生代码 - Android 原生代码无法在开发计算机上执行。
  2. 进程外调用 - 开发计算机上没有运行 Android 系统服务。
  3. 测试API不足 - Android 几乎没有适合测试的 API

Roboletric用一组称为Shadows的类填补了这些空白......

因此,在这种情况下,Android native code引用要么是指:

  • ActivityFragment这样的Android框架类View只有Android SDK应用程序需要模拟器或设备才能运行。但是Roboletric带来了自己的Android Framework代码,可以通过"Shadows"来"增强"以测试应用程序。

  • Android Native Development Kit (NDK),它使用 Java Native Interface (JNI) 允许 Java/Kotlin 代码出于性能或兼容性原因访问 C/C++ 代码。因此,使用 Roboletric,您无法调用 JNI 代码,或者至少不能不费吹灰之力。

在同一页的后面:

使用字节码检测,Robolectric能够编织跨平台的虚假实现来替代本机代码并添加额外的API以使测试成为可能。

substitute for native code是指属于 Android 框架的 Java/Kotlin API,Roboletric 正在替换它以提供测试环境。同样,这些将是你所指的ActivityFragmentView等。

在这种情况下,术语"native"的用法类似于使用第三方应用程序构建框架(如"React Native","Ionic","Flutter","Xamarian"或"Cordova/Phonegap")的开发人员,他们可以使用用Java/Kotlin编写的自定义组件作为native component来实现某些功能,这些功能只能通过与Android框架的直接交互来完成,但不能使用Javascript等第三方框架的语言/API, 飞镖,或 C#。

Java及其同类(Kotlin,Scala等)是指通过Java本机接口(JNI)调用C/C++代码作为native,并且在Android上由本机开发工具包(NDK)提供便利。位于移动框架之上的第三方应用开发框架会将对原始移动框架的调用称为"本机"。

遗憾的是,由于这是移动开发中使用的术语的一部分,因此需要仔细阅读"本机"一词的使用。

就我个人而言,我希望使用单词的文档native包含native Java/Kotlin APIsnative C/C++ APIs之类的语言作为链接页面中的第一个实例,让我来回讨论作者的意思。

跟进评论中的问题

  1. 您提到"他们可能会使用用 Java/Kotlin 编写的自定义组件作为本机组件",您在说自定义组件时指的是活动、片段等,对吧?

在那部分,我指的是第三方应用程序框架调用Android框架的类或直接调用其中的一部分。通常,这些第三方应用程序框架已经包装/公开了Activity,View等,但作为开发人员,您可能需要一个库或其他自定义Java/Kotlin代码,这些代码可以通过第三方应用程序框架语言(Javascript,Dart,C#)调用。从第三方应用程序框架的角度来看,"包装的 Java/Kotlin 库"是一种native component,因为它是移动环境的"原生"。包装的库代码不是用Javascript,Dart或C#编写的。"本地"的含义再次超载。

  1. 链接的第一段中,作者强调我们将在机器人中运行"真正的Android代码"。但是正如我们所分析的,机器人正在掩盖像活动,片段这样的基本构建块,这对我来说似乎是矛盾的,所以我能想到的唯一解释是ShadowActivity正在包装真实活动的原始实现,你认为是这样吗?

是的,ShadowActivity 正在"包装"真实活动的原始实现,我会注意到作者指出:Shadow objects are not quite Proxies, not quite Fakes, not quite Mocks or Stubs.

在最初定义它们的类的相应影子上实现影子方法非常重要。否则,Robolectric的查找机制将无法找到它们(即使它们已在影子类上声明)。

影子类继承层次结构并不总是反映其关联的 Android 类,有时需要通过这些真实对象进行调用,以便 Robolectric 运行时有机会根据对象的实际类将它们路由到正确的 Shadow 类

因此,常规的Java继承并不是Shadows的正确心智模型。

Android 原生代码不是 Java 或 Kotlin。它不是像活动或片段这样的类。Android 原生代码是 C/C++。以下是有关 SDK(NDK) 的一些信息。 在这里,您可以找到 NDK(原生开发工具包)的一般概述。

希望对您有所帮助。

最新更新