返回博客首页
← 所有文章

NativeScript 中的 AndroidX 支持

2019 年 4 月 4 日 — 作者:Alexander Djenkov

如您所知,AndroidX 于 2018 年 Google I/O 大会上宣布,是对 Android 支持库 的主要包重命名。与支持库类似,AndroidX 与 Android 操作系统分开发布,并提供跨 Android 版本的向后兼容性。AndroidX 通过提供功能奇偶性和新库完全取代了支持库。

为什么 AndroidX 如此重要?

您可以在 Android 团队的专用博客文章 中找到 AndroidX 的介绍,但以下是其主要优势的摘要

  • AndroidX 中的所有包都位于以字符串 androidx 开头的统一命名空间中。支持库包已映射到相应的 androidx.* 包中。
  • 与支持库不同,AndroidX 包是单独维护和更新的。androidx 包使用严格的 语义版本控制,从版本 1.0.0 开始,因此您可以独立更新项目中的 AndroidX 库。
  • 所有新的支持库开发将在 AndroidX 库中进行。这包括对原始支持库工件的维护和新 Jetpack 组件的引入。
  • 迁移到 AndroidX 将使 Android 引入的新功能更容易获得。例如,Material Design 小部件是使用 AndroidX 积极开发的。


这对 NativeScript 意味着什么?

Google/Android 团队建议所有使用 Android 支持库的项目都应迁移到 AndroidX。由于 NativeScript 框架(跨平台模块、插件和类型)严重依赖支持库类,并且由于 Android 支持修订版 28.0.0 是在 android.support.* 包裹下发布的最后一个功能版本,因此我们现在计划在今年夏天晚些时候发布的 NativeScript 6.0 中为 NativeScript 进行迁移到 androidx 的工作。

请注意,Android 支持库和 AndroidX 不能在同一个项目中并排使用,因此从 NativeScript 6.0 开始,AndroidX 将成为支持库功能的官方版本,并且我们希望确保 NativeScript 应用和插件开发人员迁移到 AndroidX 的路径尽可能顺利和直接。

为此,我们现在发布了完全迁移到 AndroidX 的包 - `tns-core-modules@androidx`、`tns-core-modules-widgets@androidx`、`tns-platform-declarations@androidx` 和 `tns-android@androidx`。这些包可用于测试和迁移现有项目。应用程序和插件开发人员在迁移项目时都可以参考这些包。

迁移先决条件

迁移到新的代码库是一个需要时间的过程,需要先进行一些准备工作。

  • 依赖支持库命名空间的插件应迁移才能与 NativeScript 6.0 应用一起使用(我们建议创建与上述测试包一起工作的分支或包)。
  • 依赖支持库命名空间的应用程序应迁移才能与 NativeScript 6.0 一起使用。
注意:这些包仅用于测试和迁移目的。我们强烈建议不要使用它们开发新功能和生产应用,直到它们在 NativeScript 6.0 中正式发布。

注意:使用 `tns-core-modules@androidx` 的应用程序只能与迁移到新的 AndroidX 命名空间的插件和应用一起使用。任何支持库调用/命名空间都应更改为新的 AndroidX 命名空间。


迁移常见问题解答

问:如何开始迁移 NativeScript 项目?

我们提供了两个迁移到 AndroidX 的示例应用 - sample-androidx-tssample-androidx-ng。这些只是空白应用,没有额外的插件。如果您查看 package.json 文件,您将看到一些依赖项的特定版本。
  • "tns-core-modules": "^5.4.0-androidx-2019-XX-XX-XXXX" - 使用 AndroidX 的 NativeScript 核心模块包。 >/li>
  • "tns-platform-declarations": "^5.4.0-androidx-2019-XX-XX-XXXX"(可选) - 支持 AndroidX 的 NativeScript 类型
  • "tns-android": "5.3.0-XXXX-XXXX-XXX” - 用于 AndroidX 的 NativeScript 运行时版本
您可以将这些应用作为应用程序或插件迁移的起点。

问:我是一个 NativeScript 应用程序开发者。AndroidX 迁移如何影响我?

