xref: /aosp_15_r20/external/cronet/build/android/gyp/dist_aar.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Worker#
3*6777b538SAndroid Build Coastguard Worker# Copyright 2017 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 Worker"""Creates an Android .aar file."""
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Workerimport argparse
10*6777b538SAndroid Build Coastguard Workerimport os
11*6777b538SAndroid Build Coastguard Workerimport posixpath
12*6777b538SAndroid Build Coastguard Workerimport shutil
13*6777b538SAndroid Build Coastguard Workerimport sys
14*6777b538SAndroid Build Coastguard Workerimport tempfile
15*6777b538SAndroid Build Coastguard Workerimport zipfile
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Workerimport filter_zip
18*6777b538SAndroid Build Coastguard Workerfrom util import build_utils
19*6777b538SAndroid Build Coastguard Workerimport action_helpers  # build_utils adds //build to sys.path.
20*6777b538SAndroid Build Coastguard Workerimport zip_helpers
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker_ANDROID_BUILD_DIR = os.path.dirname(os.path.dirname(__file__))
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Workerdef _MergeRTxt(r_paths, include_globs):
27*6777b538SAndroid Build Coastguard Worker  """Merging the given R.txt files and returns them as a string."""
28*6777b538SAndroid Build Coastguard Worker  all_lines = set()
29*6777b538SAndroid Build Coastguard Worker  for r_path in r_paths:
30*6777b538SAndroid Build Coastguard Worker    if include_globs and not build_utils.MatchesGlob(r_path, include_globs):
31*6777b538SAndroid Build Coastguard Worker      continue
32*6777b538SAndroid Build Coastguard Worker    with open(r_path) as f:
33*6777b538SAndroid Build Coastguard Worker      all_lines.update(f.readlines())
34*6777b538SAndroid Build Coastguard Worker  return ''.join(sorted(all_lines))
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Workerdef _MergeProguardConfigs(proguard_configs):
38*6777b538SAndroid Build Coastguard Worker  """Merging the given proguard config files and returns them as a string."""
39*6777b538SAndroid Build Coastguard Worker  ret = []
40*6777b538SAndroid Build Coastguard Worker  for config in proguard_configs:
41*6777b538SAndroid Build Coastguard Worker    ret.append('# FROM: {}'.format(config))
42*6777b538SAndroid Build Coastguard Worker    with open(config) as f:
43*6777b538SAndroid Build Coastguard Worker      ret.append(f.read())
44*6777b538SAndroid Build Coastguard Worker  return '\n'.join(ret)
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Workerdef _AddResources(aar_zip, resource_zips, include_globs):
48*6777b538SAndroid Build Coastguard Worker  """Adds all resource zips to the given aar_zip.
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker  Ensures all res/values/* files have unique names by prefixing them.
51*6777b538SAndroid Build Coastguard Worker  """
52*6777b538SAndroid Build Coastguard Worker  for i, path in enumerate(resource_zips):
53*6777b538SAndroid Build Coastguard Worker    if include_globs and not build_utils.MatchesGlob(path, include_globs):
54*6777b538SAndroid Build Coastguard Worker      continue
55*6777b538SAndroid Build Coastguard Worker    with zipfile.ZipFile(path) as res_zip:
56*6777b538SAndroid Build Coastguard Worker      for info in res_zip.infolist():
57*6777b538SAndroid Build Coastguard Worker        data = res_zip.read(info)
58*6777b538SAndroid Build Coastguard Worker        dirname, basename = posixpath.split(info.filename)
59*6777b538SAndroid Build Coastguard Worker        if 'values' in dirname:
60*6777b538SAndroid Build Coastguard Worker          root, ext = os.path.splitext(basename)
61*6777b538SAndroid Build Coastguard Worker          basename = '{}_{}{}'.format(root, i, ext)
62*6777b538SAndroid Build Coastguard Worker          info.filename = posixpath.join(dirname, basename)
63*6777b538SAndroid Build Coastguard Worker        info.filename = posixpath.join('res', info.filename)
64*6777b538SAndroid Build Coastguard Worker        aar_zip.writestr(info, data)
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Workerdef main(args):
68*6777b538SAndroid Build Coastguard Worker  args = build_utils.ExpandFileArgs(args)
69*6777b538SAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
70*6777b538SAndroid Build Coastguard Worker  action_helpers.add_depfile_arg(parser)
71*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--output', required=True, help='Path to output aar.')
72*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--jars', required=True, help='GN list of jar inputs.')
73*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--dependencies-res-zips', required=True,
74*6777b538SAndroid Build Coastguard Worker                      help='GN list of resource zips')
75*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--r-text-files', required=True,
76*6777b538SAndroid Build Coastguard Worker                      help='GN list of R.txt files to merge')
77*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--proguard-configs', required=True,
78*6777b538SAndroid Build Coastguard Worker                      help='GN list of ProGuard flag files to merge.')
79*6777b538SAndroid Build Coastguard Worker  parser.add_argument(
80*6777b538SAndroid Build Coastguard Worker      '--android-manifest',
81*6777b538SAndroid Build Coastguard Worker      help='Path to AndroidManifest.xml to include.',
82*6777b538SAndroid Build Coastguard Worker      default=os.path.join(_ANDROID_BUILD_DIR, 'AndroidManifest.xml'))
83*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--native-libraries', default='',
84*6777b538SAndroid Build Coastguard Worker                      help='GN list of native libraries. If non-empty then '
85*6777b538SAndroid Build Coastguard Worker                      'ABI must be specified.')
86*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--abi',
87*6777b538SAndroid Build Coastguard Worker                      help='ABI (e.g. armeabi-v7a) for native libraries.')
88*6777b538SAndroid Build Coastguard Worker  parser.add_argument(
89*6777b538SAndroid Build Coastguard Worker      '--jar-excluded-globs',
90*6777b538SAndroid Build Coastguard Worker      help='GN-list of globs for paths to exclude in jar.')
91*6777b538SAndroid Build Coastguard Worker  parser.add_argument(
92*6777b538SAndroid Build Coastguard Worker      '--jar-included-globs',
93*6777b538SAndroid Build Coastguard Worker      help='GN-list of globs for paths to include in jar.')
94*6777b538SAndroid Build Coastguard Worker  parser.add_argument(
95*6777b538SAndroid Build Coastguard Worker      '--resource-included-globs',
96*6777b538SAndroid Build Coastguard Worker      help='GN-list of globs for paths to include in R.txt and resources zips.')
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker  options = parser.parse_args(args)
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker  if options.native_libraries and not options.abi:
101*6777b538SAndroid Build Coastguard Worker    parser.error('You must provide --abi if you have native libs')
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker  options.jars = action_helpers.parse_gn_list(options.jars)
104*6777b538SAndroid Build Coastguard Worker  options.dependencies_res_zips = action_helpers.parse_gn_list(
105*6777b538SAndroid Build Coastguard Worker      options.dependencies_res_zips)
106*6777b538SAndroid Build Coastguard Worker  options.r_text_files = action_helpers.parse_gn_list(options.r_text_files)
107*6777b538SAndroid Build Coastguard Worker  options.proguard_configs = action_helpers.parse_gn_list(
108*6777b538SAndroid Build Coastguard Worker      options.proguard_configs)
109*6777b538SAndroid Build Coastguard Worker  options.native_libraries = action_helpers.parse_gn_list(
110*6777b538SAndroid Build Coastguard Worker      options.native_libraries)
111*6777b538SAndroid Build Coastguard Worker  options.jar_excluded_globs = action_helpers.parse_gn_list(
112*6777b538SAndroid Build Coastguard Worker      options.jar_excluded_globs)
113*6777b538SAndroid Build Coastguard Worker  options.jar_included_globs = action_helpers.parse_gn_list(
114*6777b538SAndroid Build Coastguard Worker      options.jar_included_globs)
115*6777b538SAndroid Build Coastguard Worker  options.resource_included_globs = action_helpers.parse_gn_list(
116*6777b538SAndroid Build Coastguard Worker      options.resource_included_globs)
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker  with tempfile.NamedTemporaryFile(delete=False) as staging_file:
119*6777b538SAndroid Build Coastguard Worker    try:
120*6777b538SAndroid Build Coastguard Worker      with zipfile.ZipFile(staging_file.name, 'w') as z:
121*6777b538SAndroid Build Coastguard Worker        zip_helpers.add_to_zip_hermetic(z,
122*6777b538SAndroid Build Coastguard Worker                                        'AndroidManifest.xml',
123*6777b538SAndroid Build Coastguard Worker                                        src_path=options.android_manifest)
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker        path_transform = filter_zip.CreatePathTransform(
126*6777b538SAndroid Build Coastguard Worker            options.jar_excluded_globs, options.jar_included_globs)
127*6777b538SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as jar_file:
128*6777b538SAndroid Build Coastguard Worker          zip_helpers.merge_zips(jar_file.name,
129*6777b538SAndroid Build Coastguard Worker                                 options.jars,
130*6777b538SAndroid Build Coastguard Worker                                 path_transform=path_transform)
131*6777b538SAndroid Build Coastguard Worker          zip_helpers.add_to_zip_hermetic(z,
132*6777b538SAndroid Build Coastguard Worker                                          'classes.jar',
133*6777b538SAndroid Build Coastguard Worker                                          src_path=jar_file.name)
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker        zip_helpers.add_to_zip_hermetic(z,
136*6777b538SAndroid Build Coastguard Worker                                        'R.txt',
137*6777b538SAndroid Build Coastguard Worker                                        data=_MergeRTxt(
138*6777b538SAndroid Build Coastguard Worker                                            options.r_text_files,
139*6777b538SAndroid Build Coastguard Worker                                            options.resource_included_globs))
140*6777b538SAndroid Build Coastguard Worker        zip_helpers.add_to_zip_hermetic(z, 'public.txt', data='')
141*6777b538SAndroid Build Coastguard Worker
142*6777b538SAndroid Build Coastguard Worker        if options.proguard_configs:
143*6777b538SAndroid Build Coastguard Worker          zip_helpers.add_to_zip_hermetic(z,
144*6777b538SAndroid Build Coastguard Worker                                          'proguard.txt',
145*6777b538SAndroid Build Coastguard Worker                                          data=_MergeProguardConfigs(
146*6777b538SAndroid Build Coastguard Worker                                              options.proguard_configs))
147*6777b538SAndroid Build Coastguard Worker
148*6777b538SAndroid Build Coastguard Worker        _AddResources(z, options.dependencies_res_zips,
149*6777b538SAndroid Build Coastguard Worker                      options.resource_included_globs)
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker        for native_library in options.native_libraries:
152*6777b538SAndroid Build Coastguard Worker          libname = os.path.basename(native_library)
153*6777b538SAndroid Build Coastguard Worker          zip_helpers.add_to_zip_hermetic(z,
154*6777b538SAndroid Build Coastguard Worker                                          os.path.join('jni', options.abi,
155*6777b538SAndroid Build Coastguard Worker                                                       libname),
156*6777b538SAndroid Build Coastguard Worker                                          src_path=native_library)
157*6777b538SAndroid Build Coastguard Worker    except:
158*6777b538SAndroid Build Coastguard Worker      os.unlink(staging_file.name)
159*6777b538SAndroid Build Coastguard Worker      raise
160*6777b538SAndroid Build Coastguard Worker    shutil.move(staging_file.name, options.output)
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker  if options.depfile:
163*6777b538SAndroid Build Coastguard Worker    all_inputs = (options.jars + options.dependencies_res_zips +
164*6777b538SAndroid Build Coastguard Worker                  options.r_text_files + options.proguard_configs)
165*6777b538SAndroid Build Coastguard Worker    action_helpers.write_depfile(options.depfile, options.output, all_inputs)
166*6777b538SAndroid Build Coastguard Worker
167*6777b538SAndroid Build Coastguard Worker
168*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
169*6777b538SAndroid Build Coastguard Worker  main(sys.argv[1:])
170