Android开发中native这个词超载了。
查看您为 Robolectric 提供的 link:
但是有一些限制:
- 本机代码 - Android 本机代码无法在您的开发机器上执行。
- 进程外调用 - 您的开发机器上没有运行 Android 系统服务。
- 测试 API 不足 - Android 包含几乎没有适合测试的 API
Roboletric 用一组称为 Shadows 的类填补了这些空白......
所以在这种情况下,Android native code 引用要么是指:
- Android 框架类,如
Activity、Fragment、View,其中只有 Android SDK 应用程序需要模拟器或设备才能运行。但 Roboletric 带来了自己的 Android 框架代码,可以通过“Shadows”“增强”以测试应用程序。
或
稍后在同一页面:
使用字节码检测,Robolectric 能够编织跨平台的虚假实现以替代本机代码并添加额外的 API 以使测试成为可能。
substitute for native code 指的是属于 Android 框架的 Java/Kotlin API,Roboletric 正在替代它以提供测试环境。同样,这些将是您所指的Activity、Fragment、View 等。
在这种情况下,术语“native”的用法类似于使用第三方应用程序构建框架的开发人员,例如“React Native”、“Ionic”、“Flutter”、“Xamarian”或“Cordova/Phonegap” ,他们可能会使用用 Java/Kotlin 编写的自定义组件作为 native component 来实现一些只能通过与 Android 框架直接交互而不是第三方框架的语言/API(如 Javascript、Dart)来完成的功能, 或 C#。
Java 及其近亲(Kotlin、Scala 等)是指通过 Java Native 接口 (JNI) 将 C/C++ 代码调用为 native,并且在 Android 上由 本机开发工具包 (NDK)。位于移动框架之上的第三方应用程序开发框架会将对原始移动框架的调用称为“本机”。
遗憾的是,这是移动开发中使用的术语的一部分,因此需要仔细阅读“本地”一词的使用。
就我个人而言,如果使用单词native 的文档包含native Java/Kotlin APIs 或native C/C++ APIs 之类的语言,因为链接页面中的第一个实例让我来回讨论作者的意思。
跟进 cmets 中的问题
- 您提到“他们可能会使用用 Java/Kotlin 编写的自定义组件作为原生组件”,您在说自定义组件时指的是 Activity、Fragment 等,对吧?
在该特定部分中,我指的是第三方应用程序框架调用 Android 框架类或直接调用它的一部分。通常,那些第三方应用程序框架已经封装/公开了 Activity、View 等,但作为开发人员,您可能需要一个库或其他自定义 Java/Kotlin 代码,这些代码可以由第三方应用程序框架语言(Javascript、Dart、 C#)。从第三方应用程序框架的角度来看,“包装的 Java/Kotlin 库”是native component,因为它是移动环境的“原生”。包装好的库代码不是用 Javascript、Dart 或 C# 编写的。再次强调“本机”的含义。
- 在链接的第一段中,作者强调我们将在robolectric中运行“真正的Android代码”。但是正如我们分析的那样,robolectric 是在对 Activity、Fragment 之类的基本构建块进行阴影处理,这在我看来是自相矛盾的,所以我能想到的唯一解释是 ShadowActivity 是对真实 Activity 的原始实现进行包装,您认为这是案子?
是的,ShadowActivity 正在“包装”真实 Activity 的原始实现,我注意到作者声明:Shadow objects are not quite Proxies, not quite Fakes, not quite Mocks or Stubs.
重要的是,影子方法是在最初定义它们的类的相应影子上实现的。否则 Robolectric 的查找机制将找不到它们(即使它们已在影子子类中声明。)
和
Shadow 类继承层次并不总是反映其关联的 Android 类,有时需要通过这些真实对象进行调用,以便 Robolectric 运行时有机会根据实际情况将它们路由到正确的 Shadow 类对象的类
因此,常规的 Java 继承并不是 Shadows 的正确思维模型。