返回博客主页
← 所有文章

将 {N} Android 插件从版本 1.7 迁移到 2.0

2016 年 3 月 14 日 — 作者 Plamen Petkov

将 {N} Android 插件从版本 1.7 迁移到 2.0

处理插件结构中必要破坏性更改的快速指南。


随着 {N} 项目的进展和我们的成长,总会有改变的必要。在这种情况下,是一个 **破坏性更改**。别担心,它不像一开始听起来那么可怕,但我建议你还是阅读这篇文章。毕竟,**花几个小时编码可以节省几分钟阅读文档的时间**。

迁移后插件将是什么样子?

 迁移后  迁移前
+-- index.js
+-- package.json
+-- MyModule1/
¦    +-- index1.js
¦    +-- package.json
+-- MyModule2/
¦    +-- index2.js
¦    +-- package.json
+-- platforms/
    +-- android/
         +-- myLibrary.jar
        +-- myLibrary.aar
        +-- include.gradle
+-- index.js
+-- package.json
+-- MyModule1/
¦    +-- index1.js
¦    +-- package.json
+-- MyModule2/
¦    +-- index2.js
¦    +-- package.json
+-- platforms/
    +-- android/
         +-- myLibrary.jar
        +-- myLibrary.aar
        +-- include.gradle
        +-- AndroidManifest.xml
           +-- res/

插件迁移 **只会影响 platforms/android 文件夹,其他任何内容都不会受到影响**。

看到新结构后你可能有什么问题?

  • AndroidManifest.xml 发生了什么?我应该把我的配置放在哪里?
    有两个选择

    你可以简单地将 platforms/android/AndroidManifest.xml 的内容移动到 .aar 的 AndroidManifest.xml 中。如果你不知道 .aar 文件是什么:它是 Android Studio 模块项目 的输出。正如你在 这里 的规范中看到的那样,.aar 项目结构包含一个 AndroidManifest.xml。

    第二个选项更简单。自 1.6 版本发布以来,app/App_Resources/Android/ 中有一个 AndroidManifest.xml,你可以将所有配置放在那里。

  • res/ 文件夹发生了什么?如何在清单中声明的资源?
    这就是 .aar 的作用。如果你再看看 .aar 规范,你会发现那里有你需要的一切以及更多。

  • 那些在 AndroidManifest.xml 中需要一些额外配置的 .jar 文件怎么办?
    和以前一样。要么构建一个 .aar 文件,要么转到 app/App_Resources/Android/AndroidManifest.xml 并将必要的配置放在那里。

  • 还有其他变化吗?
    是的,但好消息是,它们是 **仅删除**。你需要转到 include.gradle 文件(如果你有的话),并完全删除第一块代码。
    // 默认元素
    android {
        productFlavors {
            "my-plugin" {
                dimension "my-plugin"
            }
        }
    }

    这段代码不再需要,并且由于 productFlavors 名称的连接,在 Windows 上不再会出现路径过长的问题。

为什么我们需要这种改变?

正如你在 android gradle 插件文档 中看到的那样,.aar 文件是 推荐的方式 在 gradle 构建系统中使用依赖项。通过插件结构的更改,我们将获得 gradle 提供的所有优势,而不会有任何我们现在遇到的缺点。让我举一些例子说明为什么当前结构存在问题。

  • 案例 1
    ...
    +-- platforms/
        +-- android/
            +-- myLibrary.jar
            +-- AndroidManifest.xml

    当 AndroidManifest.xml 公开时,如果还有其他插件也具有 AndroidManifest.xml 文件,并且在某些时候它们将不得不合并在一起。目前没有简单的方法可以做到这一点,我们需要采取额外的步骤来确保正确的输出。使用 .aar 格式时,gradle 会自动完成此操作。

  • 案例 2
    ...
    +-- platforms/
        +-- android/
             +-- myLibrary.jar
            +-- myLibrary.aar
            +-- AndroidManifest.xml

    好的,我们有一个 AndroidManifest.xml,但 .aar 文件也具有 AndroidManifest.xml 文件,正如我们在 .aar 规范 中看到的,所以为什么我们应该有两个,当我们只有一个时,gradle 系统将负责合并清单以及你放在 .aar 文件中的所有资源。

  • 案例 3
    ...
    +-- platforms/
        +-- android/
            +-- myLibrary.jar
            +-- AndroidManifest.xml
            +--res/

    好吧,你有 .jar,而 .aar 文件也有 .jar。
    你有 AndroidManifest.xml,而 .aar 文件也有 AndroidManifest.xml。
    你有 res/,而 .aar 文件也有 res/。
    我想你明白我的意思。你需要一个 .aar 包,而不是一些 gradle 构建系统无法轻松合并和使用的散乱文件。

插件开发人员的实用信息。

如果您是 {N} 插件开发人员,并且希望您的插件得到验证,到目前为止,我们只要求提供示例应用程序,但现在我们还需要 **示例应用程序 + 单元测试** 才能声明您的插件已通过验证。