diff --git a/framework/build.gradle b/framework/build.gradle index 38cd42d7..0f192d15 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -26,6 +26,8 @@ buildscript { // Android Gradle Plugin (AGP) Build Tools classpath "com.android.tools.build:gradle:${cordovaConfig.AGP_VERSION}" } + + cdvHelpers.verifyCordovaConfigForBuild() } allprojects { @@ -42,7 +44,7 @@ allprojects { apply plugin: 'com.android.library' android { - compileSdkVersion cordovaConfig.SDK_VERSION + compileSdkVersion cordovaConfig.COMPILE_SDK_VERSION buildToolsVersion cordovaConfig.BUILD_TOOLS_VERSION compileOptions { diff --git a/framework/cdv-gradle-config-defaults.json b/framework/cdv-gradle-config-defaults.json index 749f4e12..41413763 100644 --- a/framework/cdv-gradle-config-defaults.json +++ b/framework/cdv-gradle-config-defaults.json @@ -1,6 +1,7 @@ { "MIN_SDK_VERSION": 22, "SDK_VERSION": 32, + "COMPILE_SDK_VERSION": null, "GRADLE_VERSION": "7.4.2", "MIN_BUILD_TOOLS_VERSION": "32.0.0", "AGP_VERSION": "7.1.0", diff --git a/framework/cordova.gradle b/framework/cordova.gradle index d6d0d699..427cfc23 100644 --- a/framework/cordova.gradle +++ b/framework/cordova.gradle @@ -161,6 +161,9 @@ def doApplyCordovaConfigCustomization() { if (project.hasProperty('cdvSdkVersion')) { cordovaConfig.SDK_VERSION = Integer.parseInt('' + cdvSdkVersion) } + if (project.hasProperty('cdvCompileSdkVersion')) { + cordovaConfig.COMPILE_SDK_VERSION = Integer.parseInt('' + cdvCompileSdkVersion) + } if (project.hasProperty('cdvMaxSdkVersion')) { cordovaConfig.MAX_SDK_VERSION = Integer.parseInt('' + cdvMaxSdkVersion) } @@ -190,6 +193,12 @@ def doApplyCordovaConfigCustomization() { } } +def doVerifyCordovaConfigForBuild() { + if (cordovaConfig.COMPILE_SDK_VERSION < cordovaConfig.SDK_VERSION) { + println "The \"compileSdkVersion\" (${cordovaConfig.COMPILE_SDK_VERSION}) should be greater than or equal to the the \"targetSdkVersion\" (${cordovaConfig.SDK_VERSION})." + } +} + // Properties exported here are visible to all plugins. ext { def defaultsFilePath = './cdv-gradle-config-defaults.json' @@ -210,6 +219,10 @@ ext { def jsonFile = new File(targetConfigFilePath) cordovaConfig = new groovy.json.JsonSlurper().parseText(jsonFile.text) + if (cordovaConfig.COMPILE_SDK_VERSION == null) { + cordovaConfig.COMPILE_SDK_VERSION = cordovaConfig.SDK_VERSION + } + // Apply Gradle Properties doApplyCordovaConfigCustomization() @@ -227,6 +240,8 @@ ext { cdvHelpers.getConfigXml = { doGetConfigXml() } // Returns the value for the desired . Added in 4.1.0. cdvHelpers.getConfigPreference = { name, defaultValue -> doGetConfigPreference(name, defaultValue) } + // Display warnings if any cordova config is not proper for build. + cdvHelpers.verifyCordovaConfigForBuild = { doVerifyCordovaConfigForBuild() } } buildscript { diff --git a/lib/builders/plugin-build.gradle b/lib/builders/plugin-build.gradle index 985f1d6e..56ad8559 100644 --- a/lib/builders/plugin-build.gradle +++ b/lib/builders/plugin-build.gradle @@ -42,7 +42,7 @@ dependencies { } android { - compileSdkVersion cordovaConfig.SDK_VERSION + compileSdkVersion cordovaConfig.COMPILE_SDK_VERSION buildToolsVersion cordovaConfig.BUILD_TOOLS_VERSION compileOptions { diff --git a/lib/check_reqs.js b/lib/check_reqs.js index 6a9f79f5..cc0b07bf 100644 --- a/lib/check_reqs.js +++ b/lib/check_reqs.js @@ -44,6 +44,31 @@ module.exports.get_target = function (projectRoot) { return `android-${Math.max(userTargetSdkVersion, SDK_VERSION)}`; }; +/** + * @param {string} projectRoot + * @returns {string} The android target in format "android-${target}" + */ +module.exports.get_compile = function (projectRoot) { + const userTargetSdkVersion = getUserTargetSdkVersion(projectRoot) || SDK_VERSION; + const userCompileSdkVersion = getUserCompileSdkVersion(projectRoot) || userTargetSdkVersion; + + module.exports.isCompileSdkValid(userCompileSdkVersion, userTargetSdkVersion); + + return userCompileSdkVersion; +}; + +module.exports.isCompileSdkValid = (compileSdk, targetSdk) => { + targetSdk = (targetSdk || SDK_VERSION); + compileSdk = (compileSdk || targetSdk); + const isValid = compileSdk >= targetSdk; + + if (!isValid) { + events.emit('warn', `The "android-compileSdkVersion" (${compileSdk}) should be greater than or equal to the "android-targetSdkVersion" (${targetSdk}).`); + } + + return isValid; +}; + /** * @param {string} projectRoot * @returns {number} target sdk or 0 if undefined @@ -61,6 +86,23 @@ function getUserTargetSdkVersion (projectRoot) { return isNaN(targetSdkVersion) ? 0 : targetSdkVersion; } +/** + * @param {string} projectRoot + * @returns {number} target sdk or 0 if undefined + */ +function getUserCompileSdkVersion (projectRoot) { + // If the repo config.xml file exists, find the desired compileSdkVersion. + // We need to use the cordova project's config.xml here, since the platform + // project's config.xml does not yet have the user's preferences when this + // function is called during `Api.createPlatform`. + const configFile = path.join(projectRoot, '../../config.xml'); + if (!fs.existsSync(configFile)) return 0; + + const configParser = new ConfigParser(configFile); + const compileSdkVersion = parseInt(configParser.getPreference('android-compileSdkVersion', 'android'), 10); + return isNaN(compileSdkVersion) ? 0 : compileSdkVersion; +} + module.exports.get_gradle_wrapper = function () { let androidStudioPath; let i = 0; diff --git a/lib/create.js b/lib/create.js index d1445bd5..6ee2387c 100755 --- a/lib/create.js +++ b/lib/create.js @@ -208,6 +208,7 @@ exports.create = function (project_path, config, options, events) { const safe_activity_name = config.android_activityName() || options.activityName || 'MainActivity'; const target_api = check_reqs.get_target(project_path); + const compile_api = check_reqs.get_compile(project_path); // Make the package conform to Java package types return exports.validatePackageName(package_name) @@ -220,7 +221,8 @@ exports.create = function (project_path, config, options, events) { events.emit('log', '\tPackage: ' + package_name); events.emit('log', '\tName: ' + project_name); events.emit('log', '\tActivity: ' + safe_activity_name); - events.emit('log', '\tAndroid target: ' + target_api); + events.emit('log', '\tAndroid Target SDK: ' + target_api); + events.emit('log', '\tAndroid Compile SDK: ' + compile_api); events.emit('verbose', 'Copying android template project to ' + project_path); diff --git a/lib/prepare.js b/lib/prepare.js index b0d2e6cd..365b4692 100644 --- a/lib/prepare.js +++ b/lib/prepare.js @@ -82,6 +82,14 @@ function updateUserProjectGradleConfig (project) { ...getUserGradleConfig(project._config) }; + // Check if compile sdk is valid. + // The returned result is iggnored and since we do not need and will not throw an error. + // Only using the valid check call for display the warning when target is greater then compiled. + checkReqs.isCompileSdkValid( + projectGradleConfig.COMPILE_SDK_VERSION, + projectGradleConfig.SDK_VERSION + ); + // Write out changes const projectGradleConfigPath = path.join(project.root, 'cdv-gradle-config.json'); fs.writeJSONSync(projectGradleConfigPath, projectGradleConfig, { spaces: 2 }); @@ -92,6 +100,7 @@ function getUserGradleConfig (configXml) { { xmlKey: 'android-minSdkVersion', gradleKey: 'MIN_SDK_VERSION', type: Number }, { xmlKey: 'android-maxSdkVersion', gradleKey: 'MAX_SDK_VERSION', type: Number }, { xmlKey: 'android-targetSdkVersion', gradleKey: 'SDK_VERSION', type: Number }, + { xmlKey: 'android-compileSdkVersion', gradleKey: 'COMPILE_SDK_VERSION', type: Number }, { xmlKey: 'android-buildToolsVersion', gradleKey: 'BUILD_TOOLS_VERSION', type: String }, { xmlKey: 'GradleVersion', gradleKey: 'GRADLE_VERSION', type: String }, { xmlKey: 'AndroidGradlePluginVersion', gradleKey: 'AGP_VERSION', type: String }, diff --git a/templates/project/app/build.gradle b/templates/project/app/build.gradle index 08959e08..cc47c1c5 100644 --- a/templates/project/app/build.gradle +++ b/templates/project/app/build.gradle @@ -188,7 +188,7 @@ android { maxSdkVersion cordovaConfig.MAX_SDK_VERSION } targetSdkVersion cordovaConfig.SDK_VERSION - compileSdkVersion cordovaConfig.SDK_VERSION + compileSdkVersion cordovaConfig.COMPILE_SDK_VERSION } lintOptions { diff --git a/templates/project/build.gradle b/templates/project/build.gradle index 949bc3fa..1e4eec73 100644 --- a/templates/project/build.gradle +++ b/templates/project/build.gradle @@ -27,6 +27,8 @@ buildscript { // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } + + cdvHelpers.verifyCordovaConfigForBuild() } allprojects { diff --git a/test/androidx/app/build.gradle b/test/androidx/app/build.gradle index 747cecb1..c1eff500 100644 --- a/test/androidx/app/build.gradle +++ b/test/androidx/app/build.gradle @@ -21,7 +21,7 @@ apply plugin: 'com.android.application' apply from: '../../../framework/cordova.gradle' android { - compileSdkVersion cordovaConfig.SDK_VERSION + compileSdkVersion cordovaConfig.COMPILE_SDK_VERSION buildToolsVersion cordovaConfig.BUILD_TOOLS_VERSION defaultConfig {