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..c9098676f1b67e6486a07666c7c9a7db15181651 100755 |
--- a/build/android/gyp/apk_install.py |
+++ b/build/android/gyp/apk_install.py |
@@ -23,6 +23,29 @@ sys.path.append(BUILD_ANDROID_DIR) |
from pylib import constants |
from pylib.utils import apk_helper |
+_DPI_TO_DENSITY = { |
+ 120: 'ldpi', |
+ 160: 'mdpi', |
+ 240: 'hdpi', |
+ 320: 'xhdpi', |
+ 480: 'xxhdpi', |
+ } |
+ |
+ |
+def RetrieveDeviceConfig(device): |
+ """Probes the given device for its split-select config. |
+ |
+ For example: en-rUS-xhdpi:armeabi-v7a |
+ Run "split-select --help" for more info about the format. |
+ """ |
+ language = device.GetProp('persist.sys.language') |
+ country = device.GetProp('persist.sys.country') |
+ density_dpi = int(device.GetProp('ro.sf.lcd_density')) |
+ density = _DPI_TO_DENSITY.get(density_dpi, 'tvdpi') |
+ abi = device.product_cpu_abi |
+ return '%s-r%s-%s:%s' % (language, country, density, abi) |
+ |
+ |
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 +85,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 +114,34 @@ 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.device) |
+ active_splits = SelectSplits( |
+ device_config, |
+ options.apk_path, |
+ options.split_apk_path, |
+ options.android_sdk_tools) |
+ |
+ all_apks = [options.apk_path] + active_splits |
+ device.device.adb.InstallMultiple(all_apks, reinstall=True) |
else: |
device.Install(options.apk_path, reinstall=True) |