|  | # 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) | 
|  |  |