forked from github/cordova-android
CB-7512: Determine SDK and build tools version dynamcally at build time
This commit is contained in:
parent
7ee8117186
commit
c8bbdb23de
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
|
|
||||||
|
ext.cordova = {}
|
||||||
|
apply from: 'cordova.gradle', to: ext.cordova
|
||||||
apply plugin: 'android'
|
apply plugin: 'android'
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
@ -57,8 +59,8 @@ android {
|
|||||||
versionCode Integer.parseInt("" + getVersionCodeFromManifest() + "0")
|
versionCode Integer.parseInt("" + getVersionCodeFromManifest() + "0")
|
||||||
}
|
}
|
||||||
|
|
||||||
compileSdkVersion 19
|
compileSdkVersion cordova.cordovaSdkVersion
|
||||||
buildToolsVersion "19.0.0"
|
buildToolsVersion cordova.cordovaBuildToolsVersion
|
||||||
|
|
||||||
if (multiarch || System.env.BUILD_MULTIPLE_APKS) {
|
if (multiarch || System.env.BUILD_MULTIPLE_APKS) {
|
||||||
productFlavors {
|
productFlavors {
|
||||||
|
147
bin/templates/project/cordova.gradle
Normal file
147
bin/templates/project/cordova.gradle
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int[] getAvailableSdks() {
|
||||||
|
def availableSdks = new ByteArrayOutputStream()
|
||||||
|
exec {
|
||||||
|
commandLine 'android', 'list', 'target', '--compact'
|
||||||
|
standardOutput = availableSdks
|
||||||
|
}
|
||||||
|
availableSdks
|
||||||
|
.toString()
|
||||||
|
.tokenize('\n')
|
||||||
|
.findAll { it ==~ /android-(\d+).*/ }
|
||||||
|
.collect { (it =~ /android-(\d+).*/)[0][1].toInteger() }
|
||||||
|
.sort( { a, b -> b <=> a } )
|
||||||
|
}
|
||||||
|
|
||||||
|
int highestSdkAvailable(int minSdkVersion) {
|
||||||
|
def availableSdks
|
||||||
|
try {
|
||||||
|
availableSdks = getAvailableSdks()
|
||||||
|
} catch (e) {
|
||||||
|
println "An exception occurred while trying to find the Android SDK."
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
if (availableSdks.length > 0) {
|
||||||
|
def highestSdk = availableSdks[0]
|
||||||
|
if (highestSdk < minSdkVersion) {
|
||||||
|
throw new RuntimeException(
|
||||||
|
"No usable Android SDK found. Highest installed version is " +
|
||||||
|
highestSdk + "; minimum version required is " + minSdkVersion + ".")
|
||||||
|
}
|
||||||
|
highestSdk
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException(
|
||||||
|
"No installed SDKs found. Please install the Android SDK version " +
|
||||||
|
minSdkVersion + " or higher.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] getAvailableBuildTools() {
|
||||||
|
def buildToolsDir = new File(getAndroidSdkDir(), "build-tools")
|
||||||
|
buildToolsDir.list()
|
||||||
|
.findAll { it ==~ /[0-9.]+/ }
|
||||||
|
.sort { a, b -> compareVersions(b, a) }
|
||||||
|
}
|
||||||
|
|
||||||
|
String latestBuildToolsAvailable(String minBuildToolsVersion) {
|
||||||
|
def availableBuildToolsVersions
|
||||||
|
try {
|
||||||
|
availableBuildToolsVersions = getAvailableBuildTools()
|
||||||
|
} catch (e) {
|
||||||
|
println "An exception occurred while trying to find the Android build tools."
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
if (availableBuildToolsVersions.length > 0) {
|
||||||
|
def highestBuildToolsVersion = availableBuildToolsVersions[0]
|
||||||
|
if (compareVersions(highestBuildToolsVersion, minBuildToolsVersion) < 0) {
|
||||||
|
throw new RuntimeException(
|
||||||
|
"No usable Android build tools found. Highest installed version is " +
|
||||||
|
highestBuildToolsVersion + "; minimum version required is " +
|
||||||
|
minBuildToolsVersion + ".")
|
||||||
|
}
|
||||||
|
highestBuildToolsVersion
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException(
|
||||||
|
"No installed build tools found. Please install the Android build tools version " +
|
||||||
|
minBuildToolsVersion + " or higher.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the first non-zero result of subtracting version list elements
|
||||||
|
// pairwise. If they are all identical, return the difference in length of
|
||||||
|
// the two lists.
|
||||||
|
int compareVersionList(Collection aParts, Collection bParts) {
|
||||||
|
def pairs = ([aParts, bParts]).transpose()
|
||||||
|
pairs.findResult(aParts.size()-bParts.size()) {it[0] - it[1] != 0 ? it[0] - it[1] : null}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compare two version strings, such as "19.0.0" and "18.1.1.0". If all matched
|
||||||
|
// elements are identical, the longer version is the largest by this method.
|
||||||
|
// Examples:
|
||||||
|
// "19.0.0" > "19"
|
||||||
|
// "19.0.1" > "19.0.0"
|
||||||
|
// "19.1.0" > "19.0.1"
|
||||||
|
// "19" > "18.999.999"
|
||||||
|
int compareVersions(String a, String b) {
|
||||||
|
def aParts = a.tokenize('.').collect {it.toInteger()}
|
||||||
|
def bParts = b.tokenize('.').collect {it.toInteger()}
|
||||||
|
compareVersionList(aParts, bParts)
|
||||||
|
}
|
||||||
|
|
||||||
|
String getAndroidSdkDir() {
|
||||||
|
def rootDir = project.rootDir
|
||||||
|
def localProperties = new File(rootDir, 'local.properties')
|
||||||
|
def androidSdkDir = ""
|
||||||
|
if (localProperties.exists()) {
|
||||||
|
Properties properties = new Properties()
|
||||||
|
localProperties.withInputStream { instr ->
|
||||||
|
properties.load(instr)
|
||||||
|
}
|
||||||
|
def sdkDirProp = properties.getProperty('sdk.dir')
|
||||||
|
if (sdkDirProp != null) {
|
||||||
|
androidSdkDir = sdkDirProp
|
||||||
|
} else {
|
||||||
|
sdkDirProp = properties.getProperty('android.dir')
|
||||||
|
if (sdkDirProp != null) {
|
||||||
|
androidSdkDir = (new File(rootDir, sdkDirProp)).getAbsolutePath()
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException(
|
||||||
|
"No sdk.dir property defined in local.properties file.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String envVar = System.getenv("ANDROID_HOME")
|
||||||
|
if (envVar != null) {
|
||||||
|
androidSdkDir = envVar
|
||||||
|
} else {
|
||||||
|
String property = System.getProperty("android.home")
|
||||||
|
if (property != null) {
|
||||||
|
androidSdkDir = property
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println androidSdkDir
|
||||||
|
androidSdkDir
|
||||||
|
}
|
||||||
|
|
||||||
|
cordovaSdkVersion = highestSdkAvailable(19)
|
||||||
|
cordovaBuildToolsVersion = latestBuildToolsAvailable("19.0.0")
|
||||||
|
|
@ -32,8 +32,8 @@ buildscript {
|
|||||||
apply plugin: 'android-library'
|
apply plugin: 'android-library'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 19
|
compileSdkVersion cordova.cordovaSdkVersion
|
||||||
buildToolsVersion "19.0.0"
|
buildToolsVersion cordova.cordovaBuildToolsVersion
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_7
|
sourceCompatibility JavaVersion.VERSION_1_7
|
||||||
|
Loading…
Reference in New Issue
Block a user