如果您计划迁移到 [email protected],您应该评估您的应用是否需要迁移,因为 [email protected] 默认情况下将启用 AndroidX。有几个关键点可以准备您的应用
  • (强制)安装 NativeScript AndroidX 特定依赖项
    • `npm install tns-core-modules@androidx --save-exact`
    • `tns platform add android@androidx`
    • `npm install tns-platform-declarations@androidx --save-exact`(如果您想要类型,则可选)
  • (如果需要)将您的应用程序代码迁移到新的 AndroidX 命名空间。由于 NativeScript 框架通过 JavaScript 启用对原生 Android API 的访问,因此您应该检查您的应用代码中是否存在任何支持库命名空间。例如,您应该更改
    new android.support.v7.widget.Toolbar(..)
    new androidx.appcompat.widget.Toolbar(..)
    如果在您的 javascript/typescript 中的某个地方使用它。支持库命名空间可能不仅出现在您的应用代码中,还可能出现在一些 .gradle 或 .xml 文件中。Gradle 文件可能会请求对某些支持库版本的依赖项,例如,请考虑搜索所有应用程序文件中的命名空间。
  • (如果有)将您的应用程序依赖项迁移到支持 AndroidX 的版本。最后但并非最不重要的一点是,您应该查看您的应用依赖项,因为您几乎肯定在应用程序中使用了某些 NativeScript 插件或 Android 插件(.gradle 文件中的依赖项)。一些依赖项可能依赖于支持库,这会导致类冲突(应用无法构建或会崩溃,因为缺少支持库类)。您应该检查所有依赖项是否与 AndroidX 兼容。请注意,迁移支持库依赖插件是一个正在进行的过程。某些插件可能不需要任何迁移,而其他插件可能需要时间来迁移。这就是为什么现在检查您的应用程序并相应地向我们或插件作者发出信号是一个好主意。
您可以 在此查看旧命名空间到新的 AndroidX 包的完整映射


问:我是一个 NativeScript 插件开发者。AndroidX 迁移如何影响我?

为了准备您的插件以支持 AndroidX,您需要执行以下几项操作

  • 将您的插件代码(java、javascript/typescript)迁移到新的 AndroidX 命名空间。
    您的 NativeScript Android 插件可能包含原生 java 和 JavaScript/TypeScript 代码。JavaScript/TypeScript 中的所有支持库命名空间都应手动迁移到新的 AndroidX 命名空间。当迁移插件的原生 java 部分时,有一些选择。您可以使用 Android Studio(3.2 及更高版本)通过选择重构 > 迁移到 AndroidX 来快速迁移项目。这将搜索整个原生项目中的支持库类,并建议重构到新的 AndroidX 命名空间。
    Android Studio 迁移工具是一个不错的选择,但您也应该考虑手动搜索和替换所有命名空间及其对应的命名空间,以提高可靠性。
    如果您选择使用 Android Studio 迁移,请考虑手动检查和比较迁移工具做出的所有建议,因为在自动迁移工具方面,有一些已知问题(与命名空间的正确映射有关)。
  • 将您的应用程序依赖项迁移到支持 AndroidX 的版本。除了前面主题中描述的 npm 包外,您的插件还可能依赖于其他一些原生插件 - android 插件、自定义 aar 或 jar。请考虑测试它们是否都与 AndroidX 兼容。还要考虑更新您的 build.gradle。在其中设置一些支持库工件是一种常见的做法

     

    dependencies {
      implementation 'com.android.support:appcompat-v7:28.0.0'
      implementation 'com.android.support:recyclerview-v7:28.0.0'
    }

问:有可以帮助迁移的工具吗?

有一个工具(androidx-migration-tool)可以帮助您迁移支持库命名空间和工件。它是一个简单的 NodeJS 包,它接受您的项目根目录作为参数以启动迁移过程。请考虑对源代码管理下的项目目录使用 ns-androidx-migrate,因为它将直接搜索和替换文件。此工具不会执行所有必要的迁移步骤,您仍然需要手动更新任何工件字符串、依赖项和插件。在使用它之前,请查看 自述文件