#!/usr/bin/env python # # Copyright 2013 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. """Creates symlinks to native libraries for an APK. The native libraries should have previously been pushed to the device (in options.target_dir). This script then creates links in an apk's lib/ folder to those native libraries. """ import optparse import os import sys from util import build_device from util import build_utils BUILD_ANDROID_DIR = os.path.join(os.path.dirname(__file__), '..') sys.path.append(BUILD_ANDROID_DIR) from pylib import constants from pylib.utils import apk_helper def RunShellCommand(device, cmd): output = device.RunShellCommand(cmd) if output: raise Exception( 'Unexpected output running command: ' + cmd + '\n' + '\n'.join(output)) def CreateSymlinkScript(options): libraries = build_utils.ParseGypList(options.libraries) link_cmd = ( 'rm $APK_LIBRARIES_DIR/%(lib_basename)s > /dev/null 2>&1 \n' 'ln -s $STRIPPED_LIBRARIES_DIR/%(lib_basename)s ' '$APK_LIBRARIES_DIR/%(lib_basename)s \n' ) script = '#!/bin/sh \n' for lib in libraries: script += link_cmd % { 'lib_basename': lib } with open(options.script_host_path, 'w') as scriptfile: scriptfile.write(script) def TriggerSymlinkScript(options): device = build_device.GetBuildDeviceFromPath( options.build_device_configuration) if not device: return apk_package = apk_helper.GetPackageName(options.apk) apk_libraries_dir = '/data/data/%s/lib' % apk_package device_dir = os.path.dirname(options.script_device_path) mkdir_cmd = ('if [ ! -e %(dir)s ]; then mkdir -p %(dir)s; fi ' % { 'dir': device_dir }) RunShellCommand(device, mkdir_cmd) device.PushChangedFiles(options.script_host_path, options.script_device_path) trigger_cmd = ( 'APK_LIBRARIES_DIR=%(apk_libraries_dir)s; ' 'STRIPPED_LIBRARIES_DIR=%(target_dir)s; ' '. %(script_device_path)s' ) % { 'apk_libraries_dir': apk_libraries_dir, 'target_dir': options.target_dir, 'script_device_path': options.script_device_path } RunShellCommand(device, trigger_cmd) def main(args): args = build_utils.ExpandFileArgs(args) parser = optparse.OptionParser() parser.add_option('--apk', help='Path to the apk.') parser.add_option('--script-host-path', help='Path on the host for the symlink script.') parser.add_option('--script-device-path', help='Path on the device to push the created symlink script.') parser.add_option('--libraries', help='List of native libraries.') parser.add_option('--target-dir', help='Device directory that contains the target libraries for symlinks.') parser.add_option('--stamp', help='Path to touch on success.') parser.add_option('--build-device-configuration', help='Path to build device configuration.') parser.add_option('--configuration-name', help='The build CONFIGURATION_NAME') options, _ = parser.parse_args(args) required_options = ['apk', 'libraries', 'script_host_path', 'script_device_path', 'target_dir', 'configuration_name'] build_utils.CheckOptions(options, parser, required=required_options) constants.SetBuildType(options.configuration_name) CreateSymlinkScript(options) TriggerSymlinkScript(options) if options.stamp: build_utils.Touch(options.stamp) if __name__ == '__main__': sys.exit(main(sys.argv[1:]))