blob: f210db147d8ff975b2ed0f7f3b95cec6f146b92a [file] [log] [blame]
# Copyright 2019 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.
"""This module wraps bundletool."""
import json
from devil import base_error
from devil import devil_env
from devil.utils import cmd_helper
from devil.utils import lazy
with devil_env.SysPath(devil_env.PY_UTILS_PATH):
from py_utils import tempfile_ext
_bundletool_path = lazy.WeakConstant(lambda: devil_env.config.FetchPath(
'bundletool'))
def ExtractApks(output_dir,
apks_path,
abis,
locales,
features,
pixel_density,
sdk_version,
modules=None):
"""Extracts splits from APKS archive.
Args:
output_dir: Directory to extract splits into.
apks_path: Path to APKS archive.
abis: ABIs to support.
locales: Locales to support.
features: Device features to support.
pixel_density: Pixel density to support.
sdk_version: Target SDK version.
modules: Extra modules to install.
"""
device_spec = {
'supportedAbis': abis,
'supportedLocales': ['%s-%s' % l for l in locales],
'deviceFeatures': features,
'screenDensity': pixel_density,
'sdkVersion': sdk_version,
}
with tempfile_ext.TemporaryFileName(suffix='.json') as device_spec_path:
with open(device_spec_path, 'w') as f:
json.dump(device_spec, f)
cmd = [
'java',
'-jar',
_bundletool_path.read(),
'extract-apks',
'--apks=%s' % apks_path,
'--device-spec=%s' % device_spec_path,
'--output-dir=%s' % output_dir,
]
if modules:
cmd += ['--modules=%s' % ','.join(modules)]
status, stdout, stderr = cmd_helper.GetCmdStatusOutputAndError(cmd)
if status != 0:
raise base_error.BaseError('Failed running {} with output\n{}\n{}'.format(
' '.join(cmd), stdout, stderr))