Chromium Code Reviews| Index: build/android/gyp/apk_install.py |
| diff --git a/build/android/gyp/apk_install.py b/build/android/gyp/apk_install.py |
| index 419dc170bb8e9066ba0d1fe9ae590808c0c797e5..649fbe2db7af385914ec4156d14669334ed94122 100755 |
| --- a/build/android/gyp/apk_install.py |
| +++ b/build/android/gyp/apk_install.py |
| @@ -23,6 +23,23 @@ sys.path.append(BUILD_ANDROID_DIR) |
| from pylib import constants |
| from pylib.utils import apk_helper |
| +def RetrieveDeviceConfig(device): |
| + """Probes the given device for its split-select config.""" |
| + # The locale properties here are new in sdk level 21. |
| + SHELL_CONFIG_COMMAND = ('echo $(getprop persist.sys.language)-' |
|
jbudorick
2015/05/19 18:21:59
This is kind of a dumb question, but ... what does
agrieve
2015/05/19 18:34:53
Update pydoc with example output.
|
| + 'r$(getprop persist.sys.country)-' |
| + '$(D=$(getprop ro.sf.lcd_density);' |
| + ' D=${D/120/ldpi};' |
| + ' D=${D/160/mdpi};' |
| + ' D=${D/240/hdpi};' |
| + ' D=${D/320/xhdpi};' |
| + ' D=${D/480/xxhdpi};' |
| + ' D=${D/[0-9]*/tvdpi/};' |
| + ' echo $D):' |
| + '$(getprop ro.product.cpu.abi)') |
| + return device.RunShellCommand(SHELL_CONFIG_COMMAND)[0] |
| + |
| + |
| def GetNewMetadata(device, apk_package): |
| """Gets the metadata on the device for the apk_package apk.""" |
| output = device.RunShellCommand('ls -l /data/app/') |
| @@ -62,6 +79,9 @@ def main(): |
| help='Path to .apk splits (can specify multiple times, causes ' |
| '--install-multiple to be used.', |
| action='append') |
| + parser.add_option('--android-sdk-tools', |
| + help='Path to the Android SDK build tools folder. ' + |
| + 'Required when using --split-apk-path.') |
| parser.add_option('--install-record', |
| help='Path to install record (touched only when APK is installed).') |
| parser.add_option('--build-device-configuration', |
| @@ -88,13 +108,36 @@ def main(): |
| # the build, then the APK has to be installed (regardless of the md5 record). |
| force_install = HasInstallMetadataChanged(device, apk_package, metadata_path) |
| + def SelectSplits(target_config, base_apk, split_apks, android_sdk_tools): |
| + cmd = [os.path.join(android_sdk_tools, 'split-select'), |
| + '--target', target_config, |
| + '--base', base_apk, |
| + ] |
| + for split in split_apks: |
| + cmd.extend(('--split', split)) |
| + |
| + # split-select outputs one path per line and a blank line at the end. |
| + output = build_utils.CheckOutput(cmd) |
| + return [x for x in output.split('\n') if x] |
| + |
| def Install(): |
| - # TODO: Filter splits using split-select. |
| - active_splits = options.split_apk_path |
| - if active_splits: |
| - device.adb.InstallMultiple( |
| - [options.apk_path] + active_splits, |
| - reinstall=True) |
| + if options.split_apk_path: |
| + requiredSdkVersion = constants.ANDROID_SDK_VERSION_CODES.LOLLIPOP |
| + actualSdkVersion = device.device.build_version_sdk |
| + if actualSdkVersion < requiredSdkVersion: |
| + raise Exception(('--split-apk-path requires sdk version %s. Device has ' |
| + 'version %s') % (requiredSdkVersion, actualSdkVersion)) |
| + device_config = RetrieveDeviceConfig(device) |
| + active_splits = SelectSplits( |
| + device_config, |
| + options.apk_path, |
| + options.split_apk_path, |
| + options.android_sdk_tools) |
| + |
| + all_apks = [options.apk_path] + active_splits |
| + apk_names = [os.path.basename(path) for path in all_apks] |
|
jbudorick
2015/05/19 18:21:59
nit: looks like you're only using this once, so it
agrieve
2015/05/19 18:34:53
Done.
|
| + print 'Installing apks:', ', '.join(apk_names) |
| + device.device.adb.InstallMultiple(all_apks, reinstall=True) |
|
jbudorick
2015/05/19 18:21:59
device.device? Is this right?
agrieve
2015/05/19 18:34:53
Sad naming :(
device is a BuildDevice
device.devi
|
| else: |
| device.Install(options.apk_path, reinstall=True) |