xref: /aosp_15_r20/external/cronet/build/android/gyp/unused_resources.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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