1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6777b538SAndroid Build Coastguard Worker# encoding: utf-8 3*6777b538SAndroid Build Coastguard Worker# Copyright 2021 The Chromium Authors 4*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Workerimport argparse 8*6777b538SAndroid Build Coastguard Workerimport os 9*6777b538SAndroid Build Coastguard Workerimport sys 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Workerfrom util import build_utils 12*6777b538SAndroid Build Coastguard Workerfrom util import resource_utils 13*6777b538SAndroid Build Coastguard Workerimport action_helpers # build_utils adds //build to sys.path. 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Workerdef _FilterUnusedResources(r_text_in, r_text_out, unused_resources_config): 17*6777b538SAndroid Build Coastguard Worker removed_resources = set() 18*6777b538SAndroid Build Coastguard Worker with open(unused_resources_config, encoding='utf-8') as output_config: 19*6777b538SAndroid Build Coastguard Worker for line in output_config: 20*6777b538SAndroid Build Coastguard Worker # example line: attr/line_height#remove 21*6777b538SAndroid Build Coastguard Worker resource = line.split('#')[0] 22*6777b538SAndroid Build Coastguard Worker resource_type, resource_name = resource.split('/') 23*6777b538SAndroid Build Coastguard Worker removed_resources.add((resource_type, resource_name)) 24*6777b538SAndroid Build Coastguard Worker kept_lines = [] 25*6777b538SAndroid Build Coastguard Worker with open(r_text_in, encoding='utf-8') as infile: 26*6777b538SAndroid Build Coastguard Worker for line in infile: 27*6777b538SAndroid Build Coastguard Worker # example line: int attr line_height 0x7f0014ee 28*6777b538SAndroid Build Coastguard Worker resource_type, resource_name = line.split(' ')[1:3] 29*6777b538SAndroid Build Coastguard Worker if (resource_type, resource_name) not in removed_resources: 30*6777b538SAndroid Build Coastguard Worker kept_lines.append(line) 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker with open(r_text_out, 'w', encoding='utf-8') as out_file: 33*6777b538SAndroid Build Coastguard Worker out_file.writelines(kept_lines) 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Workerdef main(args): 37*6777b538SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker action_helpers.add_depfile_arg(parser) 40*6777b538SAndroid Build Coastguard Worker parser.add_argument('--script', 41*6777b538SAndroid Build Coastguard Worker required=True, 42*6777b538SAndroid Build Coastguard Worker help='Path to the unused resources detector script.') 43*6777b538SAndroid Build Coastguard Worker parser.add_argument( 44*6777b538SAndroid Build Coastguard Worker '--dependencies-res-zips', 45*6777b538SAndroid Build Coastguard Worker required=True, 46*6777b538SAndroid Build Coastguard Worker action='append', 47*6777b538SAndroid Build Coastguard Worker help='Resources zip archives to investigate for unused resources.') 48*6777b538SAndroid Build Coastguard Worker parser.add_argument('--dexes', 49*6777b538SAndroid Build Coastguard Worker action='append', 50*6777b538SAndroid Build Coastguard Worker required=True, 51*6777b538SAndroid Build Coastguard Worker help='Path to dex file, or zip with dex files.') 52*6777b538SAndroid Build Coastguard Worker parser.add_argument( 53*6777b538SAndroid Build Coastguard Worker '--proguard-mapping', 54*6777b538SAndroid Build Coastguard Worker help='Path to proguard mapping file for the optimized dex.') 55*6777b538SAndroid Build Coastguard Worker parser.add_argument('--r-text-in', required=True, help='Path to input R.txt') 56*6777b538SAndroid Build Coastguard Worker parser.add_argument( 57*6777b538SAndroid Build Coastguard Worker '--r-text-out', 58*6777b538SAndroid Build Coastguard Worker help='Path to output R.txt with unused resources removed.') 59*6777b538SAndroid Build Coastguard Worker parser.add_argument('--android-manifests', 60*6777b538SAndroid Build Coastguard Worker action='append', 61*6777b538SAndroid Build Coastguard Worker required=True, 62*6777b538SAndroid Build Coastguard Worker help='Path to AndroidManifest') 63*6777b538SAndroid Build Coastguard Worker parser.add_argument('--output-config', 64*6777b538SAndroid Build Coastguard Worker required=True, 65*6777b538SAndroid Build Coastguard Worker help='Path to output the aapt2 config to.') 66*6777b538SAndroid Build Coastguard Worker args = build_utils.ExpandFileArgs(args) 67*6777b538SAndroid Build Coastguard Worker options = parser.parse_args(args) 68*6777b538SAndroid Build Coastguard Worker options.dependencies_res_zips = (action_helpers.parse_gn_list( 69*6777b538SAndroid Build Coastguard Worker options.dependencies_res_zips)) 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker # in case of no resources, short circuit early. 72*6777b538SAndroid Build Coastguard Worker if not options.dependencies_res_zips: 73*6777b538SAndroid Build Coastguard Worker build_utils.Touch(options.output_config) 74*6777b538SAndroid Build Coastguard Worker return 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker with build_utils.TempDir() as temp_dir: 77*6777b538SAndroid Build Coastguard Worker dep_subdirs = [] 78*6777b538SAndroid Build Coastguard Worker for dependency_res_zip in options.dependencies_res_zips: 79*6777b538SAndroid Build Coastguard Worker dep_subdirs += resource_utils.ExtractDeps([dependency_res_zip], temp_dir) 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker cmd = [ 82*6777b538SAndroid Build Coastguard Worker options.script, 83*6777b538SAndroid Build Coastguard Worker '--rtxts', 84*6777b538SAndroid Build Coastguard Worker options.r_text_in, 85*6777b538SAndroid Build Coastguard Worker '--manifests', 86*6777b538SAndroid Build Coastguard Worker ':'.join(options.android_manifests), 87*6777b538SAndroid Build Coastguard Worker '--resourceDirs', 88*6777b538SAndroid Build Coastguard Worker ':'.join(dep_subdirs), 89*6777b538SAndroid Build Coastguard Worker '--dexes', 90*6777b538SAndroid Build Coastguard Worker ':'.join(options.dexes), 91*6777b538SAndroid Build Coastguard Worker '--outputConfig', 92*6777b538SAndroid Build Coastguard Worker options.output_config, 93*6777b538SAndroid Build Coastguard Worker ] 94*6777b538SAndroid Build Coastguard Worker if options.proguard_mapping: 95*6777b538SAndroid Build Coastguard Worker cmd += [ 96*6777b538SAndroid Build Coastguard Worker '--mapping', 97*6777b538SAndroid Build Coastguard Worker options.proguard_mapping, 98*6777b538SAndroid Build Coastguard Worker ] 99*6777b538SAndroid Build Coastguard Worker build_utils.CheckOutput(cmd) 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker if options.r_text_out: 102*6777b538SAndroid Build Coastguard Worker _FilterUnusedResources(options.r_text_in, options.r_text_out, 103*6777b538SAndroid Build Coastguard Worker options.output_config) 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker if options.depfile: 106*6777b538SAndroid Build Coastguard Worker depfile_deps = (options.dependencies_res_zips + options.android_manifests + 107*6777b538SAndroid Build Coastguard Worker options.dexes) + [options.r_text_in] 108*6777b538SAndroid Build Coastguard Worker if options.proguard_mapping: 109*6777b538SAndroid Build Coastguard Worker depfile_deps.append(options.proguard_mapping) 110*6777b538SAndroid Build Coastguard Worker action_helpers.write_depfile(options.depfile, options.output_config, 111*6777b538SAndroid Build Coastguard Worker depfile_deps) 112*6777b538SAndroid Build Coastguard Worker 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 115*6777b538SAndroid Build Coastguard Worker main(sys.argv[1:]) 116