Revert "Revert "Replace jarsigner with apksigner" (#8164)" (#8320)
This reverts commit 70d7fe3a0dede9f3556fda8fe018dc4ed4a08490.
The Java version missmatch on the bots has been resolved.
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index d590d65..7c00697 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -24,6 +24,7 @@
// $ANDROID_HOME/build-tools/22.0.1/aapt
// $ANDROID_HOME/build-tools/23.0.2/aapt
// $ANDROID_HOME/build-tools/24.0.0-preview/aapt
+// $ANDROID_HOME/build-tools/25.0.2/apksigner
// $ANDROID_HOME/platforms/android-22/android.jar
// $ANDROID_HOME/platforms/android-23/android.jar
@@ -225,6 +226,8 @@
String get zipalignPath => getBuildToolsPath('zipalign');
+ String get apksignerPath => getBuildToolsPath('apksigner');
+
List<String> validateSdkWellFormed() {
if (_exists(androidJarPath) != null)
return <String>[_exists(androidJarPath)];
@@ -238,6 +241,9 @@
if (_canRun(zipalignPath) != null)
return <String>[_canRun(zipalignPath)];
+ if (_canRun(apksignerPath) != null)
+ return <String>[_canRun(apksignerPath) + '\napksigner requires Android SDK Build Tools 24.0.3 or newer.'];
+
return <String>[];
}
diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart
index 0999d61..a81cdad 100644
--- a/packages/flutter_tools/lib/src/android/android_workflow.dart
+++ b/packages/flutter_tools/lib/src/android/android_workflow.dart
@@ -5,7 +5,6 @@
import 'dart:async';
import '../base/io.dart';
-import '../base/os.dart';
import '../base/platform.dart';
import '../base/process_manager.dart';
import '../doctor.dart';
@@ -63,11 +62,11 @@
}
List<String> validationResult = androidSdk.validateSdkWellFormed();
- // Empty result means SDK is well formed.
if (validationResult.isEmpty) {
+ // Empty result means SDK is well formed.
+ // The SDK also requires a valid Java JDK installation.
const String _kJdkDownload = 'https://www.oracle.com/technetwork/java/javase/downloads/';
-
String javaVersion;
try {
@@ -82,27 +81,20 @@
} catch (error) {
}
- if (javaVersion != null) {
- messages.add(new ValidationMessage(javaVersion));
-
- if (os.which('jarsigner') == null) {
- messages.add(new ValidationMessage.error(
- 'The jarsigner utility was not found; this is used to build Android APKs. You may need to install\n'
- 'or re-install the Java JDK: $_kJdkDownload.'
- ));
- } else {
- type = ValidationType.installed;
- }
- } else {
+ if (javaVersion == null) {
messages.add(new ValidationMessage.error(
- 'No Java Development Kit (JDK) found; you can download the JDK from $_kJdkDownload.'
+ 'No Java Development Kit (JDK) found; you can download the JDK from $_kJdkDownload.'
));
+ } else {
+ type = ValidationType.installed;
}
} else {
messages.addAll(validationResult.map((String message) {
return new ValidationMessage.error(message);
}));
- messages.add(new ValidationMessage('Try re-installing or updating your Android SDK.'));
+ messages.add(new ValidationMessage(
+ 'Try re-installing or updating your Android SDK,\n'
+ 'visit https://flutter.io/setup/#android-setup for detailed instructions.'));
}
}
diff --git a/packages/flutter_tools/lib/src/commands/build_apk.dart b/packages/flutter_tools/lib/src/commands/build_apk.dart
index f87592e..2f4ada2 100644
--- a/packages/flutter_tools/lib/src/commands/build_apk.dart
+++ b/packages/flutter_tools/lib/src/commands/build_apk.dart
@@ -11,7 +11,6 @@
import '../base/common.dart';
import '../base/file_system.dart';
import '../base/logger.dart';
-import '../base/os.dart';
import '../base/process.dart';
import '../base/process_manager.dart';
import '../base/utils.dart';
@@ -70,14 +69,14 @@
File _aapt;
File _dx;
File _zipalign;
- File _jarsigner;
+ File _apksigner;
_ApkBuilder(this.sdk) {
_androidJar = fs.file(sdk.androidJarPath);
_aapt = fs.file(sdk.aaptPath);
_dx = fs.file(sdk.dxPath);
_zipalign = fs.file(sdk.zipalignPath);
- _jarsigner = os.which('jarsigner');
+ _apksigner = fs.file(sdk.apksignerPath);
}
String checkDependencies() {
@@ -89,10 +88,8 @@
return 'Cannot find dx at ${_dx.path}';
if (!processManager.canRun(_zipalign.path))
return 'Cannot find zipalign at ${_zipalign.path}';
- if (_jarsigner == null)
- return 'Cannot find jarsigner in PATH.';
- if (!_jarsigner.existsSync())
- return 'Cannot find jarsigner at ${_jarsigner.path}';
+ if (!processManager.canRun(_apksigner.path))
+ return 'Cannot find apksigner at ${_apksigner.path}';
return null;
}
@@ -125,15 +122,13 @@
}
void sign(File keystore, String keystorePassword, String keyAlias, String keyPassword, File outputApk) {
- assert(_jarsigner != null);
- runCheckedSync(<String>[_jarsigner.path,
- '-keystore', keystore.path,
- '-storepass', keystorePassword,
- '-keypass', keyPassword,
- '-digestalg', 'SHA1',
- '-sigalg', 'MD5withRSA',
+ assert(_apksigner != null);
+ runCheckedSync(<String>[_apksigner.path, 'sign',
+ '--ks', keystore.path,
+ '--ks-key-alias', keyAlias,
+ '--ks-pass', 'pass:$keystorePassword',
+ '--key-pass', 'pass:$keyPassword',
outputApk.path,
- keyAlias,
]);
}
@@ -357,15 +352,14 @@
unalignedApk, components.manifest, assetBuilder.directory,
artifactBuilder.directory, components.resources, buildMode
);
-
- int signResult = _signApk(builder, components, unalignedApk, keystore, buildMode);
- if (signResult != 0)
- return signResult;
-
File finalApk = fs.file(outputFile);
ensureDirectoryExists(finalApk.path);
builder.align(unalignedApk, finalApk);
+ int signResult = _signApk(builder, components, finalApk, keystore, buildMode);
+ if (signResult != 0)
+ return signResult;
+
printTrace('calculateSha: $outputFile');
File apkShaFile = fs.file('$outputFile.sha1');
apkShaFile.writeAsStringSync(calculateSha(finalApk));