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