From 4ce8d0865604ffea37d41589107de26e03725804 Mon Sep 17 00:00:00 2001 From: Norman Breau Date: Fri, 20 Oct 2023 21:46:35 -0300 Subject: [PATCH] feat!: API 34 Support API 34: Upgrade AGP from 8.2.0-rc01 to 8.2.0-rc02 API 34: Upgrade AGP from 8.2.0-rc02 to 8.2.0-rc03 --- framework/build.gradle | 4 +-- framework/cdv-gradle-config-defaults.json | 8 ++--- lib/builders/ProjectBuilder.js | 40 +++++++++-------------- lib/create.js | 17 +++------- spec/unit/builders/ProjectBuilder.spec.js | 23 ++++++++----- templates/project/app/build.gradle | 8 +++-- templates/project/wrapper.gradle | 1 - test/androidx/wrapper.gradle | 22 ------------- test/run_java_unit_tests.js | 12 ++++++- 9 files changed, 57 insertions(+), 78 deletions(-) delete mode 100644 templates/project/wrapper.gradle delete mode 100644 test/androidx/wrapper.gradle diff --git a/framework/build.gradle b/framework/build.gradle index d1f1d4fe4f..ec51594c80 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -50,8 +50,8 @@ android { buildToolsVersion cordovaConfig.BUILD_TOOLS_VERSION compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } // For the Android Cordova Lib, we allow changing the minSdkVersion, but it is at the users own risk diff --git a/framework/cdv-gradle-config-defaults.json b/framework/cdv-gradle-config-defaults.json index cbe67fc8ab..55bcfbd775 100644 --- a/framework/cdv-gradle-config-defaults.json +++ b/framework/cdv-gradle-config-defaults.json @@ -1,10 +1,10 @@ { "MIN_SDK_VERSION": 24, - "SDK_VERSION": 33, + "SDK_VERSION": 34, "COMPILE_SDK_VERSION": null, - "GRADLE_VERSION": "8.0", - "MIN_BUILD_TOOLS_VERSION": "33.0.2", - "AGP_VERSION": "8.0.0", + "GRADLE_VERSION": "8.4", + "MIN_BUILD_TOOLS_VERSION": "34.0.0", + "AGP_VERSION": "8.2.0-rc03", "KOTLIN_VERSION": "1.7.21", "ANDROIDX_APP_COMPAT_VERSION": "1.6.1", "ANDROIDX_WEBKIT_VERSION": "1.6.0", diff --git a/lib/builders/ProjectBuilder.js b/lib/builders/ProjectBuilder.js index 815d08f395..95af3a8f9e 100644 --- a/lib/builders/ProjectBuilder.js +++ b/lib/builders/ProjectBuilder.js @@ -85,9 +85,7 @@ class ProjectBuilder { } getArgs (cmd, opts) { - let args = [ - '-b', path.join(this.root, 'build.gradle') - ]; + let args = []; if (opts.extraArgs) { args = args.concat(opts.extraArgs); } @@ -116,16 +114,17 @@ class ProjectBuilder { return args; } - /* - * This returns a promise - */ - runGradleWrapper (gradle_cmd) { - const gradlePath = path.join(this.root, 'gradlew'); - const wrapperGradle = path.join(this.root, 'wrapper.gradle'); - if (fs.existsSync(gradlePath)) { - // Literally do nothing, for some reason this works, while !fs.existsSync didn't on Windows + /** + * Installs/updates the gradle wrapper + * @param {string} gradleVersion The gradle version to install. Ignored if CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL environment variable is defined + * @returns {Promise} + */ + async installGradleWrapper (gradleVersion) { + if (process.env.CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL) { + events.emit('verbose', `Overriding Gradle Version via CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL (${process.env.CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL})`); + await execa('gradle', ['-p', this.root, 'wrapper', '--gradle-distribution-url', process.env.CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL], { stdio: 'inherit' }); } else { - return execa(gradle_cmd, ['-p', this.root, 'wrapper', '-b', wrapperGradle], { stdio: 'inherit' }); + await execa('gradle', ['-p', this.root, 'wrapper', '--gradle-version', gradleVersion], { stdio: 'inherit' }); } } @@ -275,23 +274,14 @@ class ProjectBuilder { prepEnv (opts) { const self = this; + const config = this._getCordovaConfig(); return check_reqs.check_gradle() - .then(function (gradlePath) { - return self.runGradleWrapper(gradlePath); + .then(function () { + events.emit('verbose', `Using Gradle: ${config.GRADLE_VERSION}`); + return self.installGradleWrapper(config.GRADLE_VERSION); }).then(function () { return self.prepBuildFiles(); }).then(() => { - const config = this._getCordovaConfig(); - // update/set the distributionUrl in the gradle-wrapper.properties - const gradleWrapperPropertiesPath = path.join(self.root, 'gradle/wrapper/gradle-wrapper.properties'); - const gradleWrapperProperties = createEditor(gradleWrapperPropertiesPath); - const distributionUrl = process.env.CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL || `https://services.gradle.org/distributions/gradle-${config.GRADLE_VERSION}-all.zip`; - gradleWrapperProperties.set('distributionUrl', distributionUrl); - gradleWrapperProperties.save(); - - events.emit('verbose', `Gradle Distribution URL: ${distributionUrl}`); - }) - .then(() => { const signingPropertiesPath = path.join(self.root, `${opts.buildType}${SIGNING_PROPERTIES}`); if (fs.existsSync(signingPropertiesPath)) fs.removeSync(signingPropertiesPath); diff --git a/lib/create.js b/lib/create.js index 7f5d601345..ae446ada3b 100755 --- a/lib/create.js +++ b/lib/create.js @@ -113,20 +113,13 @@ function prepBuildFiles (projectPath) { buildModule.getBuilder(projectPath).prepBuildFiles(); } -function copyBuildRules (projectPath, isLegacy) { +function copyBuildRules (projectPath) { const srcDir = path.join(ROOT, 'templates', 'project'); - if (isLegacy) { - // The project's build.gradle is identical to the earlier build.gradle, so it should still work - fs.copySync(path.join(srcDir, 'legacy', 'build.gradle'), path.join(projectPath, 'legacy', 'build.gradle')); - fs.copySync(path.join(srcDir, 'wrapper.gradle'), path.join(projectPath, 'wrapper.gradle')); - } else { - fs.copySync(path.join(srcDir, 'build.gradle'), path.join(projectPath, 'build.gradle')); - fs.copySync(path.join(srcDir, 'app', 'build.gradle'), path.join(projectPath, 'app', 'build.gradle')); - fs.copySync(path.join(srcDir, 'app', 'repositories.gradle'), path.join(projectPath, 'app', 'repositories.gradle')); - fs.copySync(path.join(srcDir, 'repositories.gradle'), path.join(projectPath, 'repositories.gradle')); - fs.copySync(path.join(srcDir, 'wrapper.gradle'), path.join(projectPath, 'wrapper.gradle')); - } + fs.copySync(path.join(srcDir, 'build.gradle'), path.join(projectPath, 'build.gradle')); + fs.copySync(path.join(srcDir, 'app', 'build.gradle'), path.join(projectPath, 'app', 'build.gradle')); + fs.copySync(path.join(srcDir, 'app', 'repositories.gradle'), path.join(projectPath, 'app', 'repositories.gradle')); + fs.copySync(path.join(srcDir, 'repositories.gradle'), path.join(projectPath, 'repositories.gradle')); } function copyScripts (projectPath) { diff --git a/spec/unit/builders/ProjectBuilder.spec.js b/spec/unit/builders/ProjectBuilder.spec.js index f2cb633a94..b8190518dc 100644 --- a/spec/unit/builders/ProjectBuilder.spec.js +++ b/spec/unit/builders/ProjectBuilder.spec.js @@ -128,19 +128,24 @@ describe('ProjectBuilder', () => { }); }); - describe('runGradleWrapper', () => { - it('should run the provided gradle command if a gradle wrapper does not already exist', () => { - spyOn(fs, 'existsSync').and.returnValue(false); - builder.runGradleWrapper('/my/sweet/gradle'); - expect(execaSpy).toHaveBeenCalledWith('/my/sweet/gradle', jasmine.any(Array), jasmine.any(Object)); + describe('installGradleWrapper', () => { + beforeEach(() => { + execaSpy.and.resolveTo(); }); - it('should do nothing if a gradle wrapper exists in the project directory', () => { - spyOn(fs, 'existsSync').and.returnValue(true); - builder.runGradleWrapper('/my/sweet/gradle'); - expect(execaSpy).not.toHaveBeenCalledWith('/my/sweet/gradle', jasmine.any(Array), jasmine.any(Object)); + it('should run gradle wrapper 8.3', async () => { + await builder.installGradleWrapper('8.3'); + expect(execaSpy).toHaveBeenCalledWith('gradle', ['-p', '/root', 'wrapper', '--gradle-version', '8.3'], jasmine.any(Object)); + }); + + it('CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL should override gradle version', async () => { + process.env.CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL = 'https://dist.local'; + await builder.installGradleWrapper('8.3'); + delete process.env.CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL; + expect(execaSpy).toHaveBeenCalledWith('gradle', ['-p', '/root', 'wrapper', '--gradle-distribution-url', 'https://dist.local'], jasmine.any(Object)); }); }); + describe('build', () => { beforeEach(() => { spyOn(builder, 'getArgs'); diff --git a/templates/project/app/build.gradle b/templates/project/app/build.gradle index ed155ec3e6..19ab87c3fa 100644 --- a/templates/project/app/build.gradle +++ b/templates/project/app/build.gradle @@ -181,6 +181,10 @@ task cdvPrintProps { android { namespace cordovaConfig.PACKAGE_NAMESPACE + buildFeatures { + buildConfig true + } + defaultConfig { versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode")) applicationId cordovaConfig.PACKAGE_NAMESPACE @@ -248,8 +252,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } if (cdvReleaseSigningPropertiesFile) { diff --git a/templates/project/wrapper.gradle b/templates/project/wrapper.gradle deleted file mode 100644 index d7ebabd72a..0000000000 --- a/templates/project/wrapper.gradle +++ /dev/null @@ -1 +0,0 @@ -//This file is intentionally just a comment diff --git a/test/androidx/wrapper.gradle b/test/androidx/wrapper.gradle deleted file mode 100644 index 6cef6051ee..0000000000 --- a/test/androidx/wrapper.gradle +++ /dev/null @@ -1,22 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -wrapper { - apply from: '../../framework/cordova.gradle' - gradleVersion = cordovaConfig.GRADLE_VERSION -} diff --git a/test/run_java_unit_tests.js b/test/run_java_unit_tests.js index ba41e3a2f2..2d8ee23578 100644 --- a/test/run_java_unit_tests.js +++ b/test/run_java_unit_tests.js @@ -42,8 +42,18 @@ class AndroidTestRunner { ); } + _getGradleVersion () { + const config = JSON.parse( + fs.readFileSync(path.resolve(this.projectDir, '../../framework/cdv-gradle-config-defaults.json'), { + encoding: 'utf-8' + }) + ); + + return config.GRADLE_VERSION; + } + _createProjectBuilder () { - return new ProjectBuilder(this.projectDir).runGradleWrapper('gradle'); + return new ProjectBuilder(this.projectDir).installGradleWrapper(this._getGradleVersion()); } run () {