Index: build/android/gyp/generate_split_manifest.py |
diff --git a/build/android/gyp/generate_split_manifest.py b/build/android/gyp/generate_split_manifest.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..1c84fe7e5c9b3898aeef5920f584c50f7a7d2763 |
--- /dev/null |
+++ b/build/android/gyp/generate_split_manifest.py |
@@ -0,0 +1,96 @@ |
+#!/usr/bin/env python |
+# |
+# Copyright 2015 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 AndroidManifest.xml for an APK split. |
+ |
+Given the manifest file for the main APK, generates an AndroidManifest.xml with |
+the value required for a Split APK (package, versionCode, etc). |
+""" |
+ |
+import lxml.etree |
+import optparse |
+ |
+from util import build_utils |
+ |
+MANIFEST_TEMPLATE = """<?xml version="1.0" encoding="utf-8"?> |
+<manifest |
+ xmlns:android="http://schemas.android.com/apk/res/android" |
+ package="%(package)s" |
+ split="%(split)s"> |
+ <application android:hasCode="%(has_code)s"> |
+ </application> |
+</manifest> |
+""" |
+ |
+def ParseArgs(): |
+ """Parses command line options. |
+ |
+ Returns: |
+ An options object as from optparse.OptionsParser.parse_args() |
+ """ |
+ parser = optparse.OptionParser() |
+ build_utils.AddDepfileOption(parser) |
+ parser.add_option('--main-manifest', help='The main manifest of the app') |
+ parser.add_option('--out-manifest', help='The output manifest') |
+ parser.add_option('--split', help='The name of the split') |
+ parser.add_option( |
+ '--has-code', |
+ action='store_true', |
+ default=False, |
+ help='Whether the split will contain a .dex file') |
+ |
+ (options, args) = parser.parse_args() |
+ |
+ if args: |
+ parser.error('No positional arguments should be given.') |
+ |
+ # Check that required options have been provided. |
+ required_options = ('main_manifest', 'out_manifest', 'split') |
+ build_utils.CheckOptions(options, parser, required=required_options) |
+ |
+ return options |
+ |
+ |
+def Build(main_manifest, split, has_code): |
+ """Builds a split manifest based on the manifest of the main APK. |
+ |
+ Args: |
+ main_manifest: the XML manifest of the main APK as a string |
+ split: the name of the split as a string |
+ has_code: whether this split APK will contain .dex files |
+ |
+ Returns: |
+ The XML split manifest as a string |
+ """ |
+ |
+ doc = lxml.etree.fromstring(main_manifest) |
+ package = doc.xpath('/manifest/@package')[0] |
+ |
+ return MANIFEST_TEMPLATE % { |
+ 'package': package, |
+ 'split': split.replace('-', '_'), |
+ 'has_code': str(has_code).lower() |
+ } |
+ |
+ |
+def main(): |
+ options = ParseArgs() |
+ main_manifest = file(options.main_manifest).read() |
+ split_manifest = Build( |
+ main_manifest, |
+ options.split, |
+ options.has_code) |
+ |
+ with file(options.out_manifest, 'w') as f: |
+ f.write(split_manifest) |
+ |
+ if options.depfile: |
+ build_utils.WriteDepfile( |
+ options.depfile, |
+ [main_manifest] + build_utils.GetPythonDependencies()) |
+ |
+ |
+if __name__ == '__main__': |
+ main() |