diff --git a/bin/templates/cordova/lib/builders/GenericBuilder.js b/bin/templates/cordova/lib/builders/GenericBuilder.js index 770911b7..6515533a 100644 --- a/bin/templates/cordova/lib/builders/GenericBuilder.js +++ b/bin/templates/cordova/lib/builders/GenericBuilder.js @@ -93,6 +93,14 @@ GenericBuilder.prototype.extractRealProjectNameFromManifest = function () { module.exports = GenericBuilder; function apkSorter (fileA, fileB) { + // De-prioritize arch specific builds + var archSpecificRE = /-x86|-arm/; + if (archSpecificRE.exec(fileA)) { + return 1; + } else if (archSpecificRE.exec(fileB)) { + return -1; + } + // De-prioritize unsigned builds var unsignedRE = /-unsigned/; if (unsignedRE.exec(fileA)) { @@ -101,7 +109,7 @@ function apkSorter (fileA, fileB) { return -1; } - var timeDiff = fs.statSync(fileA).mtime - fs.statSync(fileB).mtime; + var timeDiff = fs.statSync(fileB).mtime - fs.statSync(fileA).mtime; return timeDiff === 0 ? fileA.length - fileB.length : timeDiff; } @@ -109,7 +117,14 @@ function findOutputApksHelper (dir, build_type, arch) { var shellSilent = shell.config.silent; shell.config.silent = true; - var ret = shell.ls(path.join(dir, build_type, '*.apk')).filter(function (candidate) { + // list directory recursively + var ret = shell.ls('-R', dir).map(function (file) { + // ls does not include base directory + return path.join(dir, file); + }).filter(function (file) { + // find all APKs + return file.match(/\.apk?$/i); + }).filter(function (candidate) { var apkName = path.basename(candidate); // Need to choose between release and debug .apk. if (build_type === 'debug') { diff --git a/bin/templates/project/build.gradle b/bin/templates/project/build.gradle index 76496b7f..b870dc41 100644 --- a/bin/templates/project/build.gradle +++ b/bin/templates/project/build.gradle @@ -184,6 +184,8 @@ android { buildToolsVersion cdvBuildToolsVersion if (Boolean.valueOf(cdvBuildMultipleApks)) { + flavorDimensions "default" + productFlavors { armv7 { versionCode defaultConfig.versionCode*10 + 2