def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(options.input_paths) proguard.configs(options.proguard_configs) proguard.config_exclusions(options.proguard_config_exclusions) proguard.outjar(options.output_path) if options.mapping: proguard.mapping(options.mapping) classpath = list(set(options.classpath)) proguard.libraryjars(classpath) proguard.verbose(options.verbose) if not options.enable_dangerous_optimizations: proguard.disable_optimizations(_DANGEROUS_OPTIMIZATIONS) build_utils.CallAndWriteDepfileIfStale( proguard.CheckOutput, options, input_paths=proguard.GetInputs(), input_strings=proguard.build(), output_paths=proguard.GetOutputs(), depfile_deps=proguard.GetDepfileDeps())
def DoProguard(options): proguard = proguard_util.ProguardCmdBuilder(options.proguard_jar_path) proguard.outjar(options.obfuscated_jar_path) input_jars = build_utils.ParseGypList(options.input_jars_paths) exclude_paths = [] configs = build_utils.ParseGypList(options.proguard_configs) if options.tested_apk_obfuscated_jar_path: # configs should only contain the process_resources.py generated config. assert len(configs) == 1, ( 'test apks should not have custom proguard configs: ' + str(configs)) proguard.tested_apk_info(options.tested_apk_obfuscated_jar_path + '.info') proguard.libraryjars([options.android_sdk_jar]) proguard_injars = [p for p in input_jars if p not in exclude_paths] proguard.injars(proguard_injars) multidex_config = _PossibleMultidexConfig(options) if multidex_config: configs.append(multidex_config) proguard.configs(configs) proguard.CheckOutput()
def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(build_utils.ParseGypList(options.input_paths)) proguard.configs(build_utils.ParseGypList(options.proguard_configs)) proguard.outjar(options.output_path) if options.mapping: proguard.mapping(options.mapping) if options.tested_apk_info: proguard.tested_apk_info(options.tested_apk_info) classpath = list(set(options.classpath)) proguard.libraryjars(classpath) proguard.verbose(options.verbose) input_paths = proguard.GetInputs() build_utils.CallAndWriteDepfileIfStale(proguard.CheckOutput, options, input_paths=input_paths, input_strings=proguard.build(), output_paths=[options.output_path])
def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(options.input_paths) proguard.configs(options.proguard_configs) proguard.config_exclusions(options.proguard_config_exclusions) proguard.outjar(options.output_path) # If a jar is part of input no need to include it as library jar. classpath = [ p for p in set(options.classpath) if p not in options.input_paths ] proguard.libraryjars(classpath) proguard.verbose(options.verbose) if not options.enable_dangerous_optimizations: proguard.disable_optimizations(_DANGEROUS_OPTIMIZATIONS) # TODO(agrieve): Remove proguard usages. if options.r8_path: cmd = _CreateR8Command(options) build_utils.CheckOutput(cmd) build_utils.WriteDepfile(options.depfile, options.output_path, inputs=proguard.GetDepfileDeps(), add_pydeps=False) else: # Do not consider the temp file as an input since its name is random. input_paths = proguard.GetInputs() with tempfile.NamedTemporaryFile() as f: if options.mapping: input_paths.append(options.mapping) # Maintain only class name mappings in the .mapping file in order to # work around what appears to be a ProGuard bug in -applymapping: # method 'int close()' is not being kept as 'a', but remapped to 'c' _RemoveMethodMappings(options.mapping, f) proguard.mapping(f.name) input_strings = proguard.build() if f.name in input_strings: input_strings[input_strings.index(f.name)] = '$M' build_utils.CallAndWriteDepfileIfStale( proguard.CheckOutput, options, input_paths=input_paths, input_strings=input_strings, output_paths=proguard.GetOutputs(), depfile_deps=proguard.GetDepfileDeps(), add_pydeps=False)
def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) # Work around cases where we switch from a non-proguard setup # to proguard. The output jar might exist and might be a hardlink # to the input jar, so remove the output before doing anything # in that case to avoid an incremental build failure. try: out_inode = os.stat(options.output_path).st_ino except OSError: out_inode = None if (out_inode and out_inode in (os.stat(injar).st_ino for injar in options.input_paths)): os.unlink(options.output_path) proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(options.input_paths) proguard.configs(options.proguard_configs) proguard.config_exclusions(options.proguard_config_exclusions) proguard.outjar(options.output_path) if options.mapping: proguard.mapping(options.mapping) if options.tested_apk_info: proguard.tested_apk_info(options.tested_apk_info) classpath = list(set(options.classpath)) proguard.libraryjars(classpath) proguard.verbose(options.verbose) if not options.enable_dangerous_optimizations: proguard.disable_optimizations(_DANGEROUS_OPTIMIZATIONS) input_paths = proguard.GetInputs() build_utils.CallAndWriteDepfileIfStale( proguard.CheckOutput, options, input_paths=input_paths, input_strings=proguard.build(), output_paths=[options.output_path], depfile_deps=proguard.GetDepfileDeps())
def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(options.input_paths) proguard.configs(options.proguard_configs) proguard.config_exclusions(options.proguard_config_exclusions) proguard.outjar(options.output_path) classpath = list(set(options.classpath)) proguard.libraryjars(classpath) proguard.verbose(options.verbose) if not options.enable_dangerous_optimizations: proguard.disable_optimizations(_DANGEROUS_OPTIMIZATIONS) # Do not consider the temp file as an input since its name is random. input_paths = proguard.GetInputs() with tempfile.NamedTemporaryFile() as f: if options.mapping: input_paths.append(options.mapping) # Maintain only class name mappings in the .mapping file in order to work # around what appears to be a ProGuard bug in -applymapping: # method 'int closed()' is not being kept as 'a', but remapped to 'c' _RemoveMethodMappings(options.mapping, f) proguard.mapping(f.name) input_strings = proguard.build() if f.name in input_strings: input_strings[input_strings.index(f.name)] = '$M' build_utils.CallAndWriteDepfileIfStale( proguard.CheckOutput, options, input_paths=input_paths, input_strings=input_strings, output_paths=proguard.GetOutputs(), depfile_deps=proguard.GetDepfileDeps(), add_pydeps=False)
def DoProguard(options): proguard = proguard_util.ProguardCmdBuilder(options.proguard_jar_path) proguard.outjar(options.obfuscated_jar_path) library_classpath = [options.android_sdk_jar] input_jars = build_utils.ParseGypList(options.input_jars_paths) exclude_paths = [] configs = build_utils.ParseGypList(options.proguard_configs) if options.tested_apk_obfuscated_jar_path: # configs should only contain the process_resources.py generated config. assert len(configs) == 1, ( 'test apks should not have custom proguard configs: ' + str(configs)) tested_jar_info = build_utils.ReadJson( options.tested_apk_obfuscated_jar_path + '.info') exclude_paths = tested_jar_info['inputs'] configs = tested_jar_info['configs'] proguard.is_test(True) proguard.mapping(options.tested_apk_obfuscated_jar_path + '.mapping') library_classpath.append(options.tested_apk_obfuscated_jar_path) proguard.libraryjars(library_classpath) proguard_injars = [p for p in input_jars if p not in exclude_paths] proguard.injars(proguard_injars) proguard.configs(configs) proguard.CheckOutput() this_info = { 'inputs': proguard_injars, 'configs': configs } build_utils.WriteJson( this_info, options.obfuscated_jar_path + '.info')
def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) libraries = [] for p in options.classpath: # If a jar is part of input no need to include it as library jar. if p not in libraries and p not in options.input_paths: libraries.append(p) # TODO(agrieve): Remove proguard usages. if options.r8_path: with build_utils.TempDir() as tmp_dir: tmp_mapping_path = os.path.join(tmp_dir, 'mapping.txt') tmp_proguard_config_path = os.path.join(tmp_dir, 'proguard_config.txt') # If there is no output (no classes are kept), this prevents this script # from failing. build_utils.Touch(tmp_mapping_path) f = cStringIO.StringIO() proguard_util.WriteFlagsFile(options.proguard_configs, f, exclude_generated=True) merged_configs = f.getvalue() f.close() print_stdout = '-whyareyoukeeping' in merged_configs if options.output_path.endswith('.dex'): with build_utils.TempDir() as tmp_dex_dir: cmd = _CreateR8Command(options, tmp_mapping_path, tmp_dex_dir, tmp_proguard_config_path, libraries) build_utils.CheckOutput(cmd, print_stdout=print_stdout) _MoveTempDexFile(tmp_dex_dir, options.output_path) else: cmd = _CreateR8Command(options, tmp_mapping_path, options.output_path, tmp_proguard_config_path, libraries) build_utils.CheckOutput(cmd, print_stdout=print_stdout) # Copy output files to correct locations. with build_utils.AtomicOutput(options.mapping_output) as mapping: # Mapping files generated by R8 include comments that may break # some of our tooling so remove those. with open(tmp_mapping_path) as tmp: mapping.writelines(l for l in tmp if not l.startswith("#")) with build_utils.AtomicOutput(options.output_config) as f: f.write(merged_configs) if options.expected_configs_file: _VerifyExpectedConfigs(options.expected_configs_file, options.output_config, options.verify_expected_configs) other_inputs = [] if options.apply_mapping: other_inputs += options.apply_mapping build_utils.WriteDepfile(options.depfile, options.output_path, inputs=options.proguard_configs + options.input_paths + libraries + other_inputs, add_pydeps=False) else: proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(options.input_paths) proguard.configs(options.proguard_configs) proguard.config_exclusions(options.proguard_config_exclusions) proguard.outjar(options.output_path) proguard.mapping_output(options.mapping_output) proguard.libraryjars(libraries) proguard.verbose(options.verbose) # Do not consider the temp file as an input since its name is random. input_paths = proguard.GetInputs() with tempfile.NamedTemporaryFile() as f: if options.apply_mapping: input_paths.append(options.apply_mapping) # Maintain only class name mappings in the .mapping file in order to # work around what appears to be a ProGuard bug in -applymapping: # method 'int close()' is not being kept as 'a', but remapped to 'c' _RemoveMethodMappings(options.apply_mapping, f) proguard.mapping(f.name) input_strings = proguard.build() if f.name in input_strings: input_strings[input_strings.index(f.name)] = '$M' build_utils.CallAndWriteDepfileIfStale( proguard.CheckOutput, options, input_paths=input_paths, input_strings=input_strings, output_paths=proguard.GetOutputs(), depfile_deps=proguard.GetDepfileDeps(), add_pydeps=False)
def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(options.input_paths) proguard.configs(options.proguard_configs) proguard.config_exclusions(options.proguard_config_exclusions) proguard.outjar(options.output_path) proguard.mapping_output(options.mapping_output) # If a jar is part of input no need to include it as library jar. classpath = [ p for p in set(options.classpath) if p not in options.input_paths ] proguard.libraryjars(classpath) proguard.verbose(options.verbose) if not options.enable_dangerous_optimizations: proguard.disable_optimizations(_DANGEROUS_OPTIMIZATIONS) # TODO(agrieve): Remove proguard usages. if options.r8_path: with tempfile.NamedTemporaryFile() as mapping_temp: if options.output_path.endswith('.dex'): with build_utils.TempDir() as tmp_dex_dir: cmd = _CreateR8Command(options, mapping_temp.name, tmp_dex_dir) build_utils.CheckOutput(cmd) _MoveTempDexFile(tmp_dex_dir, options.output_path) else: cmd = _CreateR8Command(options, mapping_temp.name, options.output_path) build_utils.CheckOutput(cmd) # Copy the mapping file back to where it should be. map_path = options.mapping_output with build_utils.AtomicOutput(map_path) as mapping: # Mapping files generated by R8 include comments that may break # some of our tooling so remove those. mapping_temp.seek(0) mapping.writelines(l for l in mapping_temp if not l.startswith("#")) build_utils.WriteDepfile(options.depfile, options.output_path, inputs=proguard.GetDepfileDeps(), add_pydeps=False) else: # Do not consider the temp file as an input since its name is random. input_paths = proguard.GetInputs() with tempfile.NamedTemporaryFile() as f: if options.mapping: input_paths.append(options.mapping) # Maintain only class name mappings in the .mapping file in order to # work around what appears to be a ProGuard bug in -applymapping: # method 'int close()' is not being kept as 'a', but remapped to 'c' _RemoveMethodMappings(options.mapping, f) proguard.mapping(f.name) input_strings = proguard.build() if f.name in input_strings: input_strings[input_strings.index(f.name)] = '$M' build_utils.CallAndWriteDepfileIfStale( proguard.CheckOutput, options, input_paths=input_paths, input_strings=input_strings, output_paths=proguard.GetOutputs(), depfile_deps=proguard.GetDepfileDeps(), add_pydeps=False)
def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) libraries = [] for p in options.classpath: # If a jar is part of input no need to include it as library jar. if p not in libraries and p not in options.input_paths: libraries.append(p) # TODO(agrieve): Remove proguard usages. if options.r8_path: temp_config_string = '' with build_utils.TempDir() as tmp_dir: tmp_mapping_path = os.path.join(tmp_dir, 'mapping.txt') tmp_proguard_config_path = os.path.join(tmp_dir, 'proguard_config.txt') # If there is no output (no classes are kept), this prevents this script # from failing. build_utils.Touch(tmp_mapping_path) f = cStringIO.StringIO() proguard_util.WriteFlagsFile( options.proguard_configs, f, exclude_generated=True) merged_configs = f.getvalue() # Fix up line endings (third_party configs can have windows endings) merged_configs = merged_configs.replace('\r', '') f.close() print_stdout = '-whyareyoukeeping' in merged_configs def run_r8(cmd): stderr_filter = None env = os.environ.copy() if options.disable_outlining: stderr_filter = lambda l: re.sub(r'.*_JAVA_OPTIONS.*\n?', '', l) env['_JAVA_OPTIONS'] = '-Dcom.android.tools.r8.disableOutlining=1' build_utils.CheckOutput( cmd, env=env, print_stdout=print_stdout, stderr_filter=stderr_filter) if options.output_path.endswith('.dex'): with build_utils.TempDir() as tmp_dex_dir: cmd, temp_config_string = _CreateR8Command( options, tmp_mapping_path, tmp_dex_dir, tmp_proguard_config_path, libraries) run_r8(cmd) _MoveTempDexFile(tmp_dex_dir, options.output_path) else: cmd, temp_config_string = _CreateR8Command( options, tmp_mapping_path, options.output_path, tmp_proguard_config_path, libraries) run_r8(cmd) # Copy output files to correct locations. with build_utils.AtomicOutput(options.mapping_output) as mapping: # Mapping files generated by R8 include comments that may break # some of our tooling so remove those. with open(tmp_mapping_path) as tmp: mapping.writelines(l for l in tmp if not l.startswith('#')) for output in build_utils.ParseGnList(options.extra_mapping_output_paths): shutil.copy(tmp_mapping_path, output) with build_utils.AtomicOutput(options.output_config) as f: f.write(merged_configs) if temp_config_string: f.write(_GENERATED_PROGUARD_HEADER) f.write(temp_config_string) if options.expected_configs_file: _VerifyExpectedConfigs(options.expected_configs_file, options.output_config, options.verify_expected_configs) other_inputs = [] if options.apply_mapping: other_inputs += options.apply_mapping build_utils.WriteDepfile( options.depfile, options.output_path, inputs=options.proguard_configs + options.input_paths + libraries + other_inputs, add_pydeps=False) else: proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(options.input_paths) proguard.configs(options.proguard_configs) proguard.config_exclusions(options.proguard_config_exclusions) proguard.outjar(options.output_path) proguard.mapping_output(options.mapping_output) proguard.libraryjars(libraries) proguard.verbose(options.verbose) proguard.min_api(options.min_api) # Do not consider the temp file as an input since its name is random. input_paths = proguard.GetInputs() with tempfile.NamedTemporaryFile() as f: if options.apply_mapping: input_paths.append(options.apply_mapping) # Maintain only class name mappings in the .mapping file in order to # work around what appears to be a ProGuard bug in -applymapping: # method 'int close()' is not being kept as 'a', but remapped to 'c' _RemoveMethodMappings(options.apply_mapping, f) proguard.mapping(f.name) with build_utils.TempDir() as d: proguard.tmp_dir(d) input_strings = proguard.build() if f.name in input_strings: input_strings[input_strings.index(f.name)] = '$M' build_utils.CallAndWriteDepfileIfStale( proguard.CheckOutput, options, input_paths=input_paths, input_strings=input_strings, output_paths=proguard.GetOutputs(), depfile_deps=proguard.GetDepfileDeps(), add_pydeps=False)
def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseOptions(args) libraries = [] for p in options.classpath: # If a jar is part of input no need to include it as library jar. if p not in libraries and p not in options.input_paths: libraries.append(p) # TODO(agrieve): Remove proguard usages. if options.r8_path: with build_utils.TempDir() as tmp_dir: tmp_mapping_path = os.path.join(tmp_dir, 'mapping.txt') tmp_proguard_config_path = os.path.join(tmp_dir, 'proguard_config.txt') tmp_merged_config_path = os.path.join(tmp_dir, 'merged_config.txt') if options.output_path.endswith('.dex'): with build_utils.TempDir() as tmp_dex_dir: cmd = _CreateR8Command(options, tmp_mapping_path, tmp_dex_dir, tmp_proguard_config_path, tmp_merged_config_path, libraries) build_utils.CheckOutput(cmd) _MoveTempDexFile(tmp_dex_dir, options.output_path) else: cmd = _CreateR8Command(options, tmp_mapping_path, options.output_path, tmp_proguard_config_path, tmp_merged_config_path, libraries) build_utils.CheckOutput(cmd) # Copy output files to correct locations. with build_utils.AtomicOutput(options.mapping_output) as mapping: # Mapping files generated by R8 include comments that may break # some of our tooling so remove those. with open(tmp_mapping_path) as tmp: mapping.writelines(l for l in tmp if not l.startswith("#")) with build_utils.AtomicOutput( options.output_config) as merged_config: with open(tmp_merged_config_path) as tmp: # Sort flags alphabetically to make diffs more stable and easier to # consume. Also strip out lines with build specific paths in them. merged_config.write(_NormalizeMergedConfig(tmp.read())) if options.expected_configs_file: _VerifyExpectedConfigs(options.expected_configs_file, options.output_config, options.verify_expected_configs) other_inputs = [] if options.apply_mapping: other_inputs += options.apply_mapping build_utils.WriteDepfile(options.depfile, options.output_path, inputs=options.proguard_configs + options.input_paths + libraries + other_inputs, add_pydeps=False) else: proguard = proguard_util.ProguardCmdBuilder(options.proguard_path) proguard.injars(options.input_paths) proguard.configs(options.proguard_configs) proguard.config_exclusions(options.proguard_config_exclusions) proguard.outjar(options.output_path) proguard.mapping_output(options.mapping_output) proguard.libraryjars(libraries) proguard.verbose(options.verbose) # Do not consider the temp file as an input since its name is random. input_paths = proguard.GetInputs() with tempfile.NamedTemporaryFile() as f: if options.apply_mapping: input_paths.append(options.apply_mapping) # Maintain only class name mappings in the .mapping file in order to # work around what appears to be a ProGuard bug in -applymapping: # method 'int close()' is not being kept as 'a', but remapped to 'c' _RemoveMethodMappings(options.apply_mapping, f) proguard.mapping(f.name) input_strings = proguard.build() if f.name in input_strings: input_strings[input_strings.index(f.name)] = '$M' build_utils.CallAndWriteDepfileIfStale( proguard.CheckOutput, options, input_paths=input_paths, input_strings=input_strings, output_paths=proguard.GetOutputs(), depfile_deps=proguard.GetDepfileDeps(), add_pydeps=False)