| Index: build/android/gyp/gen-android-test-isolate.py | 
| diff --git a/build/android/gyp/gen-android-test-isolate.py b/build/android/gyp/gen-android-test-isolate.py | 
| new file mode 100755 | 
| index 0000000000000000000000000000000000000000..23bcc3bdcfa396e2d14242716e9da955a284b1ae | 
| --- /dev/null | 
| +++ b/build/android/gyp/gen-android-test-isolate.py | 
| @@ -0,0 +1,86 @@ | 
| +#!/usr/bin/env python | 
| +# Copyright 2016 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 an Android .apk.isolate for a given test target. | 
| + | 
| +This currently works by running "gn desc runtime_deps". In the future, it would | 
| +be better if GN had a way to forcefully write gn runtime deps during generation | 
| +(as if --runtime-deps-list-file were used for a target with | 
| +record_runtime_deps = "path"). Then, this script can be changed to just convert | 
| +the file into an .apk.isolate. | 
| +""" | 
| + | 
| +import argparse | 
| +import os | 
| +import sys | 
| +import pprint | 
| + | 
| +from util import build_utils | 
| + | 
| + | 
| +_FILE_BLACKLIST = set(( | 
| +    # test_env.py are listed by test_support targets. Not needed on-device. | 
| +    'test_env.py', | 
| +    # The following are packaged into the .apk. | 
| +    'icudtl.dat', | 
| +    'natives_blob_32.bin', | 
| +    'natives_blob_64.bin', | 
| +    'snapshot_blob_32.bin', | 
| +    'snapshot_blob_64.bin', | 
| +)) | 
| + | 
| + | 
| +def _GnPath(): | 
| +  src_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, | 
| +                         os.pardir) | 
| +  if sys.platform == 'linux2': | 
| +    subdir, exe = 'linux64', 'gn' | 
| +  elif sys.platform == 'darwin': | 
| +    subdir, exe = 'mac', 'gn' | 
| +  else: | 
| +    subdir, exe = 'win', 'gn.exe' | 
| +  return os.path.join(src_dir, 'buildtools', subdir, exe) | 
| + | 
| + | 
| +def main(): | 
| +  parser = argparse.ArgumentParser(description=__doc__) | 
| +  parser.add_argument('path', help='path build was generated into') | 
| +  parser.add_argument('target', help='ninja target to generate the isolate for') | 
| +  parser.add_argument('--out-file', help='write to file rather than stdout') | 
| +  options = parser.parse_args() | 
| + | 
| +  # Use the data deps defined by the library dependencies to avoid pulling in | 
| +  # deps required only by the test runner. | 
| +  deps = build_utils.CheckOutput([_GnPath(), 'desc', options.path, | 
| +                                  options.target, 'runtime_deps']).splitlines() | 
| +  # .so files are hardcoded by .gn to be included in runtime_deps, but since | 
| +  # they are embedded in the .apk, we don't need to push them to device. | 
| +  deps = (d for d in deps if not d.endswith('.so')) | 
| +  # lint rules are declared as data_deps to achieve better concurrency. | 
| +  deps = (d for d in deps if '__lint' not in d) | 
| +  # Blacklisted files. | 
| +  deps = (d for d in deps if os.path.basename(d) not in _FILE_BLACKLIST) | 
| + | 
| +  # Make them relative to out-file. | 
| +  if options.out_file: | 
| +    subdir = os.path.relpath(options.path, os.path.dirname(options.out_file)) | 
| +    deps = (os.path.join(subdir, d) for d in deps) | 
| + | 
| +  isolate_data = pprint.pformat({ | 
| +      'variables': { | 
| +          'files': sorted(deps), | 
| +      } | 
| +  }) | 
| + | 
| +  if options.out_file: | 
| +    with open(options.out_file, 'w') as f: | 
| +      f.write(isolate_data + '\n') | 
| +  else: | 
| +    print isolate_data | 
| + | 
| + | 
| +if __name__ == '__main__': | 
| +  sys.exit(main()) | 
| + | 
|  |