使用 Cordova 构建时定义 Android Gradle 插件版本

Define Android Gradle Plugin Version when Building with Cordova

使用 Cordova 构建我的 Android 项目时,在 Android Studio 中打开时收到以下消息:

我的 build.gradle 文件反映了插件差异(尽管定义的 Gradle 版本是正确的):

dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
    }

我想知道是否有办法配置 Cordova 以显式定义 Android Gradle 插件版本。

Android Gradle 插件版本为 hard-coded into the build.gradle template in cordova-android.

如果您从 master 分支安装平台,您可以看到它使用的版本 (3.2.0) 高于最新的 npm 版本 cordova-android@7.1.4,即 configured for 3.0.1

直接从master分支安装:

cordova platform add https://github.com/apache/cordova-android

如果你想使用最新版本,你可以 fork cordova-android repo,在 build.gradle 模板中固定你想要的版本,然后直接从你的 forked repo 安装插件:

cordova platform add https://github.com/my_github_username/cordova-android

我遇到了一个问题,需要在 platforms/android/build.gradle 文件中指定替代版本的 gradle 插件,而不是默认的 Cordova android 构建生成的版本。因此,为了修复它,我在 after_platform_add 上创建了一个指向 运行 的 Cordova 挂钩脚本,它修改了 gradle 插件版本。

详情

Cordova 9 构建正在生成一个 build.gradle 文件,其中包含以下 gradle 插件版本 3.3.0 依赖项:

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

        classpath 'com.android.tools.build:gradle:3.3.0'
    }
}

但是,我需要插件的 3.3.3 版本。

  1. 在 Cordova config.xml 文件中,我在我的 android 平台部分添加了这个钩子:
    <platform name="android">
        <hook type="after_platform_add" src="hooks/android/modify-android-gradle-plugin-version.js" />
        ...
    </platform>
  1. 然后我添加了这个 modify-android-gradle-plugin-version.js 钩子脚本。 (请原谅我的javascript不完善,我不是js专家。)
const fs = require('fs');
const path = require('path');
const deferral = require('q').defer();
const async = require('async');

module.exports = function(ctx) {
    console.log('Running modify-android-gradle-plugin-version.js...');

    const platformRoot = path.join(ctx.opts.projectRoot, 'platforms/android');
    const gradleFiles = [path.join(platformRoot, 'build.gradle')];
    async.each(gradleFiles, function(f, cb) {
        fs.readFile(f, 'utf8', function(err, data) {
            if (err) {
                cb(err);
                return;
            }
            // regex to replace version 3.3.0 with version 3.3.3
            const result = data.replace(/com\.android\.tools\.build:gradle:3\.3\.0/g, 'com.android.tools.build:gradle:3.3.3');
            fs.writeFile(f, result, 'utf8', cb);
        });
    }, function(err) {
        if (err) {
            deferral.reject();
        } else {
            deferral.resolve();
        }

    });
    return deferral.promise;
}
  1. 我还必须将 async 节点模块添加到我的 cordova 项目 package.json:
  2. devDependencies 部分
  "devDependencies": {
    "async": "3.2.2"
  }