【问题标题】:What is the definition of Android Native Code?Android Native Code的定义是什么?
【发布时间】:2020-01-29 05:25:02
【问题描述】:

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

更多上下文:我试图了解 robolectric 测试中的阴影,并且在文档中说“Android 本机代码无法在您的开发机器上执行”,所以我想知道像 Application 这样的类, Activityandroid native code 提到这里? http://robolectric.org/extending/

【问题讨论】:

    标签: android native definition


    【解决方案1】:

    Android开发中native这个词超载了。

    查看您为 Robolectric 提供的 link

    但是有一些限制:

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

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

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

    • Android 框架类,如 ActivityFragmentView,其中只有 Android SDK 应用程序需要模拟器或设备才能运行。但 Roboletric 带来了自己的 Android 框架代码,可以通过“Shadows”“增强”以测试应用程序。

    稍后在同一页面:

    使用字节码检测,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 框架直接交互而不是第三方框架的语言/API(如 Javascript、Dart)来完成的功能, 或 C#。

    Java 及其近亲(Kotlin、Scala 等)是指通过 Java Native 接口 (JNI) 将 C/C++ 代码调用为 native,并且在 Android 上由 本机开发工具包 (NDK)。位于移动框架之上的第三方应用程序开发框架会将对原始移动框架的调用称为“本机”。

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

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

    跟进 cmets 中的问题

    1. 您提到“他们可能会使用用 Java/Kotlin 编写的自定义组件作为原生组件”,您在说自定义组件时指的是 Activity、Fragment 等,对吧?

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

    1. 在链接的第一段中,作者强调我们将在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 的正确思维模型。

    【讨论】:

    • @MartinZeitler 哦,我同意这种滥用,但如果开发人员要在野外看到这些术语,那么更正确的理解会更好。我的答案的哪一部分令人震惊/不正确?
    • @MartinZeitler 它的乌龟一路向下,JVM 调用 C 语言“本地”,第三方应用程序框架调用 Android 运行时“本地”。我会将其添加到答案中,但会接受建设性的反馈。
    • 虽然我们可以讨论“本机”在具有 Ahead-Of-Time 和运行时编译的平台上的含义,即使该语言本身是基于 VM 的。我不确定这如何回答我的“我的答案有什么问题”的问题。如果你觉得太离谱了,请放下你自己的。
    • @MartinZeitler 做了我的更正,如果你同意让我们清理 cmets。
    • 认为现在更清楚了,但是 Kotlin 也被转换为 Java 字节码 - 而原生基本上总是指二进制机器码。
    【解决方案2】:

    Android 原生代码不是 Java 或 Kotlin。它不是像 Activity 或 Fragment 这样的类。 Android 原生代码是 C/C++。 Here 是关于 SDK(NDK) 的一些信息。 和here你可以找到NDK(native development kit)的概述。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2022-12-14
      • 2015-08-30
      • 2022-12-08
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多