1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#!/usr/bin/env python
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Use of this source code is governed by a BSD-style license that can be
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# found in the LICENSE file.
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch"""Combines stripped libraries and incomplete APK into single standalone APK.
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch"""
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport optparse
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport os
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport shutil
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport sys
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport tempfile
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfrom util import build_utils
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfrom util import md5_check
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef CreateStandaloneApk(options):
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  def DoZip():
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    with tempfile.NamedTemporaryFile(suffix='.zip') as intermediate_file:
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      intermediate_path = intermediate_file.name
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shutil.copy(options.input_apk_path, intermediate_path)
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      apk_path_abs = os.path.abspath(intermediate_path)
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      build_utils.CheckOutput(
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          ['zip', '-r', '-1', apk_path_abs, 'lib'],
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          cwd=options.libraries_top_dir)
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shutil.copy(intermediate_path, options.output_apk_path)
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  input_paths = [options.input_apk_path, options.libraries_top_dir]
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  record_path = '%s.standalone.stamp' % options.input_apk_path
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  md5_check.CallAndRecordIfStale(
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DoZip,
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      record_path=record_path,
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      input_paths=input_paths)
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)def main():
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser = optparse.OptionParser()
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser.add_option('--libraries-top-dir',
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      help='Top directory that contains libraries '
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      '(i.e. library paths are like '
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      'libraries_top_dir/lib/android_app_abi/foo.so).')
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser.add_option('--input-apk-path', help='Path to incomplete APK.')
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser.add_option('--output-apk-path', help='Path for standalone APK.')
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser.add_option('--stamp', help='Path to touch on success.')
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  options, _ = parser.parse_args()
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  required_options = ['libraries_top_dir', 'input_apk_path', 'output_apk_path']
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  build_utils.CheckOptions(options, parser, required=required_options)
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CreateStandaloneApk(options)
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if options.stamp:
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    build_utils.Touch(options.stamp)
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochif __name__ == '__main__':
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  sys.exit(main())
61