mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
127 lines
3.6 KiB
Dart
127 lines
3.6 KiB
Dart
// Copyright 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'dart:io';
|
|
|
|
import 'package:args/args.dart';
|
|
|
|
const String kBuildToolsVersion = '22.0.1';
|
|
const String kAndroidPlatformVersion = '22';
|
|
|
|
const String kKeystoreKeyName = "chromiumdebugkey";
|
|
const String kKeystorePassword = "chromium";
|
|
|
|
class AssetBuilder {
|
|
final Directory outDir;
|
|
|
|
Directory _assetDir;
|
|
|
|
AssetBuilder(this.outDir) {
|
|
_assetDir = new Directory('${outDir.path}/assets');
|
|
_assetDir.createSync(recursive: true);
|
|
}
|
|
|
|
void add(File asset, String assetName) {
|
|
asset.copySync('${_assetDir.path}/$assetName');
|
|
}
|
|
|
|
Directory get directory => _assetDir;
|
|
}
|
|
|
|
class ApkBuilder {
|
|
final String androidSDK;
|
|
|
|
File _androidJar;
|
|
File _aapt;
|
|
File _zipalign;
|
|
String _jarsigner;
|
|
|
|
ApkBuilder(this.androidSDK) {
|
|
_androidJar = new File('$androidSDK/platforms/android-$kAndroidPlatformVersion/android.jar');
|
|
|
|
String buildTools = '$androidSDK/build-tools/$kBuildToolsVersion';
|
|
_aapt = new File('$buildTools/aapt');
|
|
_zipalign = new File('$buildTools/zipalign');
|
|
_jarsigner = 'jarsigner';
|
|
}
|
|
|
|
void package(File androidManifest, Directory assets, File outputApk) {
|
|
_run(_aapt.path, [
|
|
'package',
|
|
'-M', androidManifest.path,
|
|
'-A', assets.path,
|
|
'-I', _androidJar.path,
|
|
'-F', outputApk.path,
|
|
]);
|
|
}
|
|
|
|
void add(Directory base, String resource, File outputApk) {
|
|
_run(_aapt.path, [
|
|
'add', '-f', outputApk.absolute.path, resource,
|
|
], workingDirectory: base.path);
|
|
}
|
|
|
|
void sign(File keystore, String keystorePassword, String keyName, File outputApk) {
|
|
_run(_jarsigner, [
|
|
'-keystore', keystore.path,
|
|
'-storepass', keystorePassword,
|
|
outputApk.path,
|
|
keyName,
|
|
]);
|
|
}
|
|
|
|
void align(File unalignedApk, File outputApk) {
|
|
_run(_zipalign.path, ['4', unalignedApk.path, outputApk.path]);
|
|
}
|
|
|
|
void _run(String command, List<String> args, { String workingDirectory }) {
|
|
ProcessResult result = Process.runSync(
|
|
command, args, workingDirectory: workingDirectory);
|
|
if (result.exitCode == 0)
|
|
return;
|
|
stdout.write(result.stdout);
|
|
stderr.write(result.stderr);
|
|
}
|
|
}
|
|
|
|
main(List<String> argv) async {
|
|
ArgParser parser = new ArgParser();
|
|
parser.addFlag('help', abbr: 'h', negatable: false);
|
|
parser.addOption('android-sdk');
|
|
parser.addOption('skyx');
|
|
|
|
ArgResults args = parser.parse(argv);
|
|
|
|
if (args['help']) {
|
|
print('usage: pub run sky_tools:build_sky_apk <options>');
|
|
print('');
|
|
print(parser.usage);
|
|
return;
|
|
}
|
|
|
|
Directory artifacts = new Directory('artifacts');
|
|
File keystore = new File('${artifacts.path}/chromium-debug.keystore');
|
|
File androidManifest = new File('${artifacts.path}/AndroidManifest.xml');
|
|
File icuData = new File('${artifacts.path}/assets/icudtl.dat');
|
|
File appSkyx = new File(args['skyx']);
|
|
|
|
Directory outDir = new Directory('out');
|
|
outDir.createSync(recursive: true);
|
|
|
|
AssetBuilder assetBuilder = new AssetBuilder(outDir);
|
|
assetBuilder.add(icuData, 'icudtl.dat');
|
|
assetBuilder.add(appSkyx, 'app.skyx');
|
|
|
|
ApkBuilder builder = new ApkBuilder(args['android-sdk']);
|
|
|
|
File unalignedApk = new File('${outDir.path}/Example.apk.unaligned');
|
|
File finalApk = new File('${outDir.path}/Example.apk');
|
|
|
|
builder.package(androidManifest, assetBuilder.directory, unalignedApk);
|
|
builder.add(artifacts, 'classes.dex', unalignedApk);
|
|
builder.add(artifacts, 'lib/armeabi-v7a/libsky_shell.so', unalignedApk);
|
|
builder.sign(keystore, kKeystorePassword, kKeystoreKeyName, unalignedApk);
|
|
builder.align(unalignedApk, finalApk);
|
|
}
|