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) |