Index: build_release.py |
=================================================================== |
new file mode 100755 |
--- /dev/null |
+++ b/build_release.py |
@@ -0,0 +1,95 @@ |
+#!/usr/bin/env python |
+ |
+import glob |
+import json |
+import os |
+import shutil |
+import subprocess |
+import sys |
+import tempfile |
+ |
+BASE_DIR = os.path.dirname(os.path.abspath(__file__)) |
+ENSURE_DEPENDENCIES_PATH = os.path.join(BASE_DIR, "ensure_dependencies.py") |
+MACH_PATH = os.path.join(BASE_DIR, "mach") |
+DIST_PATH = os.path.join(BASE_DIR, "obj-arm-linux-androideabi", "dist") |
+ |
+def print_usage(): |
+ print >>sys.stderr, "Usage: %s devbuild|release KEY_STORE KEY_NAME" % \ |
+ os.path.basename(sys.argv[0]) |
+ |
+def check_mozconfig(path, mode): |
+ if not os.path.exists(path): |
+ raise Exception("'%s' doesn't exist, please create it." % path) |
+ |
+ with open(path) as file: |
+ contents = file.read() |
+ |
+ # This check can be removed once https://issues.adblockplus.org/ticket/2490 is |
+ # done. |
+ if "--disable-crashreporter" not in contents: |
+ raise Exception( |
+ "'%s' doesn't seem to set --disable-crashreporter, please do." % path) |
+ |
+ if "export MOZILLA_OFFICIAL=1" not in contents: |
+ raise Exception( |
+ "'%s' doesn't seem to export MOZILLA_OFFICIAL=1, please do." % path) |
+ |
+ updater_disabled = "--disable-updater" in contents |
+ if updater_disabled and mode == "devbuild": |
+ raise Exception("'%s' seems to set --disable-updater, please don't." % path) |
+ elif not updater_disabled and mode == "release": |
+ raise Exception( |
+ "'%s' doesn't seem to set --disable-updater, please do." % path) |
+ |
+def find_mozconfig(mode): |
+ mozconfig_path = os.path.join(BASE_DIR, ".mozconfig-" + mode) |
+ check_mozconfig(mozconfig_path, mode) |
+ return mozconfig_path |
+ |
+def build(mode): |
+ mach_environment = os.environ.copy() |
+ mach_environment["MOZCONFIG"] = find_mozconfig(mode) |
+ subprocess.check_call([MACH_PATH, "clobber"], env=mach_environment) |
+ subprocess.check_call([MACH_PATH, "build"], env=mach_environment) |
+ subprocess.check_call([MACH_PATH, "package"], env=mach_environment) |
+ |
+ [manifest_path] = glob.glob(os.path.join( |
+ DIST_PATH, "fennec-*.en-US.android-arm.json")) |
+ with open(manifest_path) as manifest_file: |
+ manifest = json.load(manifest_file) |
+ |
+ apk_path = os.path.join(DIST_PATH, "gecko-unsigned-unaligned.apk") |
+ if mode == "release": |
+ target_apk_name = "adblockbrowser-%s-arm.apk" % manifest["moz_app_version"] |
+ else: |
+ target_apk_name = "adblockbrowser-%s.%s-arm.apk" % ( |
+ manifest["moz_app_version"], manifest["buildid"]) |
+ target_apk_path = os.path.join(DIST_PATH, target_apk_name) |
+ shutil.copyfile(apk_path, target_apk_path) |
+ return target_apk_path |
+ |
+def sign(apk_path, key_store, key_name): |
+ temp_apk_path = tempfile.NamedTemporaryFile().name |
+ shutil.copyfile(apk_path, temp_apk_path) |
+ try: |
+ subprocess.check_call(["jarsigner", "-verbose", "-sigalg", "SHA1withRSA", |
+ "-digestalg", "SHA1", "-keystore", key_store, |
+ temp_apk_path, key_name]) |
+ os.remove(apk_path) |
+ subprocess.check_call(["zipalign", "-v", "4", temp_apk_path, apk_path]) |
+ finally: |
+ os.remove(temp_apk_path) |
+ |
+if __name__ == "__main__": |
+ if len(sys.argv) < 4: |
+ print_usage() |
+ sys.exit(1) |
+ |
+ mode, key_store, key_name = sys.argv[1:] |
+ if mode not in ("devbuild", "release"): |
+ print_usage() |
+ sys.exit(2) |
+ |
+ subprocess.check_call([ENSURE_DEPENDENCIES_PATH]) |
+ apk_path = build(mode) |
+ sign(apk_path, key_store, key_name) |