Index: build/android/gyp/util/proguard_util.py |
diff --git a/build/android/gyp/util/proguard_util.py b/build/android/gyp/util/proguard_util.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..901cd9f2a8f30c5491986492cc3a4575776ef8a2 |
--- /dev/null |
+++ b/build/android/gyp/util/proguard_util.py |
@@ -0,0 +1,128 @@ |
+# 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. |
+ |
+import os |
+from util import build_utils |
+ |
+def FilterProguardOutput(output): |
+ '''ProGuard outputs boring stuff to stdout (proguard version, jar path, etc) |
+ as well as interesting stuff (notes, warnings, etc). If stdout is entirely |
+ boring, this method suppresses the output. |
+ ''' |
+ ignore_patterns = [ |
+ 'ProGuard, version ', |
+ 'Reading program jar [', |
+ 'Reading library jar [', |
+ 'Preparing output jar [', |
+ ' Copying resources from program jar [', |
+ ] |
+ for line in output.splitlines(): |
+ for pattern in ignore_patterns: |
+ if line.startswith(pattern): |
+ break |
+ else: |
+ # line doesn't match any of the patterns; it's probably something worth |
+ # printing out. |
+ return output |
+ return '' |
+ |
+ |
+class ProguardCmdBuilder(object): |
+ def __init__(self, proguard_jar): |
+ assert os.path.exists(proguard_jar) |
+ self._proguard_jar_path = proguard_jar |
+ self._test = None |
+ self._mapping = None |
+ self._libraries = None |
+ self._injars = None |
+ self._configs = None |
+ self._outjar = None |
+ |
+ def outjar(self, path): |
+ assert self._outjar is None |
+ self._outjar = path |
+ |
+ def is_test(self, enable): |
+ assert self._test is None |
+ self._test = enable |
+ |
+ def mapping(self, path): |
+ assert self._mapping is None |
+ assert os.path.exists(path), path |
+ self._mapping = path |
+ |
+ def libraryjars(self, paths): |
+ assert self._libraries is None |
+ for p in paths: |
+ assert os.path.exists(p), p |
+ self._libraries = paths |
+ |
+ def injars(self, paths): |
+ assert self._injars is None |
+ for p in paths: |
+ assert os.path.exists(p), p |
+ self._injars = paths |
+ |
+ def configs(self, paths): |
+ assert self._configs is None |
+ for p in paths: |
+ assert os.path.exists(p), p |
+ self._configs = paths |
+ |
+ def build(self): |
+ assert self._injars is not None |
+ assert self._outjar is not None |
+ assert self._configs is not None |
+ cmd = [ |
+ 'java', '-jar', self._proguard_jar_path, |
+ '-forceprocessing', |
+ ] |
+ if self._test: |
+ cmd += [ |
+ '-dontobfuscate', |
+ '-dontoptimize', |
+ '-dontshrink', |
+ '-dontskipnonpubliclibraryclassmembers', |
+ ] |
+ |
+ if self._mapping: |
+ cmd += [ |
+ '-applymapping', self._mapping, |
+ ] |
+ |
+ if self._libraries: |
+ cmd += [ |
+ '-libraryjars', ':'.join(self._libraries), |
+ ] |
+ |
+ cmd += [ |
+ '-injars', ':'.join(self._injars) |
+ ] |
+ |
+ for config_file in self._configs: |
+ cmd += ['-include', config_file] |
+ |
+ # The output jar must be specified after inputs. |
+ cmd += [ |
+ '-outjars', self._outjar, |
+ '-dump', self._outjar + '.dump', |
+ '-printseeds', self._outjar + '.seeds', |
+ '-printusage', self._outjar + '.usage', |
+ '-printmapping', self._outjar + '.mapping', |
+ ] |
+ return cmd |
+ |
+ def GetInputs(self): |
+ inputs = [self._proguard_jar_path] + self._configs + self._injars |
+ if self._mapping: |
+ inputs.append(self._mapping) |
+ if self._libraries: |
+ inputs += self._libraries |
+ return inputs |
+ |
+ |
+ def CheckOutput(self): |
+ build_utils.CheckOutput(self.build(), print_stdout=True, |
+ stdout_filter=FilterProguardOutput) |
+ |