aboutsummaryrefslogtreecommitdiffstats
path: root/share/qbs/modules/Android/sdk
diff options
context:
space:
mode:
Diffstat (limited to 'share/qbs/modules/Android/sdk')
-rw-r--r--share/qbs/modules/Android/sdk/sdk.qbs65
-rw-r--r--share/qbs/modules/Android/sdk/utils.js69
2 files changed, 28 insertions, 106 deletions
diff --git a/share/qbs/modules/Android/sdk/sdk.qbs b/share/qbs/modules/Android/sdk/sdk.qbs
index f0e727caf..cae5fc2e5 100644
--- a/share/qbs/modules/Android/sdk/sdk.qbs
+++ b/share/qbs/modules/Android/sdk/sdk.qbs
@@ -178,20 +178,18 @@ Module {
property path compiledResourcesDir: FileInfo.joinPaths(product.buildDirectory,
"compiled_resources")
property string packageContentsDir: FileInfo.joinPaths(product.buildDirectory, packageType)
- property string debugKeyStorePath: FileInfo.joinPaths(
- Environment.getEnv(qbs.hostOS.contains("windows")
- ? "USERPROFILE" : "HOME"),
- ".android", "debug.keystore")
- property bool useApksigner: buildToolsVersion && Utilities.versionCompare(
- buildToolsVersion, "24.0.3") >= 0
property stringList aidlSearchPaths
Depends { name: "java"; condition: _enableRules }
+ Depends { name: "codesign"; condition: _enableRules }
Properties {
condition: _enableRules
java.languageVersion: platformJavaVersion
java.runtimeVersion: platformJavaVersion
java.bootClassPaths: androidJarFilePath
+ codesign.apksignerFilePath: Android.sdk.apksignerFilePath
+ codesign._packageName: Android.sdk.apkBaseName + (_generateAab ? ".aab" : ".apk")
+ codesign.useApksigner: !_generateAab
}
validate: {
@@ -211,6 +209,11 @@ Module {
+ "Android bundletool can be downloaded from "
+ "https://github.com/google/bundletool");
}
+ if (Utilities.versionCompare(buildToolsVersion, "24.0.3") < 0) {
+ throw ModUtils.ModuleError("Version of Android SDK build tools too old. This version "
+ + "is " + buildToolsVersion + " and minimum version is "
+ + "24.0.3. Please update the Android SDK.")
+ }
}
FileTagger {
@@ -223,36 +226,6 @@ Module {
fileTags: ["android.aidl"]
}
- FileTagger {
- patterns: ["*.keystore"]
- fileTags: ["android.keystore"]
- }
-
- // Typically there is a debug keystore in ~/.android/debug.keystore which gets created
- // by the native build tools the first time a build is done. However, we don't want to create it
- // ourselves, because writing to a location outside the qbs build directory is both polluting
- // and has the potential for race conditions. So we'll instruct the user what to do.
- Group {
- name: "Android debug keystore"
- files: {
- if (!File.exists(Android.sdk.debugKeyStorePath)) {
- throw ModUtils.ModuleError("Could not find an Android debug keystore at " +
- Android.sdk.debugKeyStorePath + ". " +
- "If you are developing for Android on this machine for the first time and " +
- "have never built an application using the native Gradle / Android Studio " +
- "tooling, this is normal. You must create the debug keystore now using the " +
- "following command, in order to continue:\n\n" +
- SdkUtils.createDebugKeyStoreCommandString(java.keytoolFilePath,
- Android.sdk.debugKeyStorePath) +
- "\n\n" +
- "See the following URL for more information: " +
- "https://developer.android.com/studio/publish/app-signing.html#debug-mode");
- }
- return [Android.sdk.debugKeyStorePath];
- }
- fileTags: ["android.keystore"]
- }
-
Parameter {
property bool embedJar: true
}
@@ -273,7 +246,7 @@ Module {
for (var i = 0; i < (aidlSearchPaths ? aidlSearchPaths.length : 0); ++i)
args.push("-I" + aidlSearchPaths[i]);
args.push(input.filePath, output.filePath);
- cmd = new Command(aidl, args);
+ var cmd = new Command(aidl, args);
cmd.description = "Processing " + input.fileName;
return [cmd];
}
@@ -498,7 +471,7 @@ Module {
outputArtifacts: {
var deploymentData = SdkUtils.stlDeploymentData(product, inputs, "stl");
var outputs = [];
- for (i = 0; i < deploymentData.outputFilePaths.length; ++i) {
+ for (var i = 0; i < deploymentData.outputFilePaths.length; ++i) {
outputs.push({filePath: deploymentData.outputFilePaths[i],
fileTags: "android.stl_deployed"});
}
@@ -525,11 +498,11 @@ Module {
inputs: [
"android.resources", "android.assets", "android.manifest_final",
"android.dex", "android.stl_deployed",
- "android.nativelibrary_deployed", "android.keystore"
+ "android.nativelibrary_deployed"
]
Artifact {
- filePath: product.Android.sdk.apkBaseName + ".apk"
- fileTags: "android.package"
+ filePath: product.Android.sdk.apkBaseName + ".apk_unsigned"
+ fileTags: "android.package_unsigned"
}
prepare: SdkUtils.prepareAaptPackage.apply(SdkUtils, arguments)
}
@@ -540,11 +513,11 @@ Module {
inputs: [
"android.apk_resources", "android.manifest_final",
"android.dex", "android.stl_deployed",
- "android.nativelibrary_deployed", "android.keystore"
+ "android.nativelibrary_deployed"
]
Artifact {
- filePath: product.Android.sdk.apkBaseName + ".apk"
- fileTags: "android.package"
+ filePath: product.Android.sdk.apkBaseName + ".apk_unsigned"
+ fileTags: "android.package_unsigned"
}
prepare: SdkUtils.prepareApkPackage.apply(SdkUtils, arguments)
}
@@ -558,8 +531,8 @@ Module {
"android.nativelibrary_deployed"
]
Artifact {
- filePath: product.Android.sdk.apkBaseName + ".aab"
- fileTags: "android.package"
+ filePath: product.Android.sdk.apkBaseName + ".aab_unsigned"
+ fileTags: "android.package_unsigned"
}
prepare: SdkUtils.prepareBundletoolPackage.apply(SdkUtils, arguments)
}
diff --git a/share/qbs/modules/Android/sdk/utils.js b/share/qbs/modules/Android/sdk/utils.js
index 63bf1f5c4..264ad2da7 100644
--- a/share/qbs/modules/Android/sdk/utils.js
+++ b/share/qbs/modules/Android/sdk/utils.js
@@ -30,9 +30,11 @@
var File = require("qbs.File");
var FileInfo = require("qbs.FileInfo");
+var ModUtils = require("qbs.ModUtils");
var Process = require("qbs.Process");
var TextFile = require("qbs.TextFile");
var Utilities = require("qbs.Utilities");
+var Xml = require("qbs.Xml");
function availableBuildToolsVersions(sdkDir) {
var re = /^([0-9]+)\.([0-9]+)\.([0-9]+)$/;
@@ -172,7 +174,8 @@ function prepareAapt2CompileResource(project, product, inputs, outputs, input, o
throw "Cannot create directory '" + FileInfo.toNativeSeparators(compilesResourcesDir) +
"'.";
}
- var args = ["compile", input.filePath, "-o", compilesResourcesDir];
+ var args = ["compile", FileInfo.toNativeSeparators(input.filePath),
+ "-o", FileInfo.toNativeSeparators(compilesResourcesDir)];
var cmd = new Command(product.Android.sdk.aaptFilePath, args);
var outputFileName = generateAapt2ResourceFileName(input.filePath);
cmd.description = "compiling resource " + input.fileName + " into " + outputFileName;
@@ -240,7 +243,7 @@ function prepareAaptGenerate(project, product, inputs, outputs, input, output,
function prepareAaptPackage(project, product, inputs, outputs, input, output, explicitlyDependsOn) {
var cmds = [];
- var apkOutput = outputs["android.package"][0];
+ var apkOutput = outputs["android.package_unsigned"][0];
var args = commonAaptPackageArgs.apply(this, arguments);
args.push("-F", apkOutput.filePath + ".unaligned");
args.push(product.Android.sdk.packageContentsDir);
@@ -248,17 +251,6 @@ function prepareAaptPackage(project, product, inputs, outputs, input, output, ex
cmd.description = "generating " + apkOutput.fileName;
cmds.push(cmd);
- if (!product.Android.sdk.useApksigner) {
- args = ["-sigalg", "SHA1withRSA", "-digestalg", "SHA1",
- "-keystore", inputs["android.keystore"][0].filePath,
- "-storepass", "android",
- apkOutput.filePath + ".unaligned",
- "androiddebugkey"];
- cmd = new Command(product.java.jarsignerFilePath, args);
- cmd.description = "signing " + apkOutput.fileName;
- cmds.push(cmd);
- }
-
cmd = new Command(product.Android.sdk.zipalignFilePath,
["-f", "4", apkOutput.filePath + ".unaligned", apkOutput.filePath]);
cmd.silent = true;
@@ -269,26 +261,14 @@ function prepareAaptPackage(project, product, inputs, outputs, input, output, ex
cmd.unalignedApk = apkOutput.filePath + ".unaligned";
cmd.sourceCode = function() { File.remove(unalignedApk); };
cmds.push(cmd);
-
- if (product.Android.sdk.useApksigner) {
- // TODO: Implement full signing support, not just using the debug keystore
- args = ["sign",
- "--ks", inputs["android.keystore"][0].filePath,
- "--ks-pass", "pass:android",
- apkOutput.filePath];
- cmd = new Command(product.Android.sdk.apksignerFilePath, args);
- cmd.description = "signing " + apkOutput.fileName;
- cmds.push(cmd);
- }
-
return cmds;
}
function prepareApkPackage(project, product, inputs, outputs, input, output, explicitlyDependsOn) {
var cmds = [];
var apkInputFilePath = inputs["android.apk_resources"][0].filePath;
- var apkOutput = outputs["android.package"][0];
- var apkOutputFilePathUnaligned = outputs["android.package"][0].filePath + ".unaligned";
+ var apkOutput = outputs["android.package_unsigned"][0];
+ var apkOutputFilePathUnaligned = apkOutput.filePath + ".unaligned";
var dexFilePath = inputs["android.dex"][0].filePath;
var copyCmd = new JavaScriptCommand();
@@ -307,17 +287,6 @@ function prepareApkPackage(project, product, inputs, outputs, input, output, exp
jarCmd.workingDirectory = libPath;
cmds.push(jarCmd);
- if (!product.Android.sdk.useApksigner) {
- args = ["-sigalg", "SHA1withRSA", "-digestalg", "SHA1",
- "-keystore", inputs["android.keystore"][0].filePath,
- "-storepass", "android",
- apkOutputFilePathUnaligned,
- "androiddebugkey"];
- cmd = new Command(product.java.jarsignerFilePath, args);
- cmd.description = "signing " + apkOutput.fileName;
- cmds.push(cmd);
- }
-
cmd = new Command(product.Android.sdk.zipalignFilePath,
["-f", "4", apkOutputFilePathUnaligned, apkOutput.filePath]);
cmd.silent = true;
@@ -328,18 +297,6 @@ function prepareApkPackage(project, product, inputs, outputs, input, output, exp
cmd.unalignedApk = apkOutputFilePathUnaligned;
cmd.sourceCode = function() { File.remove(unalignedApk); };
cmds.push(cmd);
-
- if (product.Android.sdk.useApksigner) {
- // TODO: Implement full signing support, not just using the debug keystore
- args = ["sign",
- "--ks", inputs["android.keystore"][0].filePath,
- "--ks-pass", "pass:android",
- apkOutput.filePath];
- cmd = new Command(product.Android.sdk.apksignerFilePath, args);
- cmd.description = "signing " + apkOutput.fileName;
- cmds.push(cmd);
- }
-
return cmds;
}
@@ -375,7 +332,7 @@ function prepareBundletoolPackage(project, product, inputs, outputs, input, outp
jarBaseCmd.workingDirectory = baseModuleDir;
cmds.push(jarBaseCmd);
- var aabFilePath = outputs["android.package"][0].filePath;
+ var aabFilePath = outputs["android.package_unsigned"][0].filePath;
var removeCmd = new JavaScriptCommand();
removeCmd.description = "removing previous aab";
removeCmd.filePath = aabFilePath;
@@ -389,20 +346,12 @@ function prepareBundletoolPackage(project, product, inputs, outputs, input, outp
args.push("--modules=" + baseFilePath);
args.push("--output=" + aabFilePath);
var cmd = new Command(product.java.interpreterFilePath, args);
- cmd.description = "generating " + outputs["android.package"][0].fileName;
+ cmd.description = "generating " + aabFilePath.fileName;
cmds.push(cmd);
return cmds;
}
-function createDebugKeyStoreCommandString(keytoolFilePath, keystoreFilePath) {
- var args = ["-genkey", "-keystore", keystoreFilePath, "-alias", "androiddebugkey",
- "-storepass", "android", "-keypass", "android", "-keyalg", "RSA",
- "-keysize", "2048", "-validity", "10000", "-dname",
- "CN=Android Debug,O=Android,C=US"];
- return Process.shellQuote(keytoolFilePath, args);
-}
-
function stlDeploymentData(product, inputs, type)
{
var data = { uniqueInputs: [], outputFilePaths: []};