3 # Copyright 2013 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6 """Signs and zipaligns APK.
16 from util import build_utils
18 def SignApk(keystore_path, unsigned_path, signed_path):
19 shutil.copy(unsigned_path, signed_path)
22 '-sigalg', 'MD5withRSA',
24 '-keystore', keystore_path,
25 '-storepass', 'chromium',
29 build_utils.CheckCallDie(sign_cmd)
32 def AlignApk(android_sdk_root, unaligned_path, final_path):
34 os.path.join(android_sdk_root, 'tools', 'zipalign'),
39 build_utils.CheckCallDie(align_cmd)
43 parser = optparse.OptionParser()
45 parser.add_option('--android-sdk-root', help='Android sdk root directory.')
46 parser.add_option('--unsigned-apk-path', help='Path to input unsigned APK.')
47 parser.add_option('--final-apk-path',
48 help='Path to output signed and aligned APK.')
49 parser.add_option('--keystore-path', help='Path to keystore for signing.')
50 parser.add_option('--stamp', help='Path to touch on success.')
52 # TODO(newt): remove this once http://crbug.com/177552 is fixed in ninja.
53 parser.add_option('--ignore', help='Ignored.')
55 options, _ = parser.parse_args()
57 with tempfile.NamedTemporaryFile() as intermediate_file:
58 signed_apk_path = intermediate_file.name
59 SignApk(options.keystore_path, options.unsigned_apk_path, signed_apk_path)
60 AlignApk(options.android_sdk_root, signed_apk_path, options.final_apk_path)
63 build_utils.Touch(options.stamp)
66 if __name__ == '__main__':
67 sys.exit(main(sys.argv))