xref: /aosp_15_r20/external/cronet/build/config/android/rules.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Workerimport("//build_overrides/build.gni")
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Workerassert(
8*6777b538SAndroid Build Coastguard Worker    is_android || is_robolectric,
9*6777b538SAndroid Build Coastguard Worker    "current_toolchain=$current_toolchain default_toolchain=$default_toolchain")
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Workerif (is_robolectric) {
12*6777b538SAndroid Build Coastguard Worker  template("create_native_executable_dist") {
13*6777b538SAndroid Build Coastguard Worker    not_needed(invoker, [ "*" ])
14*6777b538SAndroid Build Coastguard Worker  }
15*6777b538SAndroid Build Coastguard Worker} else if (enable_java_templates) {
16*6777b538SAndroid Build Coastguard Worker  import("//build/config/android/abi.gni")
17*6777b538SAndroid Build Coastguard Worker  import("//build/config/android/config.gni")
18*6777b538SAndroid Build Coastguard Worker  import("//build/config/android/copy_ex.gni")
19*6777b538SAndroid Build Coastguard Worker  import("//build/config/android/internal_rules.gni")
20*6777b538SAndroid Build Coastguard Worker  import("//build/config/clang/clang.gni")
21*6777b538SAndroid Build Coastguard Worker  import("//build/config/compiler/compiler.gni")
22*6777b538SAndroid Build Coastguard Worker  import("//build/config/coverage/coverage.gni")
23*6777b538SAndroid Build Coastguard Worker  import("//build/config/profiling/profiling.gni")
24*6777b538SAndroid Build Coastguard Worker  import("//build/config/python.gni")
25*6777b538SAndroid Build Coastguard Worker  import("//build/config/sanitizers/sanitizers.gni")
26*6777b538SAndroid Build Coastguard Worker  import("//build/config/zip.gni")
27*6777b538SAndroid Build Coastguard Worker  import("//build/toolchain/toolchain.gni")
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker  _BUNDLETOOL_JAR_PATH =
30*6777b538SAndroid Build Coastguard Worker      "//third_party/android_build_tools/bundletool/bundletool.jar"
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker  _sanitizer_runtimes = []
33*6777b538SAndroid Build Coastguard Worker  if (use_cfi_diag || is_ubsan || is_ubsan_security || is_ubsan_vptr) {
34*6777b538SAndroid Build Coastguard Worker    _sanitizer_runtimes += [ "$clang_base_path/lib/clang/$clang_version/lib/linux/libclang_rt.ubsan_standalone-$sanitizer_arch-android.so" ]
35*6777b538SAndroid Build Coastguard Worker  }
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker  # Creates a dist directory for a native executable.
38*6777b538SAndroid Build Coastguard Worker  #
39*6777b538SAndroid Build Coastguard Worker  # Running a native executable on a device requires all the shared library
40*6777b538SAndroid Build Coastguard Worker  # dependencies of that executable. To make it easier to install and run such an
41*6777b538SAndroid Build Coastguard Worker  # executable, this will create a directory containing the native exe and all
42*6777b538SAndroid Build Coastguard Worker  # it's library dependencies.
43*6777b538SAndroid Build Coastguard Worker  #
44*6777b538SAndroid Build Coastguard Worker  # Note: It's usually better to package things as an APK than as a native
45*6777b538SAndroid Build Coastguard Worker  # executable.
46*6777b538SAndroid Build Coastguard Worker  #
47*6777b538SAndroid Build Coastguard Worker  # Variables
48*6777b538SAndroid Build Coastguard Worker  #   dist_dir: Directory for the exe and libraries. Everything in this directory
49*6777b538SAndroid Build Coastguard Worker  #     will be deleted before copying in the exe and libraries.
50*6777b538SAndroid Build Coastguard Worker  #   binary: Path to (stripped) executable.
51*6777b538SAndroid Build Coastguard Worker  #   extra_files: List of extra files to copy in (optional).
52*6777b538SAndroid Build Coastguard Worker  #
53*6777b538SAndroid Build Coastguard Worker  # Example
54*6777b538SAndroid Build Coastguard Worker  #   create_native_executable_dist("foo_dist") {
55*6777b538SAndroid Build Coastguard Worker  #     dist_dir = "$root_build_dir/foo_dist"
56*6777b538SAndroid Build Coastguard Worker  #     binary = "$root_build_dir/foo"
57*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":the_thing_that_makes_foo" ]
58*6777b538SAndroid Build Coastguard Worker  #   }
59*6777b538SAndroid Build Coastguard Worker  template("create_native_executable_dist") {
60*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker    _libraries_list =
63*6777b538SAndroid Build Coastguard Worker        "${target_gen_dir}/${target_name}_library_dependencies.list"
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker    _sanitizer_runtimes_target_name = "${target_name}__sanitizer_runtimes"
66*6777b538SAndroid Build Coastguard Worker    group(_sanitizer_runtimes_target_name) {
67*6777b538SAndroid Build Coastguard Worker      metadata = {
68*6777b538SAndroid Build Coastguard Worker        shared_libraries = _sanitizer_runtimes
69*6777b538SAndroid Build Coastguard Worker      }
70*6777b538SAndroid Build Coastguard Worker    }
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker    generated_file("${target_name}__library_list") {
73*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "deps" ])
74*6777b538SAndroid Build Coastguard Worker      if (!defined(deps)) {
75*6777b538SAndroid Build Coastguard Worker        deps = []
76*6777b538SAndroid Build Coastguard Worker      }
77*6777b538SAndroid Build Coastguard Worker      deps += [ ":${_sanitizer_runtimes_target_name}" ]
78*6777b538SAndroid Build Coastguard Worker      output_conversion = "json"
79*6777b538SAndroid Build Coastguard Worker      outputs = [ _libraries_list ]
80*6777b538SAndroid Build Coastguard Worker      data_keys = [ "shared_libraries" ]
81*6777b538SAndroid Build Coastguard Worker      walk_keys = [ "shared_libraries_barrier" ]
82*6777b538SAndroid Build Coastguard Worker      rebase = root_build_dir
83*6777b538SAndroid Build Coastguard Worker    }
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker    copy_ex(target_name) {
86*6777b538SAndroid Build Coastguard Worker      inputs = [
87*6777b538SAndroid Build Coastguard Worker        _libraries_list,
88*6777b538SAndroid Build Coastguard Worker        invoker.binary,
89*6777b538SAndroid Build Coastguard Worker      ]
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker      dest = invoker.dist_dir
92*6777b538SAndroid Build Coastguard Worker      data = [ "${invoker.dist_dir}/" ]
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker      _rebased_libraries_list = rebase_path(_libraries_list, root_build_dir)
95*6777b538SAndroid Build Coastguard Worker      _rebased_binaries_list = rebase_path([ invoker.binary ], root_build_dir)
96*6777b538SAndroid Build Coastguard Worker      args = [
97*6777b538SAndroid Build Coastguard Worker        "--clear",
98*6777b538SAndroid Build Coastguard Worker        "--files=@FileArg($_rebased_libraries_list)",
99*6777b538SAndroid Build Coastguard Worker        "--files=$_rebased_binaries_list",
100*6777b538SAndroid Build Coastguard Worker      ]
101*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.extra_files)) {
102*6777b538SAndroid Build Coastguard Worker        _rebased_extra_files = rebase_path(invoker.extra_files, root_build_dir)
103*6777b538SAndroid Build Coastguard Worker        args += [ "--files=$_rebased_extra_files" ]
104*6777b538SAndroid Build Coastguard Worker      }
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Worker      _depfile = "$target_gen_dir/$target_name.d"
107*6777b538SAndroid Build Coastguard Worker      _stamp_file = "$target_gen_dir/$target_name.stamp"
108*6777b538SAndroid Build Coastguard Worker      outputs = [ _stamp_file ]
109*6777b538SAndroid Build Coastguard Worker      args += [
110*6777b538SAndroid Build Coastguard Worker        "--depfile",
111*6777b538SAndroid Build Coastguard Worker        rebase_path(_depfile, root_build_dir),
112*6777b538SAndroid Build Coastguard Worker        "--stamp",
113*6777b538SAndroid Build Coastguard Worker        rebase_path(_stamp_file, root_build_dir),
114*6777b538SAndroid Build Coastguard Worker      ]
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker      deps = [ ":${target_name}__library_list" ]
117*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
118*6777b538SAndroid Build Coastguard Worker        deps += invoker.deps
119*6777b538SAndroid Build Coastguard Worker      }
120*6777b538SAndroid Build Coastguard Worker    }
121*6777b538SAndroid Build Coastguard Worker  }
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker  # Declare a target for c-preprocessor-generated java files
124*6777b538SAndroid Build Coastguard Worker  #
125*6777b538SAndroid Build Coastguard Worker  # NOTE: For generating Java conterparts to enums prefer using the java_cpp_enum
126*6777b538SAndroid Build Coastguard Worker  #       rule instead.
127*6777b538SAndroid Build Coastguard Worker  #
128*6777b538SAndroid Build Coastguard Worker  # This target generates java files using the host C pre-processor. Each file in
129*6777b538SAndroid Build Coastguard Worker  # sources will be compiled using the C pre-processor. If include_path is
130*6777b538SAndroid Build Coastguard Worker  # specified, it will be passed (with --I) to the pre-processor.
131*6777b538SAndroid Build Coastguard Worker  #
132*6777b538SAndroid Build Coastguard Worker  # This target will create a single .srcjar. Adding this target to an
133*6777b538SAndroid Build Coastguard Worker  # android_library target's srcjar_deps will make the generated java files be
134*6777b538SAndroid Build Coastguard Worker  # included in that library's final outputs.
135*6777b538SAndroid Build Coastguard Worker  #
136*6777b538SAndroid Build Coastguard Worker  # Variables
137*6777b538SAndroid Build Coastguard Worker  #   sources: list of files to be processed by the C pre-processor. For each
138*6777b538SAndroid Build Coastguard Worker  #     file in sources, there will be one .java file in the final .srcjar. For a
139*6777b538SAndroid Build Coastguard Worker  #     file named FooBar.template, a java file will be created with name
140*6777b538SAndroid Build Coastguard Worker  #     FooBar.java.
141*6777b538SAndroid Build Coastguard Worker  #   inputs: additional compile-time dependencies. Any files
142*6777b538SAndroid Build Coastguard Worker  #     `#include`-ed in the templates should be listed here.
143*6777b538SAndroid Build Coastguard Worker  #   defines: List of -D arguments for the preprocessor.
144*6777b538SAndroid Build Coastguard Worker  #
145*6777b538SAndroid Build Coastguard Worker  # Example
146*6777b538SAndroid Build Coastguard Worker  #   java_cpp_template("foo_generated_enum") {
147*6777b538SAndroid Build Coastguard Worker  #     sources = [
148*6777b538SAndroid Build Coastguard Worker  #       "android/java/templates/Foo.template",
149*6777b538SAndroid Build Coastguard Worker  #     ]
150*6777b538SAndroid Build Coastguard Worker  #     inputs = [
151*6777b538SAndroid Build Coastguard Worker  #       "android/java/templates/native_foo_header.h",
152*6777b538SAndroid Build Coastguard Worker  #     ]
153*6777b538SAndroid Build Coastguard Worker  #   }
154*6777b538SAndroid Build Coastguard Worker  template("java_cpp_template") {
155*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
156*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
157*6777b538SAndroid Build Coastguard Worker                             [
158*6777b538SAndroid Build Coastguard Worker                               "data_deps",
159*6777b538SAndroid Build Coastguard Worker                               "deps",
160*6777b538SAndroid Build Coastguard Worker                               "inputs",
161*6777b538SAndroid Build Coastguard Worker                               "public_deps",
162*6777b538SAndroid Build Coastguard Worker                               "sources",
163*6777b538SAndroid Build Coastguard Worker                               "testonly",
164*6777b538SAndroid Build Coastguard Worker                               "visibility",
165*6777b538SAndroid Build Coastguard Worker                             ])
166*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/gcc_preprocess.py"
167*6777b538SAndroid Build Coastguard Worker      outputs = [ "$target_gen_dir/$target_name.srcjar" ]
168*6777b538SAndroid Build Coastguard Worker
169*6777b538SAndroid Build Coastguard Worker      _include_dirs = [
170*6777b538SAndroid Build Coastguard Worker        "//",
171*6777b538SAndroid Build Coastguard Worker        root_gen_dir,
172*6777b538SAndroid Build Coastguard Worker      ]
173*6777b538SAndroid Build Coastguard Worker      _rebased_include_dirs = rebase_path(_include_dirs, root_build_dir)
174*6777b538SAndroid Build Coastguard Worker      args = [
175*6777b538SAndroid Build Coastguard Worker        "--include-dirs=$_rebased_include_dirs",
176*6777b538SAndroid Build Coastguard Worker        "--output",
177*6777b538SAndroid Build Coastguard Worker        rebase_path(outputs[0], root_build_dir),
178*6777b538SAndroid Build Coastguard Worker      ]
179*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.defines)) {
180*6777b538SAndroid Build Coastguard Worker        foreach(_define, invoker.defines) {
181*6777b538SAndroid Build Coastguard Worker          args += [
182*6777b538SAndroid Build Coastguard Worker            "--define",
183*6777b538SAndroid Build Coastguard Worker            _define,
184*6777b538SAndroid Build Coastguard Worker          ]
185*6777b538SAndroid Build Coastguard Worker        }
186*6777b538SAndroid Build Coastguard Worker      }
187*6777b538SAndroid Build Coastguard Worker      args += rebase_path(sources, root_build_dir)
188*6777b538SAndroid Build Coastguard Worker    }
189*6777b538SAndroid Build Coastguard Worker  }
190*6777b538SAndroid Build Coastguard Worker
191*6777b538SAndroid Build Coastguard Worker  # Declare a target for generating Java classes from C++ enums.
192*6777b538SAndroid Build Coastguard Worker  #
193*6777b538SAndroid Build Coastguard Worker  # This target generates Java files from C++ enums using a script.
194*6777b538SAndroid Build Coastguard Worker  #
195*6777b538SAndroid Build Coastguard Worker  # This target will create a single .srcjar. Adding this target to an
196*6777b538SAndroid Build Coastguard Worker  # android_library target's srcjar_deps will make the generated java files be
197*6777b538SAndroid Build Coastguard Worker  # included in that library's final outputs.
198*6777b538SAndroid Build Coastguard Worker  #
199*6777b538SAndroid Build Coastguard Worker  # Variables
200*6777b538SAndroid Build Coastguard Worker  #   sources: list of files to be processed by the script. For each annotated
201*6777b538SAndroid Build Coastguard Worker  #     enum contained in the sources files the script will generate a .java
202*6777b538SAndroid Build Coastguard Worker  #     file with the same name as the name of the enum.
203*6777b538SAndroid Build Coastguard Worker  #
204*6777b538SAndroid Build Coastguard Worker  # Example
205*6777b538SAndroid Build Coastguard Worker  #   java_cpp_enum("foo_generated_enum") {
206*6777b538SAndroid Build Coastguard Worker  #     sources = [
207*6777b538SAndroid Build Coastguard Worker  #       "src/native_foo_header.h",
208*6777b538SAndroid Build Coastguard Worker  #     ]
209*6777b538SAndroid Build Coastguard Worker  #   }
210*6777b538SAndroid Build Coastguard Worker  template("java_cpp_enum") {
211*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
212*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "sources" ])
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard Worker      # The sources aren't compiled so don't check their dependencies.
215*6777b538SAndroid Build Coastguard Worker      check_includes = false
216*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/java_cpp_enum.py"
217*6777b538SAndroid Build Coastguard Worker
218*6777b538SAndroid Build Coastguard Worker      _srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
219*6777b538SAndroid Build Coastguard Worker      _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir)
220*6777b538SAndroid Build Coastguard Worker      _rebased_sources = rebase_path(invoker.sources, root_build_dir)
221*6777b538SAndroid Build Coastguard Worker
222*6777b538SAndroid Build Coastguard Worker      args = [ "--srcjar=$_rebased_srcjar_path" ] + _rebased_sources
223*6777b538SAndroid Build Coastguard Worker      outputs = [ _srcjar_path ]
224*6777b538SAndroid Build Coastguard Worker    }
225*6777b538SAndroid Build Coastguard Worker  }
226*6777b538SAndroid Build Coastguard Worker
227*6777b538SAndroid Build Coastguard Worker  # Declare a target for generating Java classes with string constants matching
228*6777b538SAndroid Build Coastguard Worker  # those found in C++ files using a python script.
229*6777b538SAndroid Build Coastguard Worker  #
230*6777b538SAndroid Build Coastguard Worker  # This target will create a single .srcjar. Adding this target to an
231*6777b538SAndroid Build Coastguard Worker  # android_library target's srcjar_deps will make the generated java files be
232*6777b538SAndroid Build Coastguard Worker  # included in that library's final outputs.
233*6777b538SAndroid Build Coastguard Worker  #
234*6777b538SAndroid Build Coastguard Worker  # Variables
235*6777b538SAndroid Build Coastguard Worker  #   sources: list of files to be processed by the script. For each string
236*6777b538SAndroid Build Coastguard Worker  #            constant in the source files, the script will add a corresponding
237*6777b538SAndroid Build Coastguard Worker  #            Java string to the specified template file.
238*6777b538SAndroid Build Coastguard Worker  # Example
239*6777b538SAndroid Build Coastguard Worker  #   java_cpp_strings("foo_switches") {
240*6777b538SAndroid Build Coastguard Worker  #     sources = [
241*6777b538SAndroid Build Coastguard Worker  #       "src/foo_switches.cc",
242*6777b538SAndroid Build Coastguard Worker  #     ]
243*6777b538SAndroid Build Coastguard Worker  #     template = "src/templates/FooSwitches.java.tmpl
244*6777b538SAndroid Build Coastguard Worker  #   }
245*6777b538SAndroid Build Coastguard Worker  #
246*6777b538SAndroid Build Coastguard Worker  # foo_switches.cc:
247*6777b538SAndroid Build Coastguard Worker  #
248*6777b538SAndroid Build Coastguard Worker  # // A switch.
249*6777b538SAndroid Build Coastguard Worker  # const char kASwitch = "a-switch";
250*6777b538SAndroid Build Coastguard Worker  #
251*6777b538SAndroid Build Coastguard Worker  # FooSwitches.java.tmpl
252*6777b538SAndroid Build Coastguard Worker  #
253*6777b538SAndroid Build Coastguard Worker  # // Copyright {YEAR} The Chromium Authors
254*6777b538SAndroid Build Coastguard Worker  # // Use of this source code is governed by a BSD-style license that can be
255*6777b538SAndroid Build Coastguard Worker  # // found in the LICENSE file.
256*6777b538SAndroid Build Coastguard Worker  #
257*6777b538SAndroid Build Coastguard Worker  # // This file is autogenerated by
258*6777b538SAndroid Build Coastguard Worker  # //     {SCRIPT_NAME}
259*6777b538SAndroid Build Coastguard Worker  # // From
260*6777b538SAndroid Build Coastguard Worker  # //     {SOURCE_PATH}, and
261*6777b538SAndroid Build Coastguard Worker  # //     {TEMPLATE_PATH}
262*6777b538SAndroid Build Coastguard Worker  #
263*6777b538SAndroid Build Coastguard Worker  # package my.java.package;
264*6777b538SAndroid Build Coastguard Worker  #
265*6777b538SAndroid Build Coastguard Worker  # public abstract class FooSwitches {{
266*6777b538SAndroid Build Coastguard Worker  #     // ...snip...
267*6777b538SAndroid Build Coastguard Worker  # {NATIVE_STRINGS}
268*6777b538SAndroid Build Coastguard Worker  #     // ...snip...
269*6777b538SAndroid Build Coastguard Worker  # }}
270*6777b538SAndroid Build Coastguard Worker  #
271*6777b538SAndroid Build Coastguard Worker  # result:
272*6777b538SAndroid Build Coastguard Worker  #   A FooSwitches.java file, defining a class named FooSwitches in the package
273*6777b538SAndroid Build Coastguard Worker  #   my.java.package.
274*6777b538SAndroid Build Coastguard Worker  template("java_cpp_strings") {
275*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
276*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "sources" ])
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker      # The sources aren't compiled so don't check their dependencies.
279*6777b538SAndroid Build Coastguard Worker      check_includes = false
280*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/java_cpp_strings.py"
281*6777b538SAndroid Build Coastguard Worker
282*6777b538SAndroid Build Coastguard Worker      _srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
283*6777b538SAndroid Build Coastguard Worker      _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir)
284*6777b538SAndroid Build Coastguard Worker      _rebased_sources = rebase_path(invoker.sources, root_build_dir)
285*6777b538SAndroid Build Coastguard Worker      _rebased_template = rebase_path(invoker.template, root_build_dir)
286*6777b538SAndroid Build Coastguard Worker
287*6777b538SAndroid Build Coastguard Worker      args = [
288*6777b538SAndroid Build Coastguard Worker        "--srcjar=$_rebased_srcjar_path",
289*6777b538SAndroid Build Coastguard Worker        "--template=$_rebased_template",
290*6777b538SAndroid Build Coastguard Worker      ]
291*6777b538SAndroid Build Coastguard Worker      args += _rebased_sources
292*6777b538SAndroid Build Coastguard Worker      sources += [ invoker.template ]
293*6777b538SAndroid Build Coastguard Worker
294*6777b538SAndroid Build Coastguard Worker      outputs = [ _srcjar_path ]
295*6777b538SAndroid Build Coastguard Worker    }
296*6777b538SAndroid Build Coastguard Worker  }
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker  # Declare a target for generating Java classes with string constants matching
299*6777b538SAndroid Build Coastguard Worker  # those found in C++ base::Feature declarations, using a python script.
300*6777b538SAndroid Build Coastguard Worker  #
301*6777b538SAndroid Build Coastguard Worker  # This target will create a single .srcjar. Adding this target to an
302*6777b538SAndroid Build Coastguard Worker  # android_library target's srcjar_deps will make the generated java files be
303*6777b538SAndroid Build Coastguard Worker  # included in that library's final outputs.
304*6777b538SAndroid Build Coastguard Worker  #
305*6777b538SAndroid Build Coastguard Worker  # Variables
306*6777b538SAndroid Build Coastguard Worker  #   sources: list of files to be processed by the script. For each
307*6777b538SAndroid Build Coastguard Worker  #            base::Feature in the source files, the script will add a
308*6777b538SAndroid Build Coastguard Worker  #            corresponding Java string for that feature's name to the
309*6777b538SAndroid Build Coastguard Worker  #            specified template file.
310*6777b538SAndroid Build Coastguard Worker  # Example
311*6777b538SAndroid Build Coastguard Worker  #   java_cpp_features("foo_features") {
312*6777b538SAndroid Build Coastguard Worker  #     sources = [
313*6777b538SAndroid Build Coastguard Worker  #       "src/foo_features.cc",
314*6777b538SAndroid Build Coastguard Worker  #     ]
315*6777b538SAndroid Build Coastguard Worker  #     template = "src/templates/FooFeatures.java.tmpl
316*6777b538SAndroid Build Coastguard Worker  #   }
317*6777b538SAndroid Build Coastguard Worker  #
318*6777b538SAndroid Build Coastguard Worker  # foo_features.cc:
319*6777b538SAndroid Build Coastguard Worker  #
320*6777b538SAndroid Build Coastguard Worker  # // A feature.
321*6777b538SAndroid Build Coastguard Worker  # BASE_FEATURE(kSomeFeature, "SomeFeature",
322*6777b538SAndroid Build Coastguard Worker  #              base::FEATURE_DISABLED_BY_DEFAULT);
323*6777b538SAndroid Build Coastguard Worker  #
324*6777b538SAndroid Build Coastguard Worker  # FooFeatures.java.tmpl
325*6777b538SAndroid Build Coastguard Worker  #
326*6777b538SAndroid Build Coastguard Worker  # // Copyright $YEAR The Chromium Authors
327*6777b538SAndroid Build Coastguard Worker  # // Use of this source code is governed by a BSD-style license that can be
328*6777b538SAndroid Build Coastguard Worker  # // found in the LICENSE file.
329*6777b538SAndroid Build Coastguard Worker  #
330*6777b538SAndroid Build Coastguard Worker  # package my.java.package;
331*6777b538SAndroid Build Coastguard Worker  #
332*6777b538SAndroid Build Coastguard Worker  # public final class FooFeatures {{
333*6777b538SAndroid Build Coastguard Worker  #     // ...snip...
334*6777b538SAndroid Build Coastguard Worker  # {NATIVE_STRINGS}
335*6777b538SAndroid Build Coastguard Worker  #     // ...snip...
336*6777b538SAndroid Build Coastguard Worker  #     // Do not instantiate this class.
337*6777b538SAndroid Build Coastguard Worker  #     private FooFeatures() {{}}
338*6777b538SAndroid Build Coastguard Worker  # }}
339*6777b538SAndroid Build Coastguard Worker  #
340*6777b538SAndroid Build Coastguard Worker  # result:
341*6777b538SAndroid Build Coastguard Worker  #   A FooFeatures.java file, defining a class named FooFeatures in the package
342*6777b538SAndroid Build Coastguard Worker  #   my.java.package.
343*6777b538SAndroid Build Coastguard Worker  template("java_cpp_features") {
344*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
345*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
346*6777b538SAndroid Build Coastguard Worker                             TESTONLY_AND_VISIBILITY + [
347*6777b538SAndroid Build Coastguard Worker                                   "deps",
348*6777b538SAndroid Build Coastguard Worker                                   "sources",
349*6777b538SAndroid Build Coastguard Worker                                 ])
350*6777b538SAndroid Build Coastguard Worker
351*6777b538SAndroid Build Coastguard Worker      # The sources aren't compiled so don't check their dependencies.
352*6777b538SAndroid Build Coastguard Worker      check_includes = false
353*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/java_cpp_features.py"
354*6777b538SAndroid Build Coastguard Worker
355*6777b538SAndroid Build Coastguard Worker      _srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
356*6777b538SAndroid Build Coastguard Worker      _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir)
357*6777b538SAndroid Build Coastguard Worker      _rebased_sources = rebase_path(invoker.sources, root_build_dir)
358*6777b538SAndroid Build Coastguard Worker      _rebased_template = rebase_path(invoker.template, root_build_dir)
359*6777b538SAndroid Build Coastguard Worker
360*6777b538SAndroid Build Coastguard Worker      args = [
361*6777b538SAndroid Build Coastguard Worker        "--srcjar=$_rebased_srcjar_path",
362*6777b538SAndroid Build Coastguard Worker        "--template=$_rebased_template",
363*6777b538SAndroid Build Coastguard Worker      ]
364*6777b538SAndroid Build Coastguard Worker      args += _rebased_sources
365*6777b538SAndroid Build Coastguard Worker      sources += [ invoker.template ]
366*6777b538SAndroid Build Coastguard Worker
367*6777b538SAndroid Build Coastguard Worker      outputs = [ _srcjar_path ]
368*6777b538SAndroid Build Coastguard Worker    }
369*6777b538SAndroid Build Coastguard Worker  }
370*6777b538SAndroid Build Coastguard Worker
371*6777b538SAndroid Build Coastguard Worker  # Declare a target for processing a Jinja template.
372*6777b538SAndroid Build Coastguard Worker  #
373*6777b538SAndroid Build Coastguard Worker  # Variables
374*6777b538SAndroid Build Coastguard Worker  #   input: The template file to be processed.
375*6777b538SAndroid Build Coastguard Worker  #   includes: List of files {% include %}'ed by input.
376*6777b538SAndroid Build Coastguard Worker  #   output: Where to save the result.
377*6777b538SAndroid Build Coastguard Worker  #   variables: (Optional) A list of variables to make available to the template
378*6777b538SAndroid Build Coastguard Worker  #     processing environment, e.g. ["name=foo", "color=red"].
379*6777b538SAndroid Build Coastguard Worker  #
380*6777b538SAndroid Build Coastguard Worker  # Example
381*6777b538SAndroid Build Coastguard Worker  #   jinja_template("chrome_public_manifest") {
382*6777b538SAndroid Build Coastguard Worker  #     input = "java/AndroidManifest.xml"
383*6777b538SAndroid Build Coastguard Worker  #     output = "$target_gen_dir/AndroidManifest.xml"
384*6777b538SAndroid Build Coastguard Worker  #   }
385*6777b538SAndroid Build Coastguard Worker  template("jinja_template") {
386*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
387*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "deps" ])
388*6777b538SAndroid Build Coastguard Worker      inputs = [ invoker.input ]
389*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.includes)) {
390*6777b538SAndroid Build Coastguard Worker        inputs += invoker.includes
391*6777b538SAndroid Build Coastguard Worker      }
392*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/jinja_template.py"
393*6777b538SAndroid Build Coastguard Worker
394*6777b538SAndroid Build Coastguard Worker      outputs = [ invoker.output ]
395*6777b538SAndroid Build Coastguard Worker
396*6777b538SAndroid Build Coastguard Worker      args = [
397*6777b538SAndroid Build Coastguard Worker        "--loader-base-dir",
398*6777b538SAndroid Build Coastguard Worker        rebase_path("//", root_build_dir),
399*6777b538SAndroid Build Coastguard Worker        "--inputs",
400*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.input, root_build_dir),
401*6777b538SAndroid Build Coastguard Worker        "--output",
402*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.output, root_build_dir),
403*6777b538SAndroid Build Coastguard Worker        "--check-includes",
404*6777b538SAndroid Build Coastguard Worker      ]
405*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.includes)) {
406*6777b538SAndroid Build Coastguard Worker        _rebased_includes = rebase_path(invoker.includes, root_build_dir)
407*6777b538SAndroid Build Coastguard Worker        args += [ "--includes=$_rebased_includes" ]
408*6777b538SAndroid Build Coastguard Worker      }
409*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.variables)) {
410*6777b538SAndroid Build Coastguard Worker        args += [ "--variables=${invoker.variables}" ]
411*6777b538SAndroid Build Coastguard Worker      }
412*6777b538SAndroid Build Coastguard Worker    }
413*6777b538SAndroid Build Coastguard Worker  }
414*6777b538SAndroid Build Coastguard Worker
415*6777b538SAndroid Build Coastguard Worker  # Writes native libraries to a NativeLibaries.java file.
416*6777b538SAndroid Build Coastguard Worker  #
417*6777b538SAndroid Build Coastguard Worker  # This target will create a single .srcjar. Adding this target to an
418*6777b538SAndroid Build Coastguard Worker  # android_library target's srcjar_deps will make the generated java files be
419*6777b538SAndroid Build Coastguard Worker  # included in that library's final outputs.
420*6777b538SAndroid Build Coastguard Worker  #
421*6777b538SAndroid Build Coastguard Worker  # Variables:
422*6777b538SAndroid Build Coastguard Worker  #   native_libraries_list_file: (Optional) Path to file listing all native
423*6777b538SAndroid Build Coastguard Worker  #     libraries to write.
424*6777b538SAndroid Build Coastguard Worker  #   version_number: (Optional) String of expected version of 'main' native
425*6777b538SAndroid Build Coastguard Worker  #     library.
426*6777b538SAndroid Build Coastguard Worker  #   enable_chromium_linker: (Optional) Whether to use the Chromium linker.
427*6777b538SAndroid Build Coastguard Worker  #   use_final_fields: True to use final fields. When false, all other
428*6777b538SAndroid Build Coastguard Worker  #       variables must not be set.
429*6777b538SAndroid Build Coastguard Worker  template("write_native_libraries_java") {
430*6777b538SAndroid Build Coastguard Worker    _native_libraries_file = "$target_gen_dir/$target_name.srcjar"
431*6777b538SAndroid Build Coastguard Worker    if (current_cpu == "arm" || current_cpu == "arm64") {
432*6777b538SAndroid Build Coastguard Worker      _cpu_family = "CPU_FAMILY_ARM"
433*6777b538SAndroid Build Coastguard Worker    } else if (current_cpu == "x86" || current_cpu == "x64") {
434*6777b538SAndroid Build Coastguard Worker      _cpu_family = "CPU_FAMILY_X86"
435*6777b538SAndroid Build Coastguard Worker    } else if (current_cpu == "mipsel" || current_cpu == "mips64el") {
436*6777b538SAndroid Build Coastguard Worker      _cpu_family = "CPU_FAMILY_MIPS"
437*6777b538SAndroid Build Coastguard Worker    } else if (current_cpu == "riscv64") {
438*6777b538SAndroid Build Coastguard Worker      _cpu_family = "CPU_FAMILY_RISCV"
439*6777b538SAndroid Build Coastguard Worker    } else {
440*6777b538SAndroid Build Coastguard Worker      assert(false, "Unsupported CPU family")
441*6777b538SAndroid Build Coastguard Worker    }
442*6777b538SAndroid Build Coastguard Worker
443*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
444*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "deps" ])
445*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/write_native_libraries_java.py"
446*6777b538SAndroid Build Coastguard Worker      outputs = [ _native_libraries_file ]
447*6777b538SAndroid Build Coastguard Worker      args = [
448*6777b538SAndroid Build Coastguard Worker        "--output",
449*6777b538SAndroid Build Coastguard Worker        rebase_path(_native_libraries_file, root_build_dir),
450*6777b538SAndroid Build Coastguard Worker        "--cpu-family",
451*6777b538SAndroid Build Coastguard Worker        _cpu_family,
452*6777b538SAndroid Build Coastguard Worker      ]
453*6777b538SAndroid Build Coastguard Worker      if (invoker.use_final_fields) {
454*6777b538SAndroid Build Coastguard Worker        # Write native_libraries_list_file via depfile rather than specifyin it
455*6777b538SAndroid Build Coastguard Worker        # as a dep in order allow R8 to run in parallel with native compilation.
456*6777b538SAndroid Build Coastguard Worker        args += [ "--final" ]
457*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.native_libraries_list_file)) {
458*6777b538SAndroid Build Coastguard Worker          depfile = "$target_gen_dir/$target_name.d"
459*6777b538SAndroid Build Coastguard Worker          args += [
460*6777b538SAndroid Build Coastguard Worker            "--native-libraries-list",
461*6777b538SAndroid Build Coastguard Worker            rebase_path(invoker.native_libraries_list_file, root_build_dir),
462*6777b538SAndroid Build Coastguard Worker            "--depfile",
463*6777b538SAndroid Build Coastguard Worker            rebase_path(depfile, root_build_dir),
464*6777b538SAndroid Build Coastguard Worker          ]
465*6777b538SAndroid Build Coastguard Worker        }
466*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.enable_chromium_linker) &&
467*6777b538SAndroid Build Coastguard Worker            invoker.enable_chromium_linker) {
468*6777b538SAndroid Build Coastguard Worker          args += [ "--enable-chromium-linker" ]
469*6777b538SAndroid Build Coastguard Worker        }
470*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.native_lib_32_bit) && invoker.native_lib_32_bit) {
471*6777b538SAndroid Build Coastguard Worker          args += [ "--native-lib-32-bit" ]
472*6777b538SAndroid Build Coastguard Worker        }
473*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.native_lib_64_bit) && invoker.native_lib_64_bit) {
474*6777b538SAndroid Build Coastguard Worker          args += [ "--native-lib-64-bit" ]
475*6777b538SAndroid Build Coastguard Worker        }
476*6777b538SAndroid Build Coastguard Worker      }
477*6777b538SAndroid Build Coastguard Worker    }
478*6777b538SAndroid Build Coastguard Worker  }
479*6777b538SAndroid Build Coastguard Worker
480*6777b538SAndroid Build Coastguard Worker  # Declare a target for a set of Android resources generated at build
481*6777b538SAndroid Build Coastguard Worker  # time and stored in a single zip archive. The content of the archive
482*6777b538SAndroid Build Coastguard Worker  # should match the layout of a regular Android res/ folder (but the
483*6777b538SAndroid Build Coastguard Worker  # archive should not include a top-level res/ directory).
484*6777b538SAndroid Build Coastguard Worker  #
485*6777b538SAndroid Build Coastguard Worker  # Note that there is no associated .srcjar, R.txt or package name
486*6777b538SAndroid Build Coastguard Worker  # associated with this target.
487*6777b538SAndroid Build Coastguard Worker  #
488*6777b538SAndroid Build Coastguard Worker  # Variables:
489*6777b538SAndroid Build Coastguard Worker  #   generated_resources_zip: Generated zip archive path.
490*6777b538SAndroid Build Coastguard Worker  #   generating_target: Name of the target generating
491*6777b538SAndroid Build Coastguard Worker  #     generated_resources_zip. This rule will check that it is part
492*6777b538SAndroid Build Coastguard Worker  #     of its outputs.
493*6777b538SAndroid Build Coastguard Worker  #   deps: Specifies the dependencies of this target. Any Android resources
494*6777b538SAndroid Build Coastguard Worker  #     listed here will be also be included *after* this one when compiling
495*6777b538SAndroid Build Coastguard Worker  #     all resources for a final apk or junit binary. This is useful to
496*6777b538SAndroid Build Coastguard Worker  #     ensure that the resources of the current target override those of the
497*6777b538SAndroid Build Coastguard Worker  #     dependency as well (and would not work if you have these deps to the
498*6777b538SAndroid Build Coastguard Worker  #     generating target's dependencies).
499*6777b538SAndroid Build Coastguard Worker  #
500*6777b538SAndroid Build Coastguard Worker  # Example
501*6777b538SAndroid Build Coastguard Worker  #   _zip_archive = "$target_gen_dir/${target_name}.resources_zip"
502*6777b538SAndroid Build Coastguard Worker  #
503*6777b538SAndroid Build Coastguard Worker  #   action("my_resources__create_zip") {
504*6777b538SAndroid Build Coastguard Worker  #     _depfile = "$target_gen_dir/${target_name}.d"
505*6777b538SAndroid Build Coastguard Worker  #     script = "//build/path/to/create_my_resources_zip.py"
506*6777b538SAndroid Build Coastguard Worker  #     args = [
507*6777b538SAndroid Build Coastguard Worker  #       "--depfile", rebase_path(_depfile, root_build_dir),
508*6777b538SAndroid Build Coastguard Worker  #       "--output-zip", rebase_path(_zip_archive, root_build_dir),
509*6777b538SAndroid Build Coastguard Worker  #     ]
510*6777b538SAndroid Build Coastguard Worker  #     inputs = []
511*6777b538SAndroid Build Coastguard Worker  #     outputs = _zip_archive
512*6777b538SAndroid Build Coastguard Worker  #     depfile = _depfile
513*6777b538SAndroid Build Coastguard Worker  #   }
514*6777b538SAndroid Build Coastguard Worker  #
515*6777b538SAndroid Build Coastguard Worker  #   android_generated_resources("my_resources") {
516*6777b538SAndroid Build Coastguard Worker  #      generated_resources_zip = _zip_archive
517*6777b538SAndroid Build Coastguard Worker  #      generating_target = ":my_resources__create_zip"
518*6777b538SAndroid Build Coastguard Worker  #   }
519*6777b538SAndroid Build Coastguard Worker  #
520*6777b538SAndroid Build Coastguard Worker  template("android_generated_resources") {
521*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, [ "testonly" ])
522*6777b538SAndroid Build Coastguard Worker    _build_config = "$target_gen_dir/${target_name}.build_config.json"
523*6777b538SAndroid Build Coastguard Worker    _rtxt_out_path = "$target_gen_dir/${target_name}.R.txt"
524*6777b538SAndroid Build Coastguard Worker    write_build_config("$target_name$build_config_target_suffix") {
525*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "resource_overlay" ])
526*6777b538SAndroid Build Coastguard Worker
527*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
528*6777b538SAndroid Build Coastguard Worker      resources_zip = invoker.generated_resources_zip
529*6777b538SAndroid Build Coastguard Worker      type = "android_resources"
530*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
531*6777b538SAndroid Build Coastguard Worker        possible_config_deps = invoker.deps
532*6777b538SAndroid Build Coastguard Worker      }
533*6777b538SAndroid Build Coastguard Worker      r_text = _rtxt_out_path
534*6777b538SAndroid Build Coastguard Worker    }
535*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
536*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "visibility" ])
537*6777b538SAndroid Build Coastguard Worker      public_deps = [
538*6777b538SAndroid Build Coastguard Worker        ":$target_name$build_config_target_suffix",
539*6777b538SAndroid Build Coastguard Worker        invoker.generating_target,
540*6777b538SAndroid Build Coastguard Worker      ]
541*6777b538SAndroid Build Coastguard Worker      inputs = [ invoker.generated_resources_zip ]
542*6777b538SAndroid Build Coastguard Worker      outputs = [ _rtxt_out_path ]
543*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/create_r_txt.py"
544*6777b538SAndroid Build Coastguard Worker      args = [
545*6777b538SAndroid Build Coastguard Worker        "--resources-zip-path",
546*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.generated_resources_zip, root_build_dir),
547*6777b538SAndroid Build Coastguard Worker        "--rtxt-path",
548*6777b538SAndroid Build Coastguard Worker        rebase_path(_rtxt_out_path, root_build_dir),
549*6777b538SAndroid Build Coastguard Worker      ]
550*6777b538SAndroid Build Coastguard Worker    }
551*6777b538SAndroid Build Coastguard Worker  }
552*6777b538SAndroid Build Coastguard Worker
553*6777b538SAndroid Build Coastguard Worker  # Declare a target for processing Android resources as Jinja templates.
554*6777b538SAndroid Build Coastguard Worker  #
555*6777b538SAndroid Build Coastguard Worker  # This takes an Android resource directory where each resource is a Jinja
556*6777b538SAndroid Build Coastguard Worker  # template, processes each template, then packages the results in a zip file
557*6777b538SAndroid Build Coastguard Worker  # which can be consumed by an android resources, library, or apk target.
558*6777b538SAndroid Build Coastguard Worker  #
559*6777b538SAndroid Build Coastguard Worker  # If this target is included in the deps of an android resources/library/apk,
560*6777b538SAndroid Build Coastguard Worker  # the resources will be included with that target.
561*6777b538SAndroid Build Coastguard Worker  #
562*6777b538SAndroid Build Coastguard Worker  # Variables
563*6777b538SAndroid Build Coastguard Worker  #   resources: The list of resources files to process.
564*6777b538SAndroid Build Coastguard Worker  #   res_dir: The resource directory containing the resources.
565*6777b538SAndroid Build Coastguard Worker  #   variables: (Optional) A list of variables to make available to the template
566*6777b538SAndroid Build Coastguard Worker  #     processing environment, e.g. ["name=foo", "color=red"].
567*6777b538SAndroid Build Coastguard Worker  #
568*6777b538SAndroid Build Coastguard Worker  # Example
569*6777b538SAndroid Build Coastguard Worker  #   jinja_template_resources("chrome_public_template_resources") {
570*6777b538SAndroid Build Coastguard Worker  #     res_dir = "res_template"
571*6777b538SAndroid Build Coastguard Worker  #     resources = ["res_template/xml/syncable.xml"]
572*6777b538SAndroid Build Coastguard Worker  #     variables = ["color=red"]
573*6777b538SAndroid Build Coastguard Worker  #   }
574*6777b538SAndroid Build Coastguard Worker  template("jinja_template_resources") {
575*6777b538SAndroid Build Coastguard Worker    _resources_zip = "$target_out_dir/${target_name}.resources.zip"
576*6777b538SAndroid Build Coastguard Worker    _generating_target_name = "${target_name}__template"
577*6777b538SAndroid Build Coastguard Worker
578*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(_generating_target_name) {
579*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "deps" ])
580*6777b538SAndroid Build Coastguard Worker      inputs = invoker.resources
581*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/jinja_template.py"
582*6777b538SAndroid Build Coastguard Worker
583*6777b538SAndroid Build Coastguard Worker      outputs = [ _resources_zip ]
584*6777b538SAndroid Build Coastguard Worker
585*6777b538SAndroid Build Coastguard Worker      _rebased_resources = rebase_path(invoker.resources, root_build_dir)
586*6777b538SAndroid Build Coastguard Worker      args = [
587*6777b538SAndroid Build Coastguard Worker        "--inputs=${_rebased_resources}",
588*6777b538SAndroid Build Coastguard Worker        "--inputs-base-dir",
589*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.res_dir, root_build_dir),
590*6777b538SAndroid Build Coastguard Worker        "--outputs-zip",
591*6777b538SAndroid Build Coastguard Worker        rebase_path(_resources_zip, root_build_dir),
592*6777b538SAndroid Build Coastguard Worker        "--check-includes",
593*6777b538SAndroid Build Coastguard Worker      ]
594*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.variables)) {
595*6777b538SAndroid Build Coastguard Worker        variables = invoker.variables
596*6777b538SAndroid Build Coastguard Worker        args += [ "--variables=${variables}" ]
597*6777b538SAndroid Build Coastguard Worker      }
598*6777b538SAndroid Build Coastguard Worker    }
599*6777b538SAndroid Build Coastguard Worker
600*6777b538SAndroid Build Coastguard Worker    android_generated_resources(target_name) {
601*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
602*6777b538SAndroid Build Coastguard Worker                             TESTONLY_AND_VISIBILITY + [
603*6777b538SAndroid Build Coastguard Worker                                   "deps",
604*6777b538SAndroid Build Coastguard Worker                                   "resource_overlay",
605*6777b538SAndroid Build Coastguard Worker                                 ])
606*6777b538SAndroid Build Coastguard Worker      generating_target = ":$_generating_target_name"
607*6777b538SAndroid Build Coastguard Worker      generated_resources_zip = _resources_zip
608*6777b538SAndroid Build Coastguard Worker    }
609*6777b538SAndroid Build Coastguard Worker  }
610*6777b538SAndroid Build Coastguard Worker
611*6777b538SAndroid Build Coastguard Worker  # Declare a prebuilt android native library.
612*6777b538SAndroid Build Coastguard Worker  #
613*6777b538SAndroid Build Coastguard Worker  # This takes a base directory and library name and then looks for the library
614*6777b538SAndroid Build Coastguard Worker  # in <base dir>/$android_app_abi/<library name>.
615*6777b538SAndroid Build Coastguard Worker  #
616*6777b538SAndroid Build Coastguard Worker  # If you depend on this target, the library is stripped and output to the
617*6777b538SAndroid Build Coastguard Worker  # same locations non-prebuilt libraries are output.
618*6777b538SAndroid Build Coastguard Worker  #
619*6777b538SAndroid Build Coastguard Worker  # Variables
620*6777b538SAndroid Build Coastguard Worker  #   base_dir: Directory where all ABIs of the library live.
621*6777b538SAndroid Build Coastguard Worker  #   library_name: Name of the library .so file.
622*6777b538SAndroid Build Coastguard Worker  #
623*6777b538SAndroid Build Coastguard Worker  # Example
624*6777b538SAndroid Build Coastguard Worker  #   android_native_prebuilt("elements_native") {
625*6777b538SAndroid Build Coastguard Worker  #     base_dir = "//third_party/elements"
626*6777b538SAndroid Build Coastguard Worker  #     lib_name = "elements.so"
627*6777b538SAndroid Build Coastguard Worker  #   }
628*6777b538SAndroid Build Coastguard Worker  template("android_native_prebuilt") {
629*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
630*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
631*6777b538SAndroid Build Coastguard Worker                             [
632*6777b538SAndroid Build Coastguard Worker                               "deps",
633*6777b538SAndroid Build Coastguard Worker                               "testonly",
634*6777b538SAndroid Build Coastguard Worker                             ])
635*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/process_native_prebuilt.py"
636*6777b538SAndroid Build Coastguard Worker      _lib_path = "${invoker.base_dir}/$android_app_abi/${invoker.lib_name}"
637*6777b538SAndroid Build Coastguard Worker      _stripped_output_path = "$root_out_dir/${invoker.lib_name}"
638*6777b538SAndroid Build Coastguard Worker      _unstripped_output_path =
639*6777b538SAndroid Build Coastguard Worker          "$root_out_dir/lib.unstripped/${invoker.lib_name}"
640*6777b538SAndroid Build Coastguard Worker      inputs = [ _lib_path ]
641*6777b538SAndroid Build Coastguard Worker      outputs = [
642*6777b538SAndroid Build Coastguard Worker        _stripped_output_path,
643*6777b538SAndroid Build Coastguard Worker        _unstripped_output_path,
644*6777b538SAndroid Build Coastguard Worker      ]
645*6777b538SAndroid Build Coastguard Worker
646*6777b538SAndroid Build Coastguard Worker      # Add unstripped output to runtime deps for use by bots during stacktrace
647*6777b538SAndroid Build Coastguard Worker      # symbolization.
648*6777b538SAndroid Build Coastguard Worker      data = [ _unstripped_output_path ]
649*6777b538SAndroid Build Coastguard Worker
650*6777b538SAndroid Build Coastguard Worker      _rebased_lib_path = rebase_path(_lib_path, root_build_dir)
651*6777b538SAndroid Build Coastguard Worker      _rebased_stripped_ouput_path =
652*6777b538SAndroid Build Coastguard Worker          rebase_path(_stripped_output_path, root_build_dir)
653*6777b538SAndroid Build Coastguard Worker      _rebased_unstripped_ouput_path =
654*6777b538SAndroid Build Coastguard Worker          rebase_path(_unstripped_output_path, root_build_dir)
655*6777b538SAndroid Build Coastguard Worker      _strip_tool_path =
656*6777b538SAndroid Build Coastguard Worker          rebase_path("//buildtools/third_party/eu-strip/bin/eu-strip",
657*6777b538SAndroid Build Coastguard Worker                      root_build_dir)
658*6777b538SAndroid Build Coastguard Worker
659*6777b538SAndroid Build Coastguard Worker      args = [
660*6777b538SAndroid Build Coastguard Worker        "--strip-path=$_strip_tool_path",
661*6777b538SAndroid Build Coastguard Worker        "--input-path=$_rebased_lib_path",
662*6777b538SAndroid Build Coastguard Worker        "--stripped-output-path=$_rebased_stripped_ouput_path",
663*6777b538SAndroid Build Coastguard Worker        "--unstripped-output-path=$_rebased_unstripped_ouput_path",
664*6777b538SAndroid Build Coastguard Worker      ]
665*6777b538SAndroid Build Coastguard Worker    }
666*6777b538SAndroid Build Coastguard Worker  }
667*6777b538SAndroid Build Coastguard Worker
668*6777b538SAndroid Build Coastguard Worker  # Declare an Android resources target
669*6777b538SAndroid Build Coastguard Worker  #
670*6777b538SAndroid Build Coastguard Worker  # This creates a resources zip file that will be used when building an Android
671*6777b538SAndroid Build Coastguard Worker  # library or apk and included into a final apk.
672*6777b538SAndroid Build Coastguard Worker  #
673*6777b538SAndroid Build Coastguard Worker  # To include these resources in a library/apk, this target should be listed in
674*6777b538SAndroid Build Coastguard Worker  # the library's deps. A library/apk will also include any resources used by its
675*6777b538SAndroid Build Coastguard Worker  # own dependencies.
676*6777b538SAndroid Build Coastguard Worker  #
677*6777b538SAndroid Build Coastguard Worker  # Variables
678*6777b538SAndroid Build Coastguard Worker  #   sources: List of resource files for this target.
679*6777b538SAndroid Build Coastguard Worker  #   deps: Specifies the dependencies of this target. Any Android resources
680*6777b538SAndroid Build Coastguard Worker  #     listed in deps will be included by libraries/apks that depend on this
681*6777b538SAndroid Build Coastguard Worker  #     target.
682*6777b538SAndroid Build Coastguard Worker  #   alternative_android_sdk_dep: Optional. Alternative Android system
683*6777b538SAndroid Build Coastguard Worker  #     android java target to use.
684*6777b538SAndroid Build Coastguard Worker  #   android_manifest: AndroidManifest.xml for this target (optional). Will be
685*6777b538SAndroid Build Coastguard Worker  #     merged into apks that directly or indirectly depend on this target.
686*6777b538SAndroid Build Coastguard Worker  #   android_manifest_dep: Target that generates AndroidManifest (if applicable)
687*6777b538SAndroid Build Coastguard Worker  #   custom_package: java package for generated .java files.
688*6777b538SAndroid Build Coastguard Worker  #   allow_missing_resources: Do not fail if a resource exists in a directory
689*6777b538SAndroid Build Coastguard Worker  #      but is not listed in sources.
690*6777b538SAndroid Build Coastguard Worker  #   shared_resources: If true make a resource package that can be loaded by a
691*6777b538SAndroid Build Coastguard Worker  #     different application at runtime to access the package's resources.
692*6777b538SAndroid Build Coastguard Worker  #   resource_overlay: Whether the resources in 'sources' should override
693*6777b538SAndroid Build Coastguard Worker  #     resources with the same name. Does not affect the behaviour of any
694*6777b538SAndroid Build Coastguard Worker  #     android_resources() deps of this target. If a target with
695*6777b538SAndroid Build Coastguard Worker  #     resource_overlay=true depends on another target with
696*6777b538SAndroid Build Coastguard Worker  #     resource_overlay=true the target with the dependency overrides the
697*6777b538SAndroid Build Coastguard Worker  #     other.
698*6777b538SAndroid Build Coastguard Worker  #   r_text_file: (optional) path to pre-generated R.txt to be used when
699*6777b538SAndroid Build Coastguard Worker  #     generating R.java instead of resource-based aapt-generated one.
700*6777b538SAndroid Build Coastguard Worker  #   recursive_resource_deps: (optional) whether deps should be walked
701*6777b538SAndroid Build Coastguard Worker  #     recursively to find resource deps.
702*6777b538SAndroid Build Coastguard Worker  #
703*6777b538SAndroid Build Coastguard Worker  # Example:
704*6777b538SAndroid Build Coastguard Worker  #   android_resources("foo_resources") {
705*6777b538SAndroid Build Coastguard Worker  #     deps = [":foo_strings_grd"]
706*6777b538SAndroid Build Coastguard Worker  #     sources = [
707*6777b538SAndroid Build Coastguard Worker  #       "res/drawable/foo1.xml",
708*6777b538SAndroid Build Coastguard Worker  #       "res/drawable/foo2.xml",
709*6777b538SAndroid Build Coastguard Worker  #     ]
710*6777b538SAndroid Build Coastguard Worker  #     custom_package = "org.chromium.foo"
711*6777b538SAndroid Build Coastguard Worker  #   }
712*6777b538SAndroid Build Coastguard Worker  #
713*6777b538SAndroid Build Coastguard Worker  #   android_resources("foo_resources_overrides") {
714*6777b538SAndroid Build Coastguard Worker  #     deps = [":foo_resources"]
715*6777b538SAndroid Build Coastguard Worker  #     sources = [
716*6777b538SAndroid Build Coastguard Worker  #       "res_overrides/drawable/foo1.xml",
717*6777b538SAndroid Build Coastguard Worker  #       "res_overrides/drawable/foo2.xml",
718*6777b538SAndroid Build Coastguard Worker  #     ]
719*6777b538SAndroid Build Coastguard Worker  #   }
720*6777b538SAndroid Build Coastguard Worker  template("android_resources") {
721*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
722*6777b538SAndroid Build Coastguard Worker
723*6777b538SAndroid Build Coastguard Worker    _base_path = "$target_gen_dir/$target_name"
724*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.v14_skip)) {
725*6777b538SAndroid Build Coastguard Worker      not_needed(invoker, [ "v14_skip" ])
726*6777b538SAndroid Build Coastguard Worker    }
727*6777b538SAndroid Build Coastguard Worker
728*6777b538SAndroid Build Coastguard Worker    _res_sources_path = "$target_gen_dir/${invoker.target_name}.res.sources"
729*6777b538SAndroid Build Coastguard Worker
730*6777b538SAndroid Build Coastguard Worker    _resources_zip = "$target_out_dir/$target_name.resources.zip"
731*6777b538SAndroid Build Coastguard Worker    _r_text_out_path = _base_path + "_R.txt"
732*6777b538SAndroid Build Coastguard Worker    _build_config = _base_path + ".build_config.json"
733*6777b538SAndroid Build Coastguard Worker    _build_config_target_name = "$target_name$build_config_target_suffix"
734*6777b538SAndroid Build Coastguard Worker
735*6777b538SAndroid Build Coastguard Worker    _deps = []
736*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
737*6777b538SAndroid Build Coastguard Worker      _deps += invoker.deps
738*6777b538SAndroid Build Coastguard Worker    }
739*6777b538SAndroid Build Coastguard Worker
740*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.alternative_android_sdk_dep)) {
741*6777b538SAndroid Build Coastguard Worker      _android_sdk_dep = invoker.alternative_android_sdk_dep
742*6777b538SAndroid Build Coastguard Worker    } else {
743*6777b538SAndroid Build Coastguard Worker      _android_sdk_dep = default_android_sdk_dep
744*6777b538SAndroid Build Coastguard Worker    }
745*6777b538SAndroid Build Coastguard Worker
746*6777b538SAndroid Build Coastguard Worker    _resource_files = []
747*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.sources)) {
748*6777b538SAndroid Build Coastguard Worker      _resource_files += invoker.sources
749*6777b538SAndroid Build Coastguard Worker    }
750*6777b538SAndroid Build Coastguard Worker
751*6777b538SAndroid Build Coastguard Worker    _rebased_resource_files = rebase_path(_resource_files, root_build_dir)
752*6777b538SAndroid Build Coastguard Worker    write_file(_res_sources_path, _rebased_resource_files)
753*6777b538SAndroid Build Coastguard Worker
754*6777b538SAndroid Build Coastguard Worker    # This is necessary so we only lint chromium resources.
755*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.chromium_code)) {
756*6777b538SAndroid Build Coastguard Worker      _chromium_code = invoker.chromium_code
757*6777b538SAndroid Build Coastguard Worker    } else {
758*6777b538SAndroid Build Coastguard Worker      # Default based on whether target is in third_party.
759*6777b538SAndroid Build Coastguard Worker      _chromium_code =
760*6777b538SAndroid Build Coastguard Worker          filter_exclude([ get_label_info(":$target_name", "dir") ],
761*6777b538SAndroid Build Coastguard Worker                         [ "*\bthird_party\b*" ]) != []
762*6777b538SAndroid Build Coastguard Worker    }
763*6777b538SAndroid Build Coastguard Worker
764*6777b538SAndroid Build Coastguard Worker    write_build_config(_build_config_target_name) {
765*6777b538SAndroid Build Coastguard Worker      type = "android_resources"
766*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
767*6777b538SAndroid Build Coastguard Worker      resources_zip = _resources_zip
768*6777b538SAndroid Build Coastguard Worker      res_sources_path = _res_sources_path
769*6777b538SAndroid Build Coastguard Worker      chromium_code = _chromium_code
770*6777b538SAndroid Build Coastguard Worker
771*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
772*6777b538SAndroid Build Coastguard Worker                             [
773*6777b538SAndroid Build Coastguard Worker                               "android_manifest",
774*6777b538SAndroid Build Coastguard Worker                               "android_manifest_dep",
775*6777b538SAndroid Build Coastguard Worker                               "custom_package",
776*6777b538SAndroid Build Coastguard Worker                               "mergeable_android_manifests",
777*6777b538SAndroid Build Coastguard Worker                               "resource_overlay",
778*6777b538SAndroid Build Coastguard Worker                               "recursive_resource_deps",
779*6777b538SAndroid Build Coastguard Worker                             ])
780*6777b538SAndroid Build Coastguard Worker
781*6777b538SAndroid Build Coastguard Worker      r_text = _r_text_out_path
782*6777b538SAndroid Build Coastguard Worker      possible_config_deps = _deps + [ _android_sdk_dep ]
783*6777b538SAndroid Build Coastguard Worker
784*6777b538SAndroid Build Coastguard Worker      # Always merge manifests from resources.
785*6777b538SAndroid Build Coastguard Worker      # * Might want to change this at some point for consistency and clarity,
786*6777b538SAndroid Build Coastguard Worker      #   but keeping for backwards-compatibility.
787*6777b538SAndroid Build Coastguard Worker      if (!defined(mergeable_android_manifests) && defined(android_manifest)) {
788*6777b538SAndroid Build Coastguard Worker        mergeable_android_manifests = [ android_manifest ]
789*6777b538SAndroid Build Coastguard Worker      }
790*6777b538SAndroid Build Coastguard Worker    }
791*6777b538SAndroid Build Coastguard Worker
792*6777b538SAndroid Build Coastguard Worker    prepare_resources(target_name) {
793*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
794*6777b538SAndroid Build Coastguard Worker                             [
795*6777b538SAndroid Build Coastguard Worker                               "allow_missing_resources",
796*6777b538SAndroid Build Coastguard Worker                               "public_deps",
797*6777b538SAndroid Build Coastguard Worker                               "strip_drawables",
798*6777b538SAndroid Build Coastguard Worker                               "visibility",
799*6777b538SAndroid Build Coastguard Worker                             ])
800*6777b538SAndroid Build Coastguard Worker      _lib_deps = filter_exclude(filter_include(_deps, java_library_patterns),
801*6777b538SAndroid Build Coastguard Worker                                 java_resource_patterns)
802*6777b538SAndroid Build Coastguard Worker      if (defined(public_deps)) {
803*6777b538SAndroid Build Coastguard Worker        # Since java library targets depend directly on sub-targets rather than
804*6777b538SAndroid Build Coastguard Worker        # top-level targets, public_deps are not properly propagated, at least
805*6777b538SAndroid Build Coastguard Worker        # in terms of the "did you depend on the target that generates your
806*6777b538SAndroid Build Coastguard Worker        # inputs" GN check.
807*6777b538SAndroid Build Coastguard Worker        assert(filter_include(public_deps, java_target_patterns) == [],
808*6777b538SAndroid Build Coastguard Worker               "Java targets should use deps, not public_deps. " +
809*6777b538SAndroid Build Coastguard Worker                   "target=${target_name}, public_deps=${public_deps}")
810*6777b538SAndroid Build Coastguard Worker      }
811*6777b538SAndroid Build Coastguard Worker
812*6777b538SAndroid Build Coastguard Worker      # Depend on non-library deps and on __assetres subtargets of library deps.
813*6777b538SAndroid Build Coastguard Worker      deps = filter_exclude(_deps, _lib_deps) + [ _android_sdk_dep ]
814*6777b538SAndroid Build Coastguard Worker      foreach(_lib_dep, _lib_deps) {
815*6777b538SAndroid Build Coastguard Worker        # Expand //foo/java -> //foo/java:java
816*6777b538SAndroid Build Coastguard Worker        _lib_dep = get_label_info(_lib_dep, "label_no_toolchain")
817*6777b538SAndroid Build Coastguard Worker        deps += [ "${_lib_dep}__assetres" ]
818*6777b538SAndroid Build Coastguard Worker      }
819*6777b538SAndroid Build Coastguard Worker
820*6777b538SAndroid Build Coastguard Worker      res_sources_path = _res_sources_path
821*6777b538SAndroid Build Coastguard Worker      sources = _resource_files
822*6777b538SAndroid Build Coastguard Worker
823*6777b538SAndroid Build Coastguard Worker      resources_zip = _resources_zip
824*6777b538SAndroid Build Coastguard Worker      r_text_out_path = _r_text_out_path
825*6777b538SAndroid Build Coastguard Worker
826*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.r_text_file)) {
827*6777b538SAndroid Build Coastguard Worker        r_text_in_path = invoker.r_text_file
828*6777b538SAndroid Build Coastguard Worker      }
829*6777b538SAndroid Build Coastguard Worker    }
830*6777b538SAndroid Build Coastguard Worker  }
831*6777b538SAndroid Build Coastguard Worker
832*6777b538SAndroid Build Coastguard Worker  # Declare an Android assets target.
833*6777b538SAndroid Build Coastguard Worker  #
834*6777b538SAndroid Build Coastguard Worker  # Defines a set of files to include as assets in a dependent apk.
835*6777b538SAndroid Build Coastguard Worker  #
836*6777b538SAndroid Build Coastguard Worker  # To include these assets in an apk, this target should be listed in
837*6777b538SAndroid Build Coastguard Worker  # the apk's deps, or in the deps of a library target used by an apk.
838*6777b538SAndroid Build Coastguard Worker  #
839*6777b538SAndroid Build Coastguard Worker  # Variables
840*6777b538SAndroid Build Coastguard Worker  #   deps: Specifies the dependencies of this target. Any Android assets
841*6777b538SAndroid Build Coastguard Worker  #     listed in deps will be included by libraries/apks that depend on this
842*6777b538SAndroid Build Coastguard Worker  #     target.
843*6777b538SAndroid Build Coastguard Worker  #   sources: List of files to include as assets.
844*6777b538SAndroid Build Coastguard Worker  #   renaming_sources: List of files to include as assets and be renamed.
845*6777b538SAndroid Build Coastguard Worker  #   renaming_destinations: List of asset paths for files in renaming_sources.
846*6777b538SAndroid Build Coastguard Worker  #   disable_compression: Whether to disable compression for files that are
847*6777b538SAndroid Build Coastguard Worker  #     known to be compressable (default: false).
848*6777b538SAndroid Build Coastguard Worker  #   treat_as_locale_paks: Causes base's BuildConfig.java to consider these
849*6777b538SAndroid Build Coastguard Worker  #     assets to be locale paks.
850*6777b538SAndroid Build Coastguard Worker  #
851*6777b538SAndroid Build Coastguard Worker  # Example:
852*6777b538SAndroid Build Coastguard Worker  # android_assets("content_shell_assets") {
853*6777b538SAndroid Build Coastguard Worker  #   deps = [
854*6777b538SAndroid Build Coastguard Worker  #     ":generates_foo",
855*6777b538SAndroid Build Coastguard Worker  #     ":other_assets",
856*6777b538SAndroid Build Coastguard Worker  #     ]
857*6777b538SAndroid Build Coastguard Worker  #   sources = [
858*6777b538SAndroid Build Coastguard Worker  #     "//path/asset1.png",
859*6777b538SAndroid Build Coastguard Worker  #     "//path/asset2.png",
860*6777b538SAndroid Build Coastguard Worker  #     "$target_gen_dir/foo.dat",
861*6777b538SAndroid Build Coastguard Worker  #   ]
862*6777b538SAndroid Build Coastguard Worker  # }
863*6777b538SAndroid Build Coastguard Worker  #
864*6777b538SAndroid Build Coastguard Worker  # android_assets("overriding_content_shell_assets") {
865*6777b538SAndroid Build Coastguard Worker  #   deps = [ ":content_shell_assets" ]
866*6777b538SAndroid Build Coastguard Worker  #   # Override foo.dat from content_shell_assets.
867*6777b538SAndroid Build Coastguard Worker  #   sources = [ "//custom/foo.dat" ]
868*6777b538SAndroid Build Coastguard Worker  #   renaming_sources = [ "//path/asset2.png" ]
869*6777b538SAndroid Build Coastguard Worker  #   renaming_destinations = [ "renamed/asset2.png" ]
870*6777b538SAndroid Build Coastguard Worker  # }
871*6777b538SAndroid Build Coastguard Worker  template("android_assets") {
872*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
873*6777b538SAndroid Build Coastguard Worker
874*6777b538SAndroid Build Coastguard Worker    _build_config = "$target_gen_dir/$target_name.build_config.json"
875*6777b538SAndroid Build Coastguard Worker    _build_config_target_name = "$target_name$build_config_target_suffix"
876*6777b538SAndroid Build Coastguard Worker
877*6777b538SAndroid Build Coastguard Worker    _sources = []
878*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.sources)) {
879*6777b538SAndroid Build Coastguard Worker      _sources = invoker.sources
880*6777b538SAndroid Build Coastguard Worker    }
881*6777b538SAndroid Build Coastguard Worker    _renaming_sources = []
882*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.renaming_sources)) {
883*6777b538SAndroid Build Coastguard Worker      _renaming_sources = invoker.renaming_sources
884*6777b538SAndroid Build Coastguard Worker    }
885*6777b538SAndroid Build Coastguard Worker    write_build_config(_build_config_target_name) {
886*6777b538SAndroid Build Coastguard Worker      type = "android_assets"
887*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
888*6777b538SAndroid Build Coastguard Worker
889*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
890*6777b538SAndroid Build Coastguard Worker                             [
891*6777b538SAndroid Build Coastguard Worker                               "disable_compression",
892*6777b538SAndroid Build Coastguard Worker                               "treat_as_locale_paks",
893*6777b538SAndroid Build Coastguard Worker                             ])
894*6777b538SAndroid Build Coastguard Worker
895*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
896*6777b538SAndroid Build Coastguard Worker        possible_config_deps = invoker.deps
897*6777b538SAndroid Build Coastguard Worker      }
898*6777b538SAndroid Build Coastguard Worker
899*6777b538SAndroid Build Coastguard Worker      if (_sources != []) {
900*6777b538SAndroid Build Coastguard Worker        asset_sources = _sources
901*6777b538SAndroid Build Coastguard Worker      }
902*6777b538SAndroid Build Coastguard Worker      if (_renaming_sources != []) {
903*6777b538SAndroid Build Coastguard Worker        assert(defined(invoker.renaming_destinations))
904*6777b538SAndroid Build Coastguard Worker        _source_count = 0
905*6777b538SAndroid Build Coastguard Worker        foreach(_, _renaming_sources) {
906*6777b538SAndroid Build Coastguard Worker          _source_count += 1
907*6777b538SAndroid Build Coastguard Worker        }
908*6777b538SAndroid Build Coastguard Worker        _dest_count = 0
909*6777b538SAndroid Build Coastguard Worker        foreach(_, invoker.renaming_destinations) {
910*6777b538SAndroid Build Coastguard Worker          _dest_count += 1
911*6777b538SAndroid Build Coastguard Worker        }
912*6777b538SAndroid Build Coastguard Worker        assert(
913*6777b538SAndroid Build Coastguard Worker            _source_count == _dest_count,
914*6777b538SAndroid Build Coastguard Worker            "android_assets() renaming_sources.length != renaming_destinations.length")
915*6777b538SAndroid Build Coastguard Worker        asset_renaming_sources = _renaming_sources
916*6777b538SAndroid Build Coastguard Worker        asset_renaming_destinations = invoker.renaming_destinations
917*6777b538SAndroid Build Coastguard Worker      }
918*6777b538SAndroid Build Coastguard Worker    }
919*6777b538SAndroid Build Coastguard Worker
920*6777b538SAndroid Build Coastguard Worker    # Use an action in order to mark sources as "inputs" to a GN target so that
921*6777b538SAndroid Build Coastguard Worker    # GN will fail if the appropriate deps do not exist, and so that "gn refs"
922*6777b538SAndroid Build Coastguard Worker    # will know about the sources. We do not add these inputs & deps to the
923*6777b538SAndroid Build Coastguard Worker    # __build_config target because we want building .build_config.json files
924*6777b538SAndroid Build Coastguard Worker    # to be fast (and because write_build_config.py does not need the files to
925*6777b538SAndroid Build Coastguard Worker    # exist).
926*6777b538SAndroid Build Coastguard Worker    _all_sources = _sources + _renaming_sources
927*6777b538SAndroid Build Coastguard Worker    if (_all_sources != []) {
928*6777b538SAndroid Build Coastguard Worker      action(target_name) {
929*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, [ "deps" ])
930*6777b538SAndroid Build Coastguard Worker        public_deps = [ ":$_build_config_target_name" ]
931*6777b538SAndroid Build Coastguard Worker
932*6777b538SAndroid Build Coastguard Worker        script = "//build/android/gyp/validate_inputs.py"
933*6777b538SAndroid Build Coastguard Worker        inputs = _all_sources
934*6777b538SAndroid Build Coastguard Worker        outputs = [ "$target_gen_dir/$target_name.stamp" ]
935*6777b538SAndroid Build Coastguard Worker        args = [
936*6777b538SAndroid Build Coastguard Worker                 "--stamp",
937*6777b538SAndroid Build Coastguard Worker                 rebase_path(outputs[0], root_build_dir),
938*6777b538SAndroid Build Coastguard Worker               ] + rebase_path(_all_sources, root_build_dir)
939*6777b538SAndroid Build Coastguard Worker      }
940*6777b538SAndroid Build Coastguard Worker    } else {
941*6777b538SAndroid Build Coastguard Worker      group(target_name) {
942*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, [ "deps" ])
943*6777b538SAndroid Build Coastguard Worker        public_deps = [ ":$_build_config_target_name" ]
944*6777b538SAndroid Build Coastguard Worker      }
945*6777b538SAndroid Build Coastguard Worker    }
946*6777b538SAndroid Build Coastguard Worker  }
947*6777b538SAndroid Build Coastguard Worker
948*6777b538SAndroid Build Coastguard Worker  # Declare a group() that supports forwarding java dependency information.
949*6777b538SAndroid Build Coastguard Worker  #
950*6777b538SAndroid Build Coastguard Worker  # Example
951*6777b538SAndroid Build Coastguard Worker  #  java_group("conditional_deps") {
952*6777b538SAndroid Build Coastguard Worker  #    if (enable_foo) {
953*6777b538SAndroid Build Coastguard Worker  #      deps = [":foo_java"]
954*6777b538SAndroid Build Coastguard Worker  #    }
955*6777b538SAndroid Build Coastguard Worker  #  }
956*6777b538SAndroid Build Coastguard Worker  template("java_group") {
957*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
958*6777b538SAndroid Build Coastguard Worker    _build_config_vars = [
959*6777b538SAndroid Build Coastguard Worker      "input_jars_paths",
960*6777b538SAndroid Build Coastguard Worker      "preferred_dep",
961*6777b538SAndroid Build Coastguard Worker      "mergeable_android_manifests",
962*6777b538SAndroid Build Coastguard Worker      "proguard_configs",
963*6777b538SAndroid Build Coastguard Worker      "requires_android",
964*6777b538SAndroid Build Coastguard Worker    ]
965*6777b538SAndroid Build Coastguard Worker    _invoker_deps = []
966*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
967*6777b538SAndroid Build Coastguard Worker      _invoker_deps += invoker.deps
968*6777b538SAndroid Build Coastguard Worker    }
969*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.public_deps)) {
970*6777b538SAndroid Build Coastguard Worker      _invoker_deps += invoker.public_deps
971*6777b538SAndroid Build Coastguard Worker    }
972*6777b538SAndroid Build Coastguard Worker    write_build_config("$target_name$build_config_target_suffix") {
973*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, _build_config_vars)
974*6777b538SAndroid Build Coastguard Worker      type = "group"
975*6777b538SAndroid Build Coastguard Worker      build_config = "$target_gen_dir/${invoker.target_name}.build_config.json"
976*6777b538SAndroid Build Coastguard Worker      supports_android = true
977*6777b538SAndroid Build Coastguard Worker      possible_config_deps = _invoker_deps
978*6777b538SAndroid Build Coastguard Worker    }
979*6777b538SAndroid Build Coastguard Worker
980*6777b538SAndroid Build Coastguard Worker    _assetres_deps = filter_include(_invoker_deps, java_resource_patterns)
981*6777b538SAndroid Build Coastguard Worker    _invoker_deps_minus_assetres = filter_exclude(_invoker_deps, _assetres_deps)
982*6777b538SAndroid Build Coastguard Worker    _lib_deps =
983*6777b538SAndroid Build Coastguard Worker        filter_include(_invoker_deps_minus_assetres, java_library_patterns)
984*6777b538SAndroid Build Coastguard Worker    _other_deps = _invoker_deps_minus_assetres - _lib_deps
985*6777b538SAndroid Build Coastguard Worker
986*6777b538SAndroid Build Coastguard Worker    _expanded_lib_deps = []
987*6777b538SAndroid Build Coastguard Worker    foreach(_lib_dep, _lib_deps) {
988*6777b538SAndroid Build Coastguard Worker      _expanded_lib_deps += [ get_label_info(_lib_dep, "label_no_toolchain") ]
989*6777b538SAndroid Build Coastguard Worker    }
990*6777b538SAndroid Build Coastguard Worker    foreach(_group_name,
991*6777b538SAndroid Build Coastguard Worker            [
992*6777b538SAndroid Build Coastguard Worker              "assetres",
993*6777b538SAndroid Build Coastguard Worker              "header",
994*6777b538SAndroid Build Coastguard Worker              "host",
995*6777b538SAndroid Build Coastguard Worker              "validate",
996*6777b538SAndroid Build Coastguard Worker            ]) {
997*6777b538SAndroid Build Coastguard Worker      group("${target_name}__$_group_name") {
998*6777b538SAndroid Build Coastguard Worker        deps = []
999*6777b538SAndroid Build Coastguard Worker        foreach(_lib_dep, _expanded_lib_deps) {
1000*6777b538SAndroid Build Coastguard Worker          deps += [ "${_lib_dep}__${_group_name}" ]
1001*6777b538SAndroid Build Coastguard Worker        }
1002*6777b538SAndroid Build Coastguard Worker        if (_group_name == "assetres") {
1003*6777b538SAndroid Build Coastguard Worker          # _other_deps are necessary when generating mergeable_android_manifests.
1004*6777b538SAndroid Build Coastguard Worker          deps += _assetres_deps + _other_deps
1005*6777b538SAndroid Build Coastguard Worker        } else if (_group_name == "header" && defined(invoker.jar_deps)) {
1006*6777b538SAndroid Build Coastguard Worker          deps += invoker.jar_deps
1007*6777b538SAndroid Build Coastguard Worker        }
1008*6777b538SAndroid Build Coastguard Worker      }
1009*6777b538SAndroid Build Coastguard Worker    }
1010*6777b538SAndroid Build Coastguard Worker
1011*6777b538SAndroid Build Coastguard Worker    group(target_name) {
1012*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
1013*6777b538SAndroid Build Coastguard Worker                             "*",
1014*6777b538SAndroid Build Coastguard Worker                             _build_config_vars + TESTONLY_AND_VISIBILITY)
1015*6777b538SAndroid Build Coastguard Worker      if (!defined(deps)) {
1016*6777b538SAndroid Build Coastguard Worker        deps = []
1017*6777b538SAndroid Build Coastguard Worker      }
1018*6777b538SAndroid Build Coastguard Worker      deps += [ ":$target_name$build_config_target_suffix" ]
1019*6777b538SAndroid Build Coastguard Worker      if (is_cronet_build) {
1020*6777b538SAndroid Build Coastguard Worker        _abs_deps = []
1021*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.deps)) {
1022*6777b538SAndroid Build Coastguard Worker          foreach(dep, invoker.deps) {
1023*6777b538SAndroid Build Coastguard Worker            _abs_deps += [ get_label_info(dep, "label_no_toolchain") ]
1024*6777b538SAndroid Build Coastguard Worker          }
1025*6777b538SAndroid Build Coastguard Worker        }
1026*6777b538SAndroid Build Coastguard Worker        metadata = {
1027*6777b538SAndroid Build Coastguard Worker          all_deps = _abs_deps
1028*6777b538SAndroid Build Coastguard Worker          target_type = [ "java_library" ]
1029*6777b538SAndroid Build Coastguard Worker        }
1030*6777b538SAndroid Build Coastguard Worker      }
1031*6777b538SAndroid Build Coastguard Worker    }
1032*6777b538SAndroid Build Coastguard Worker  }
1033*6777b538SAndroid Build Coastguard Worker
1034*6777b538SAndroid Build Coastguard Worker  # Declare a Java executable target
1035*6777b538SAndroid Build Coastguard Worker  #
1036*6777b538SAndroid Build Coastguard Worker  # Same as java_library, but also creates a wrapper script within
1037*6777b538SAndroid Build Coastguard Worker  # $root_out_dir/bin.
1038*6777b538SAndroid Build Coastguard Worker  #
1039*6777b538SAndroid Build Coastguard Worker  # Supports all variables of java_library(), plus:
1040*6777b538SAndroid Build Coastguard Worker  #   main_class: When specified, a wrapper script is created within
1041*6777b538SAndroid Build Coastguard Worker  #     $root_build_dir/bin to launch the binary with the given class as the
1042*6777b538SAndroid Build Coastguard Worker  #     entrypoint.
1043*6777b538SAndroid Build Coastguard Worker  #   wrapper_script_name: Filename for the wrapper script (default=target_name)
1044*6777b538SAndroid Build Coastguard Worker  #   wrapper_script_args: List of additional arguments for the wrapper script.
1045*6777b538SAndroid Build Coastguard Worker  #
1046*6777b538SAndroid Build Coastguard Worker  # Example
1047*6777b538SAndroid Build Coastguard Worker  #   java_binary("foo") {
1048*6777b538SAndroid Build Coastguard Worker  #     sources = [ "org/chromium/foo/FooMain.java" ]
1049*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":bar_java" ]
1050*6777b538SAndroid Build Coastguard Worker  #     main_class = "org.chromium.foo.FooMain"
1051*6777b538SAndroid Build Coastguard Worker  #   }
1052*6777b538SAndroid Build Coastguard Worker  #
1053*6777b538SAndroid Build Coastguard Worker  #   java_binary("foo") {
1054*6777b538SAndroid Build Coastguard Worker  #     jar_path = "lib/prebuilt.jar"
1055*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":bar_java" ]
1056*6777b538SAndroid Build Coastguard Worker  #     main_class = "org.chromium.foo.FooMain"
1057*6777b538SAndroid Build Coastguard Worker  #   }
1058*6777b538SAndroid Build Coastguard Worker  template("java_binary") {
1059*6777b538SAndroid Build Coastguard Worker    java_library_impl(target_name) {
1060*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
1061*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1062*6777b538SAndroid Build Coastguard Worker      type = "java_binary"
1063*6777b538SAndroid Build Coastguard Worker    }
1064*6777b538SAndroid Build Coastguard Worker  }
1065*6777b538SAndroid Build Coastguard Worker
1066*6777b538SAndroid Build Coastguard Worker  # Declare a Java Annotation Processor.
1067*6777b538SAndroid Build Coastguard Worker  #
1068*6777b538SAndroid Build Coastguard Worker  # Supports all variables of java_library(), plus:
1069*6777b538SAndroid Build Coastguard Worker  #   jar_path: Path to a prebuilt jar. Mutually exclusive with sources &
1070*6777b538SAndroid Build Coastguard Worker  #     srcjar_deps.
1071*6777b538SAndroid Build Coastguard Worker  #   main_class: The fully-quallified class name of the processor's entry
1072*6777b538SAndroid Build Coastguard Worker  #       point.
1073*6777b538SAndroid Build Coastguard Worker  #
1074*6777b538SAndroid Build Coastguard Worker  # Example
1075*6777b538SAndroid Build Coastguard Worker  #   java_annotation_processor("foo_processor") {
1076*6777b538SAndroid Build Coastguard Worker  #     sources = [ "org/chromium/foo/FooProcessor.java" ]
1077*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":bar_java" ]
1078*6777b538SAndroid Build Coastguard Worker  #     main_class = "org.chromium.foo.FooProcessor"
1079*6777b538SAndroid Build Coastguard Worker  #   }
1080*6777b538SAndroid Build Coastguard Worker  #
1081*6777b538SAndroid Build Coastguard Worker  #   java_annotation_processor("foo_processor") {
1082*6777b538SAndroid Build Coastguard Worker  #     jar_path = "lib/prebuilt.jar"
1083*6777b538SAndroid Build Coastguard Worker  #     main_class = "org.chromium.foo.FooMain"
1084*6777b538SAndroid Build Coastguard Worker  #   }
1085*6777b538SAndroid Build Coastguard Worker  #
1086*6777b538SAndroid Build Coastguard Worker  #   java_library("...") {
1087*6777b538SAndroid Build Coastguard Worker  #     annotation_processor_deps = [":foo_processor"]
1088*6777b538SAndroid Build Coastguard Worker  #   }
1089*6777b538SAndroid Build Coastguard Worker  #
1090*6777b538SAndroid Build Coastguard Worker  template("java_annotation_processor") {
1091*6777b538SAndroid Build Coastguard Worker    java_library_impl(target_name) {
1092*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
1093*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1094*6777b538SAndroid Build Coastguard Worker      type = "java_annotation_processor"
1095*6777b538SAndroid Build Coastguard Worker    }
1096*6777b538SAndroid Build Coastguard Worker  }
1097*6777b538SAndroid Build Coastguard Worker
1098*6777b538SAndroid Build Coastguard Worker  # Declare a Robolectric host side test binary.
1099*6777b538SAndroid Build Coastguard Worker  #
1100*6777b538SAndroid Build Coastguard Worker  # This target creates an executable from java code for running as a
1101*6777b538SAndroid Build Coastguard Worker  # Robolectric test suite. The executable will be in the output folder's /bin/
1102*6777b538SAndroid Build Coastguard Worker  # directory.
1103*6777b538SAndroid Build Coastguard Worker  #
1104*6777b538SAndroid Build Coastguard Worker  # Supports all variables of java_binary().
1105*6777b538SAndroid Build Coastguard Worker  #
1106*6777b538SAndroid Build Coastguard Worker  # Example
1107*6777b538SAndroid Build Coastguard Worker  #   robolectric_binary("foo") {
1108*6777b538SAndroid Build Coastguard Worker  #     sources = [ "org/chromium/foo/FooTest.java" ]
1109*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":bar_java" ]
1110*6777b538SAndroid Build Coastguard Worker  #   }
1111*6777b538SAndroid Build Coastguard Worker  template("robolectric_binary") {
1112*6777b538SAndroid Build Coastguard Worker    testonly = true
1113*6777b538SAndroid Build Coastguard Worker
1114*6777b538SAndroid Build Coastguard Worker    _main_class = "org.chromium.testing.local.JunitTestMain"
1115*6777b538SAndroid Build Coastguard Worker    _build_config = "$target_gen_dir/$target_name.build_config.json"
1116*6777b538SAndroid Build Coastguard Worker    _build_config_target_name = "$target_name$build_config_target_suffix"
1117*6777b538SAndroid Build Coastguard Worker    _java_binary_target_name = "${target_name}__java_binary"
1118*6777b538SAndroid Build Coastguard Worker
1119*6777b538SAndroid Build Coastguard Worker    _invoker_deps = [
1120*6777b538SAndroid Build Coastguard Worker      "//testing/android/junit:junit_test_support",
1121*6777b538SAndroid Build Coastguard Worker      "//third_party/android_deps:robolectric_all_java",
1122*6777b538SAndroid Build Coastguard Worker      "//third_party/junit",
1123*6777b538SAndroid Build Coastguard Worker      "//third_party/mockito:mockito_jvm_java",
1124*6777b538SAndroid Build Coastguard Worker    ]
1125*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
1126*6777b538SAndroid Build Coastguard Worker      _invoker_deps += invoker.deps
1127*6777b538SAndroid Build Coastguard Worker    }
1128*6777b538SAndroid Build Coastguard Worker    _non_java_deps = filter_exclude(_invoker_deps, java_target_patterns)
1129*6777b538SAndroid Build Coastguard Worker    _java_assetres_deps = [ ":${_java_binary_target_name}__assetres" ]
1130*6777b538SAndroid Build Coastguard Worker
1131*6777b538SAndroid Build Coastguard Worker    # A package name or a manifest is required to have resources. This is
1132*6777b538SAndroid Build Coastguard Worker    # added so that junit tests that do not care about the package name can
1133*6777b538SAndroid Build Coastguard Worker    # still use resources without having to explicitly set one.
1134*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.package_name)) {
1135*6777b538SAndroid Build Coastguard Worker      _package_name = invoker.package_name
1136*6777b538SAndroid Build Coastguard Worker    } else if (!defined(invoker.android_manifest)) {
1137*6777b538SAndroid Build Coastguard Worker      _package_name = "no.manifest.configured"
1138*6777b538SAndroid Build Coastguard Worker    }
1139*6777b538SAndroid Build Coastguard Worker
1140*6777b538SAndroid Build Coastguard Worker    _merge_manifest_target_name = "${target_name}__merge_manifests"
1141*6777b538SAndroid Build Coastguard Worker    _android_manifest =
1142*6777b538SAndroid Build Coastguard Worker        "$target_gen_dir/$target_name.AndroidManifest.merged.xml"
1143*6777b538SAndroid Build Coastguard Worker
1144*6777b538SAndroid Build Coastguard Worker    merge_manifests(_merge_manifest_target_name) {
1145*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.android_manifest)) {
1146*6777b538SAndroid Build Coastguard Worker        input_manifest = invoker.android_manifest
1147*6777b538SAndroid Build Coastguard Worker      } else {
1148*6777b538SAndroid Build Coastguard Worker        input_manifest = "//build/android/AndroidManifest.xml"
1149*6777b538SAndroid Build Coastguard Worker      }
1150*6777b538SAndroid Build Coastguard Worker
1151*6777b538SAndroid Build Coastguard Worker      if (defined(_package_name)) {
1152*6777b538SAndroid Build Coastguard Worker        manifest_package = _package_name
1153*6777b538SAndroid Build Coastguard Worker      }
1154*6777b538SAndroid Build Coastguard Worker      output_manifest = _android_manifest
1155*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
1156*6777b538SAndroid Build Coastguard Worker      min_sdk_version = default_min_sdk_version
1157*6777b538SAndroid Build Coastguard Worker      target_sdk_version = android_sdk_version
1158*6777b538SAndroid Build Coastguard Worker      deps = _non_java_deps + _java_assetres_deps +
1159*6777b538SAndroid Build Coastguard Worker             [ ":$_build_config_target_name" ]
1160*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.android_manifest_dep)) {
1161*6777b538SAndroid Build Coastguard Worker        deps += [ invoker.android_manifest_dep ]
1162*6777b538SAndroid Build Coastguard Worker      }
1163*6777b538SAndroid Build Coastguard Worker    }
1164*6777b538SAndroid Build Coastguard Worker
1165*6777b538SAndroid Build Coastguard Worker    _resource_arsc_output = "${target_out_dir}/${target_name}.ap_"
1166*6777b538SAndroid Build Coastguard Worker    _compile_resources_target_name = "${target_name}__compile_resources"
1167*6777b538SAndroid Build Coastguard Worker    compile_resources(_compile_resources_target_name) {
1168*6777b538SAndroid Build Coastguard Worker      deps = _non_java_deps + _java_assetres_deps +
1169*6777b538SAndroid Build Coastguard Worker             [ ":$_merge_manifest_target_name" ]
1170*6777b538SAndroid Build Coastguard Worker      build_config_dep = ":$_build_config_target_name"
1171*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
1172*6777b538SAndroid Build Coastguard Worker      if (defined(_package_name)) {
1173*6777b538SAndroid Build Coastguard Worker        rename_manifest_package = _package_name
1174*6777b538SAndroid Build Coastguard Worker      }
1175*6777b538SAndroid Build Coastguard Worker      android_manifest = _android_manifest
1176*6777b538SAndroid Build Coastguard Worker      arsc_output = _resource_arsc_output
1177*6777b538SAndroid Build Coastguard Worker      min_sdk_version = default_min_sdk_version
1178*6777b538SAndroid Build Coastguard Worker      target_sdk_version = android_sdk_version
1179*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "override_target_sdk" ])
1180*6777b538SAndroid Build Coastguard Worker    }
1181*6777b538SAndroid Build Coastguard Worker
1182*6777b538SAndroid Build Coastguard Worker    # apkbuilder step needed only to add android assets to the .ap_ file.
1183*6777b538SAndroid Build Coastguard Worker    _apkbuilder_output = "${target_out_dir}/${target_name}.robo.ap_"
1184*6777b538SAndroid Build Coastguard Worker    _apkbuilder_target_name = "${target_name}__apkbuilder"
1185*6777b538SAndroid Build Coastguard Worker    package_apk("$_apkbuilder_target_name") {
1186*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
1187*6777b538SAndroid Build Coastguard Worker      min_sdk_version = default_min_sdk_version
1188*6777b538SAndroid Build Coastguard Worker      deps = _java_assetres_deps + [
1189*6777b538SAndroid Build Coastguard Worker               ":$_build_config_target_name",
1190*6777b538SAndroid Build Coastguard Worker               ":$_compile_resources_target_name",
1191*6777b538SAndroid Build Coastguard Worker             ]
1192*6777b538SAndroid Build Coastguard Worker
1193*6777b538SAndroid Build Coastguard Worker      is_robolectric_apk = true
1194*6777b538SAndroid Build Coastguard Worker      packaged_resources_path = _resource_arsc_output
1195*6777b538SAndroid Build Coastguard Worker      output_apk_path = _apkbuilder_output
1196*6777b538SAndroid Build Coastguard Worker    }
1197*6777b538SAndroid Build Coastguard Worker
1198*6777b538SAndroid Build Coastguard Worker    # Some may want to disable this to remove dependency on //base
1199*6777b538SAndroid Build Coastguard Worker    # (JNI generator is in //base).
1200*6777b538SAndroid Build Coastguard Worker    _generate_final_jni =
1201*6777b538SAndroid Build Coastguard Worker        !defined(invoker.generate_final_jni) || invoker.generate_final_jni
1202*6777b538SAndroid Build Coastguard Worker    if (_generate_final_jni) {
1203*6777b538SAndroid Build Coastguard Worker      _jni_srcjar_deps = []
1204*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.shared_libraries)) {
1205*6777b538SAndroid Build Coastguard Worker        foreach(_dep, invoker.shared_libraries) {
1206*6777b538SAndroid Build Coastguard Worker          _dep_no_toolchain = get_label_info(_dep, "label_no_toolchain")
1207*6777b538SAndroid Build Coastguard Worker          _dep_toolchain = get_label_info(_dep, "toolchain")
1208*6777b538SAndroid Build Coastguard Worker          assert(
1209*6777b538SAndroid Build Coastguard Worker              _dep_toolchain == robolectric_toolchain,
1210*6777b538SAndroid Build Coastguard Worker              "$target_name has shared_libraries with incorrect toolchain. " +
1211*6777b538SAndroid Build Coastguard Worker                  "Should contain (\$robolectric_toolchain) suffix: $_dep")
1212*6777b538SAndroid Build Coastguard Worker          _jni_srcjar_deps +=
1213*6777b538SAndroid Build Coastguard Worker              [ "${_dep_no_toolchain}__jni_registration($default_toolchain)" ]
1214*6777b538SAndroid Build Coastguard Worker        }
1215*6777b538SAndroid Build Coastguard Worker
1216*6777b538SAndroid Build Coastguard Worker        # Write shared library output files of all dependencies to a file. Those
1217*6777b538SAndroid Build Coastguard Worker        # will be the shared libraries packaged into the APK.
1218*6777b538SAndroid Build Coastguard Worker        _shared_library_list_file = "$target_gen_dir/$target_name.native_libs"
1219*6777b538SAndroid Build Coastguard Worker        generated_file("${target_name}__shared_library_list") {
1220*6777b538SAndroid Build Coastguard Worker          deps = invoker.shared_libraries
1221*6777b538SAndroid Build Coastguard Worker          outputs = [ _shared_library_list_file ]
1222*6777b538SAndroid Build Coastguard Worker          data_keys = [ "shared_libraries" ]
1223*6777b538SAndroid Build Coastguard Worker          walk_keys = [ "shared_libraries_barrier" ]
1224*6777b538SAndroid Build Coastguard Worker          rebase = root_build_dir
1225*6777b538SAndroid Build Coastguard Worker        }
1226*6777b538SAndroid Build Coastguard Worker      } else {
1227*6777b538SAndroid Build Coastguard Worker        # Needed for generate_jni_registration. Keeping this import guarded so
1228*6777b538SAndroid Build Coastguard Worker        # that projects who import //build but not //third_party/jni_zero don't
1229*6777b538SAndroid Build Coastguard Worker        # have issues.
1230*6777b538SAndroid Build Coastguard Worker        import("//third_party/jni_zero/jni_zero.gni")
1231*6777b538SAndroid Build Coastguard Worker        _jni_srcjar_target_name = "${target_name}__final_jni"
1232*6777b538SAndroid Build Coastguard Worker        generate_jni_registration(_jni_srcjar_target_name) {
1233*6777b538SAndroid Build Coastguard Worker          enable_native_mocks = true
1234*6777b538SAndroid Build Coastguard Worker          require_native_mocks = true
1235*6777b538SAndroid Build Coastguard Worker          java_targets = [ ":$_java_binary_target_name" ]
1236*6777b538SAndroid Build Coastguard Worker          add_stubs_for_missing_jni = true
1237*6777b538SAndroid Build Coastguard Worker        }
1238*6777b538SAndroid Build Coastguard Worker        _jni_srcjar_deps = [ ":$_jni_srcjar_target_name" ]
1239*6777b538SAndroid Build Coastguard Worker      }
1240*6777b538SAndroid Build Coastguard Worker      _native_libraries_target_name = "${target_name}__native_libraries"
1241*6777b538SAndroid Build Coastguard Worker      write_native_libraries_java(_native_libraries_target_name) {
1242*6777b538SAndroid Build Coastguard Worker        enable_chromium_linker = false
1243*6777b538SAndroid Build Coastguard Worker        use_final_fields = true
1244*6777b538SAndroid Build Coastguard Worker        if (defined(_shared_library_list_file)) {
1245*6777b538SAndroid Build Coastguard Worker          native_libraries_list_file = _shared_library_list_file
1246*6777b538SAndroid Build Coastguard Worker        }
1247*6777b538SAndroid Build Coastguard Worker      }
1248*6777b538SAndroid Build Coastguard Worker    }
1249*6777b538SAndroid Build Coastguard Worker
1250*6777b538SAndroid Build Coastguard Worker    java_library_impl(_java_binary_target_name) {
1251*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
1252*6777b538SAndroid Build Coastguard Worker                             "*",
1253*6777b538SAndroid Build Coastguard Worker                             TESTONLY_AND_VISIBILITY + [
1254*6777b538SAndroid Build Coastguard Worker                                   "deps",
1255*6777b538SAndroid Build Coastguard Worker                                   "extra_args",
1256*6777b538SAndroid Build Coastguard Worker                                   "shared_libraries",
1257*6777b538SAndroid Build Coastguard Worker                                 ])
1258*6777b538SAndroid Build Coastguard Worker      type = "robolectric_binary"
1259*6777b538SAndroid Build Coastguard Worker      main_target_name = invoker.target_name
1260*6777b538SAndroid Build Coastguard Worker
1261*6777b538SAndroid Build Coastguard Worker      deps = _invoker_deps
1262*6777b538SAndroid Build Coastguard Worker      testonly = true
1263*6777b538SAndroid Build Coastguard Worker      main_class = _main_class
1264*6777b538SAndroid Build Coastguard Worker      wrapper_script_name = "helper/$main_target_name"
1265*6777b538SAndroid Build Coastguard Worker
1266*6777b538SAndroid Build Coastguard Worker      # As of April 2021, adding -XX:TieredStopAtLevel=1 does not affect the
1267*6777b538SAndroid Build Coastguard Worker      # wall time of a single robolectric shard, but does reduce the CPU time by
1268*6777b538SAndroid Build Coastguard Worker      # 66%, which makes sharding more effective.
1269*6777b538SAndroid Build Coastguard Worker      tiered_stop_at_level_one = true
1270*6777b538SAndroid Build Coastguard Worker
1271*6777b538SAndroid Build Coastguard Worker      is_robolectric = true
1272*6777b538SAndroid Build Coastguard Worker      include_android_sdk = true
1273*6777b538SAndroid Build Coastguard Worker      alternative_android_sdk_dep =
1274*6777b538SAndroid Build Coastguard Worker          "//third_party/robolectric:robolectric_test_sdk_java"
1275*6777b538SAndroid Build Coastguard Worker
1276*6777b538SAndroid Build Coastguard Worker      if (!defined(srcjar_deps)) {
1277*6777b538SAndroid Build Coastguard Worker        srcjar_deps = []
1278*6777b538SAndroid Build Coastguard Worker      }
1279*6777b538SAndroid Build Coastguard Worker      srcjar_deps += [
1280*6777b538SAndroid Build Coastguard Worker        ":$_compile_resources_target_name",
1281*6777b538SAndroid Build Coastguard Worker        "//build/android:build_config_for_testing_gen",
1282*6777b538SAndroid Build Coastguard Worker      ]
1283*6777b538SAndroid Build Coastguard Worker      if (_generate_final_jni) {
1284*6777b538SAndroid Build Coastguard Worker        srcjar_deps += [ ":$_native_libraries_target_name" ] + _jni_srcjar_deps
1285*6777b538SAndroid Build Coastguard Worker      }
1286*6777b538SAndroid Build Coastguard Worker    }
1287*6777b538SAndroid Build Coastguard Worker
1288*6777b538SAndroid Build Coastguard Worker    test_runner_script(target_name) {
1289*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
1290*6777b538SAndroid Build Coastguard Worker                             [
1291*6777b538SAndroid Build Coastguard Worker                               "assert_no_deps",
1292*6777b538SAndroid Build Coastguard Worker                               "extra_args",
1293*6777b538SAndroid Build Coastguard Worker                               "visibility",
1294*6777b538SAndroid Build Coastguard Worker                             ])
1295*6777b538SAndroid Build Coastguard Worker      test_name = invoker.target_name
1296*6777b538SAndroid Build Coastguard Worker      test_suite = invoker.target_name
1297*6777b538SAndroid Build Coastguard Worker      test_type = "junit"
1298*6777b538SAndroid Build Coastguard Worker      ignore_all_data_deps = true
1299*6777b538SAndroid Build Coastguard Worker      resource_apk = _apkbuilder_output
1300*6777b538SAndroid Build Coastguard Worker      deps = [
1301*6777b538SAndroid Build Coastguard Worker        ":$_apkbuilder_target_name",
1302*6777b538SAndroid Build Coastguard Worker        ":$_build_config_target_name",
1303*6777b538SAndroid Build Coastguard Worker        ":${_java_binary_target_name}__host",
1304*6777b538SAndroid Build Coastguard Worker        ":${_java_binary_target_name}__java_binary_script",
1305*6777b538SAndroid Build Coastguard Worker        ":${_java_binary_target_name}__validate",
1306*6777b538SAndroid Build Coastguard Worker        "//third_party/robolectric:robolectric_runtime_jars",
1307*6777b538SAndroid Build Coastguard Worker      ]
1308*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.shared_libraries)) {
1309*6777b538SAndroid Build Coastguard Worker        data_deps = invoker.shared_libraries
1310*6777b538SAndroid Build Coastguard Worker      }
1311*6777b538SAndroid Build Coastguard Worker
1312*6777b538SAndroid Build Coastguard Worker      # Add non-libary deps, since the __host target does not depend on them.
1313*6777b538SAndroid Build Coastguard Worker      deps += filter_exclude(_invoker_deps, java_library_patterns)
1314*6777b538SAndroid Build Coastguard Worker
1315*6777b538SAndroid Build Coastguard Worker      metadata = {
1316*6777b538SAndroid Build Coastguard Worker        # Allows metadata collection via apk targets that traverse only java deps.
1317*6777b538SAndroid Build Coastguard Worker        java_walk_keys = [ ":${_java_binary_target_name}__host" ]
1318*6777b538SAndroid Build Coastguard Worker      }
1319*6777b538SAndroid Build Coastguard Worker    }
1320*6777b538SAndroid Build Coastguard Worker  }
1321*6777b538SAndroid Build Coastguard Worker
1322*6777b538SAndroid Build Coastguard Worker  # Declare a java library target
1323*6777b538SAndroid Build Coastguard Worker  #
1324*6777b538SAndroid Build Coastguard Worker  # Variables
1325*6777b538SAndroid Build Coastguard Worker  #   deps: Specifies the dependencies of this target. Java targets in this list
1326*6777b538SAndroid Build Coastguard Worker  #     will be added to the javac classpath.
1327*6777b538SAndroid Build Coastguard Worker  #   public_deps: Dependencies that this target exposes as part of its public API.
1328*6777b538SAndroid Build Coastguard Worker  #     public_deps do not need to be listed in both the 'deps' and 'public_deps' lists.
1329*6777b538SAndroid Build Coastguard Worker  #   annotation_processor_deps: List of java_annotation_processor targets to
1330*6777b538SAndroid Build Coastguard Worker  #     use when compiling.
1331*6777b538SAndroid Build Coastguard Worker  #
1332*6777b538SAndroid Build Coastguard Worker  #   jar_path: Path to a prebuilt jar. Mutually exclusive with sources &
1333*6777b538SAndroid Build Coastguard Worker  #     srcjar_deps.
1334*6777b538SAndroid Build Coastguard Worker  #   sources: List of .java files included in this library.
1335*6777b538SAndroid Build Coastguard Worker  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars
1336*6777b538SAndroid Build Coastguard Worker  #     will be added to sources and be included in this library.
1337*6777b538SAndroid Build Coastguard Worker  #
1338*6777b538SAndroid Build Coastguard Worker  #   input_jars_paths: A list of paths to the jars that should be included
1339*6777b538SAndroid Build Coastguard Worker  #     in the compile-time classpath. These are in addition to library .jars
1340*6777b538SAndroid Build Coastguard Worker  #     that appear in deps.
1341*6777b538SAndroid Build Coastguard Worker  #
1342*6777b538SAndroid Build Coastguard Worker  #   chromium_code: If true, extra analysis warning/errors will be enabled.
1343*6777b538SAndroid Build Coastguard Worker  #   enable_errorprone: If true, enables the errorprone compiler.
1344*6777b538SAndroid Build Coastguard Worker  #   skip_build_server: If true, avoids sending tasks to the build server.
1345*6777b538SAndroid Build Coastguard Worker  #
1346*6777b538SAndroid Build Coastguard Worker  #   jar_excluded_patterns: List of patterns of .class files to exclude.
1347*6777b538SAndroid Build Coastguard Worker  #   jar_included_patterns: List of patterns of .class files to include.
1348*6777b538SAndroid Build Coastguard Worker  #     When omitted, all classes not matched by jar_excluded_patterns are
1349*6777b538SAndroid Build Coastguard Worker  #     included. When specified, all non-matching .class files are stripped.
1350*6777b538SAndroid Build Coastguard Worker  #
1351*6777b538SAndroid Build Coastguard Worker  #   low_classpath_priority: Indicates that the library should be placed at the
1352*6777b538SAndroid Build Coastguard Worker  #     end of the classpath. The default classpath order has libraries ordered
1353*6777b538SAndroid Build Coastguard Worker  #     before the libraries that they depend on. 'low_classpath_priority' is
1354*6777b538SAndroid Build Coastguard Worker  #     useful when one java_library() overrides another via
1355*6777b538SAndroid Build Coastguard Worker  #     'jar_excluded_patterns' and the overriding library does not depend on
1356*6777b538SAndroid Build Coastguard Worker  #     the overridee.
1357*6777b538SAndroid Build Coastguard Worker  #
1358*6777b538SAndroid Build Coastguard Worker  #   output_name: File name for the output .jar (not including extension).
1359*6777b538SAndroid Build Coastguard Worker  #     Defaults to the input .jar file name.
1360*6777b538SAndroid Build Coastguard Worker  #
1361*6777b538SAndroid Build Coastguard Worker  #   proguard_configs: List of proguard configs to use in final apk step for
1362*6777b538SAndroid Build Coastguard Worker  #     any apk that depends on this library.
1363*6777b538SAndroid Build Coastguard Worker  #
1364*6777b538SAndroid Build Coastguard Worker  #   supports_android: If true, Android targets (android_library, android_apk)
1365*6777b538SAndroid Build Coastguard Worker  #     may depend on this target. Note: if true, this target must only use the
1366*6777b538SAndroid Build Coastguard Worker  #     subset of Java available on Android.
1367*6777b538SAndroid Build Coastguard Worker  #   bypass_platform_checks: Disables checks about cross-platform (Java/Android)
1368*6777b538SAndroid Build Coastguard Worker  #     dependencies for this target. This will allow depending on an
1369*6777b538SAndroid Build Coastguard Worker  #     android_library target, for example.
1370*6777b538SAndroid Build Coastguard Worker  #   enable_desugar: If false, disables desugaring of lambdas, etc. Use this
1371*6777b538SAndroid Build Coastguard Worker  #     only when you are sure the library does not require desugaring. E.g.
1372*6777b538SAndroid Build Coastguard Worker  #     to hide warnings shown from desugaring.
1373*6777b538SAndroid Build Coastguard Worker  #
1374*6777b538SAndroid Build Coastguard Worker  #   additional_jar_files: Use to package additional files (Java resources)
1375*6777b538SAndroid Build Coastguard Worker  #     into the output jar. Pass a list of length-2 lists with format:
1376*6777b538SAndroid Build Coastguard Worker  #         [ [ path_to_file, path_to_put_in_jar ] ]
1377*6777b538SAndroid Build Coastguard Worker  #
1378*6777b538SAndroid Build Coastguard Worker  #   javac_args: Additional arguments to pass to javac.
1379*6777b538SAndroid Build Coastguard Worker  #   errorprone_args: Additional arguments to pass to errorprone.
1380*6777b538SAndroid Build Coastguard Worker  #
1381*6777b538SAndroid Build Coastguard Worker  #   data_deps, testonly
1382*6777b538SAndroid Build Coastguard Worker  #
1383*6777b538SAndroid Build Coastguard Worker  # Example
1384*6777b538SAndroid Build Coastguard Worker  #   java_library("foo_java") {
1385*6777b538SAndroid Build Coastguard Worker  #     sources = [
1386*6777b538SAndroid Build Coastguard Worker  #       "org/chromium/foo/Foo.java",
1387*6777b538SAndroid Build Coastguard Worker  #       "org/chromium/foo/FooInterface.java",
1388*6777b538SAndroid Build Coastguard Worker  #       "org/chromium/foo/FooService.java",
1389*6777b538SAndroid Build Coastguard Worker  #     ]
1390*6777b538SAndroid Build Coastguard Worker  #     deps = [
1391*6777b538SAndroid Build Coastguard Worker  #       ":bar_java"
1392*6777b538SAndroid Build Coastguard Worker  #     ]
1393*6777b538SAndroid Build Coastguard Worker  #     srcjar_deps = [
1394*6777b538SAndroid Build Coastguard Worker  #       ":foo_generated_enum"
1395*6777b538SAndroid Build Coastguard Worker  #     ]
1396*6777b538SAndroid Build Coastguard Worker  #     jar_excluded_patterns = [
1397*6777b538SAndroid Build Coastguard Worker  #       "*/FooService.class", "org/chromium/FooService\$*.class"
1398*6777b538SAndroid Build Coastguard Worker  #     ]
1399*6777b538SAndroid Build Coastguard Worker  #   }
1400*6777b538SAndroid Build Coastguard Worker  template("java_library") {
1401*6777b538SAndroid Build Coastguard Worker    java_library_impl(target_name) {
1402*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
1403*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1404*6777b538SAndroid Build Coastguard Worker      type = "java_library"
1405*6777b538SAndroid Build Coastguard Worker    }
1406*6777b538SAndroid Build Coastguard Worker  }
1407*6777b538SAndroid Build Coastguard Worker
1408*6777b538SAndroid Build Coastguard Worker  # Declare a java library target for a prebuilt jar
1409*6777b538SAndroid Build Coastguard Worker  #
1410*6777b538SAndroid Build Coastguard Worker  # Supports all variables of java_library().
1411*6777b538SAndroid Build Coastguard Worker  #
1412*6777b538SAndroid Build Coastguard Worker  # Example
1413*6777b538SAndroid Build Coastguard Worker  #   java_prebuilt("foo_java") {
1414*6777b538SAndroid Build Coastguard Worker  #     jar_path = "foo.jar"
1415*6777b538SAndroid Build Coastguard Worker  #     deps = [
1416*6777b538SAndroid Build Coastguard Worker  #       ":foo_resources",
1417*6777b538SAndroid Build Coastguard Worker  #       ":bar_java"
1418*6777b538SAndroid Build Coastguard Worker  #     ]
1419*6777b538SAndroid Build Coastguard Worker  #   }
1420*6777b538SAndroid Build Coastguard Worker  template("java_prebuilt") {
1421*6777b538SAndroid Build Coastguard Worker    java_library_impl(target_name) {
1422*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
1423*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1424*6777b538SAndroid Build Coastguard Worker      type = "java_library"
1425*6777b538SAndroid Build Coastguard Worker    }
1426*6777b538SAndroid Build Coastguard Worker  }
1427*6777b538SAndroid Build Coastguard Worker
1428*6777b538SAndroid Build Coastguard Worker  # Combines all dependent .jar files into a single .jar file.
1429*6777b538SAndroid Build Coastguard Worker  #
1430*6777b538SAndroid Build Coastguard Worker  # Variables:
1431*6777b538SAndroid Build Coastguard Worker  #   output: Path to the output jar.
1432*6777b538SAndroid Build Coastguard Worker  #   use_interface_jars: Use all dependent interface .jars rather than
1433*6777b538SAndroid Build Coastguard Worker  #     implementation .jars.
1434*6777b538SAndroid Build Coastguard Worker  #   use_unprocessed_jars: Use unprocessed / undesugared .jars.
1435*6777b538SAndroid Build Coastguard Worker  #   direct_deps_only: Do not recurse on deps.
1436*6777b538SAndroid Build Coastguard Worker  #   jar_excluded_patterns (optional)
1437*6777b538SAndroid Build Coastguard Worker  #     List of globs for paths to exclude.
1438*6777b538SAndroid Build Coastguard Worker  #
1439*6777b538SAndroid Build Coastguard Worker  # Example
1440*6777b538SAndroid Build Coastguard Worker  #   dist_jar("lib_fatjar") {
1441*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":my_java_lib" ]
1442*6777b538SAndroid Build Coastguard Worker  #     output = "$root_build_dir/MyLibrary.jar"
1443*6777b538SAndroid Build Coastguard Worker  #   }
1444*6777b538SAndroid Build Coastguard Worker  template("dist_jar") {
1445*6777b538SAndroid Build Coastguard Worker    # TODO(crbug.com/1042017): Remove.
1446*6777b538SAndroid Build Coastguard Worker    not_needed(invoker, [ "no_build_hooks" ])
1447*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1448*6777b538SAndroid Build Coastguard Worker    _use_interface_jars =
1449*6777b538SAndroid Build Coastguard Worker        defined(invoker.use_interface_jars) && invoker.use_interface_jars
1450*6777b538SAndroid Build Coastguard Worker    _use_unprocessed_jars =
1451*6777b538SAndroid Build Coastguard Worker        defined(invoker.use_unprocessed_jars) && invoker.use_unprocessed_jars
1452*6777b538SAndroid Build Coastguard Worker    _direct_deps_only =
1453*6777b538SAndroid Build Coastguard Worker        defined(invoker.direct_deps_only) && invoker.direct_deps_only
1454*6777b538SAndroid Build Coastguard Worker    assert(!(_use_unprocessed_jars && _use_interface_jars),
1455*6777b538SAndroid Build Coastguard Worker           "Cannot set both use_interface_jars and use_unprocessed_jars")
1456*6777b538SAndroid Build Coastguard Worker
1457*6777b538SAndroid Build Coastguard Worker    _jar_target_name = target_name
1458*6777b538SAndroid Build Coastguard Worker
1459*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.build_config)) {
1460*6777b538SAndroid Build Coastguard Worker      _build_config = invoker.build_config
1461*6777b538SAndroid Build Coastguard Worker      _build_config_dep = invoker.build_config_dep
1462*6777b538SAndroid Build Coastguard Worker    } else {
1463*6777b538SAndroid Build Coastguard Worker      _build_config = "$target_gen_dir/$target_name.build_config.json"
1464*6777b538SAndroid Build Coastguard Worker      _build_config_target_name = "$target_name$build_config_target_suffix"
1465*6777b538SAndroid Build Coastguard Worker      _build_config_dep = ":$_build_config_target_name"
1466*6777b538SAndroid Build Coastguard Worker
1467*6777b538SAndroid Build Coastguard Worker      write_build_config(_build_config_target_name) {
1468*6777b538SAndroid Build Coastguard Worker        type = "dist_jar"
1469*6777b538SAndroid Build Coastguard Worker        supports_android =
1470*6777b538SAndroid Build Coastguard Worker            !defined(invoker.supports_android) || invoker.supports_android
1471*6777b538SAndroid Build Coastguard Worker        requires_android =
1472*6777b538SAndroid Build Coastguard Worker            defined(invoker.requires_android) && invoker.requires_android
1473*6777b538SAndroid Build Coastguard Worker        possible_config_deps = invoker.deps
1474*6777b538SAndroid Build Coastguard Worker        build_config = _build_config
1475*6777b538SAndroid Build Coastguard Worker      }
1476*6777b538SAndroid Build Coastguard Worker    }
1477*6777b538SAndroid Build Coastguard Worker
1478*6777b538SAndroid Build Coastguard Worker    _rebased_build_config = rebase_path(_build_config, root_build_dir)
1479*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(_jar_target_name) {
1480*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "data" ])
1481*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/zip.py"
1482*6777b538SAndroid Build Coastguard Worker      depfile = "$target_gen_dir/$target_name.d"
1483*6777b538SAndroid Build Coastguard Worker      deps = [ _build_config_dep ]
1484*6777b538SAndroid Build Coastguard Worker
1485*6777b538SAndroid Build Coastguard Worker      if (_use_interface_jars) {
1486*6777b538SAndroid Build Coastguard Worker        _lib_deps =
1487*6777b538SAndroid Build Coastguard Worker            filter_exclude(filter_include(invoker.deps, java_library_patterns),
1488*6777b538SAndroid Build Coastguard Worker                           java_resource_patterns)
1489*6777b538SAndroid Build Coastguard Worker        _other_deps = filter_exclude(invoker.deps, _lib_deps)
1490*6777b538SAndroid Build Coastguard Worker        foreach(_lib_dep, _lib_deps) {
1491*6777b538SAndroid Build Coastguard Worker          # Expand //foo/java -> //foo/java:java
1492*6777b538SAndroid Build Coastguard Worker          _lib_dep = get_label_info(_lib_dep, "label_no_toolchain")
1493*6777b538SAndroid Build Coastguard Worker          deps += [ "${_lib_dep}__header" ]
1494*6777b538SAndroid Build Coastguard Worker        }
1495*6777b538SAndroid Build Coastguard Worker        deps += _other_deps
1496*6777b538SAndroid Build Coastguard Worker      } else {
1497*6777b538SAndroid Build Coastguard Worker        deps += invoker.deps
1498*6777b538SAndroid Build Coastguard Worker      }
1499*6777b538SAndroid Build Coastguard Worker
1500*6777b538SAndroid Build Coastguard Worker      inputs = [ _build_config ]
1501*6777b538SAndroid Build Coastguard Worker
1502*6777b538SAndroid Build Coastguard Worker      outputs = [ invoker.output ]
1503*6777b538SAndroid Build Coastguard Worker
1504*6777b538SAndroid Build Coastguard Worker      args = [
1505*6777b538SAndroid Build Coastguard Worker        "--depfile",
1506*6777b538SAndroid Build Coastguard Worker        rebase_path(depfile, root_build_dir),
1507*6777b538SAndroid Build Coastguard Worker        "--output",
1508*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.output, root_build_dir),
1509*6777b538SAndroid Build Coastguard Worker        "--no-compress",
1510*6777b538SAndroid Build Coastguard Worker      ]
1511*6777b538SAndroid Build Coastguard Worker
1512*6777b538SAndroid Build Coastguard Worker      if (_direct_deps_only) {
1513*6777b538SAndroid Build Coastguard Worker        if (_use_interface_jars) {
1514*6777b538SAndroid Build Coastguard Worker          args += [ "--input-zips=@FileArg($_rebased_build_config:javac:interface_classpath)" ]
1515*6777b538SAndroid Build Coastguard Worker        } else if (_use_unprocessed_jars) {
1516*6777b538SAndroid Build Coastguard Worker          args += [
1517*6777b538SAndroid Build Coastguard Worker            "--input-zips=@FileArg($_rebased_build_config:javac:classpath)",
1518*6777b538SAndroid Build Coastguard Worker          ]
1519*6777b538SAndroid Build Coastguard Worker        } else {
1520*6777b538SAndroid Build Coastguard Worker          assert(
1521*6777b538SAndroid Build Coastguard Worker              false,
1522*6777b538SAndroid Build Coastguard Worker              "direct_deps_only does not work without use_interface_jars or use_unprocessed_jars")
1523*6777b538SAndroid Build Coastguard Worker        }
1524*6777b538SAndroid Build Coastguard Worker      } else {
1525*6777b538SAndroid Build Coastguard Worker        if (_use_interface_jars) {
1526*6777b538SAndroid Build Coastguard Worker          args += [ "--input-zips=@FileArg($_rebased_build_config:dist_jar:all_interface_jars)" ]
1527*6777b538SAndroid Build Coastguard Worker        } else if (_use_unprocessed_jars) {
1528*6777b538SAndroid Build Coastguard Worker          args += [ "--input-zips=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)" ]
1529*6777b538SAndroid Build Coastguard Worker        } else {
1530*6777b538SAndroid Build Coastguard Worker          args += [ "--input-zips=@FileArg($_rebased_build_config:deps_info:device_classpath)" ]
1531*6777b538SAndroid Build Coastguard Worker        }
1532*6777b538SAndroid Build Coastguard Worker      }
1533*6777b538SAndroid Build Coastguard Worker
1534*6777b538SAndroid Build Coastguard Worker      _excludes = []
1535*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.jar_excluded_patterns)) {
1536*6777b538SAndroid Build Coastguard Worker        _excludes += invoker.jar_excluded_patterns
1537*6777b538SAndroid Build Coastguard Worker      }
1538*6777b538SAndroid Build Coastguard Worker      if (_use_interface_jars) {
1539*6777b538SAndroid Build Coastguard Worker        # Turbine adds files like: META-INF/TRANSITIVE/.../Foo.class
1540*6777b538SAndroid Build Coastguard Worker        # These confuse proguard: https://crbug.com/1081443
1541*6777b538SAndroid Build Coastguard Worker        _excludes += [ "META-INF/*" ]
1542*6777b538SAndroid Build Coastguard Worker      } else {
1543*6777b538SAndroid Build Coastguard Worker        # Manifest files will never be correct when merging jars.
1544*6777b538SAndroid Build Coastguard Worker        _excludes += [ "META-INF/*.MF" ]
1545*6777b538SAndroid Build Coastguard Worker      }
1546*6777b538SAndroid Build Coastguard Worker      if (_excludes != []) {
1547*6777b538SAndroid Build Coastguard Worker        args += [ "--input-zips-excluded-globs=$_excludes" ]
1548*6777b538SAndroid Build Coastguard Worker      }
1549*6777b538SAndroid Build Coastguard Worker    }
1550*6777b538SAndroid Build Coastguard Worker  }
1551*6777b538SAndroid Build Coastguard Worker
1552*6777b538SAndroid Build Coastguard Worker  # Combines all dependent .jar files into a single proguarded .dex file.
1553*6777b538SAndroid Build Coastguard Worker  #
1554*6777b538SAndroid Build Coastguard Worker  # Variables:
1555*6777b538SAndroid Build Coastguard Worker  #   output: Path to the output .dex or .dex.jar.
1556*6777b538SAndroid Build Coastguard Worker  #   proguard_enabled: Whether to enable R8.
1557*6777b538SAndroid Build Coastguard Worker  #   proguard_configs: List of proguard configs.
1558*6777b538SAndroid Build Coastguard Worker  #   proguard_enable_obfuscation: Whether to enable obfuscation (default=true).
1559*6777b538SAndroid Build Coastguard Worker  #   package_name: Used in the Proguard map ID.
1560*6777b538SAndroid Build Coastguard Worker  #   version_code: Used in the Proguard map ID.
1561*6777b538SAndroid Build Coastguard Worker  #
1562*6777b538SAndroid Build Coastguard Worker  # Example
1563*6777b538SAndroid Build Coastguard Worker  #   dist_dex("lib_fatjar") {
1564*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":my_java_lib" ]
1565*6777b538SAndroid Build Coastguard Worker  #     output = "$root_build_dir/MyLibrary.jar"
1566*6777b538SAndroid Build Coastguard Worker  #   }
1567*6777b538SAndroid Build Coastguard Worker  template("dist_dex") {
1568*6777b538SAndroid Build Coastguard Worker    _deps = [ default_android_sdk_dep ]
1569*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
1570*6777b538SAndroid Build Coastguard Worker      _deps += invoker.deps
1571*6777b538SAndroid Build Coastguard Worker    }
1572*6777b538SAndroid Build Coastguard Worker
1573*6777b538SAndroid Build Coastguard Worker    _build_config = "$target_gen_dir/$target_name.build_config.json"
1574*6777b538SAndroid Build Coastguard Worker    _build_config_target_name = "$target_name$build_config_target_suffix"
1575*6777b538SAndroid Build Coastguard Worker
1576*6777b538SAndroid Build Coastguard Worker    write_build_config(_build_config_target_name) {
1577*6777b538SAndroid Build Coastguard Worker      type = "dist_jar"
1578*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
1579*6777b538SAndroid Build Coastguard Worker                             [
1580*6777b538SAndroid Build Coastguard Worker                               "proguard_configs",
1581*6777b538SAndroid Build Coastguard Worker                               "proguard_enabled",
1582*6777b538SAndroid Build Coastguard Worker                             ])
1583*6777b538SAndroid Build Coastguard Worker      supports_android = true
1584*6777b538SAndroid Build Coastguard Worker      requires_android = true
1585*6777b538SAndroid Build Coastguard Worker      possible_config_deps = _deps
1586*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
1587*6777b538SAndroid Build Coastguard Worker    }
1588*6777b538SAndroid Build Coastguard Worker
1589*6777b538SAndroid Build Coastguard Worker    dex(target_name) {
1590*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
1591*6777b538SAndroid Build Coastguard Worker                             TESTONLY_AND_VISIBILITY + [
1592*6777b538SAndroid Build Coastguard Worker                                   "data",
1593*6777b538SAndroid Build Coastguard Worker                                   "data_deps",
1594*6777b538SAndroid Build Coastguard Worker                                   "package_name",
1595*6777b538SAndroid Build Coastguard Worker                                   "proguard_configs",
1596*6777b538SAndroid Build Coastguard Worker                                   "proguard_enabled",
1597*6777b538SAndroid Build Coastguard Worker                                   "proguard_enable_obfuscation",
1598*6777b538SAndroid Build Coastguard Worker                                   "min_sdk_version",
1599*6777b538SAndroid Build Coastguard Worker                                   "repackage_classes",
1600*6777b538SAndroid Build Coastguard Worker                                   "version_code",
1601*6777b538SAndroid Build Coastguard Worker                                 ])
1602*6777b538SAndroid Build Coastguard Worker      deps = [ ":$_build_config_target_name" ] + _deps
1603*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
1604*6777b538SAndroid Build Coastguard Worker      output = invoker.output
1605*6777b538SAndroid Build Coastguard Worker      if (defined(proguard_enabled) && proguard_enabled) {
1606*6777b538SAndroid Build Coastguard Worker        # The individual dependencies would have caught real missing deps in
1607*6777b538SAndroid Build Coastguard Worker        # their respective dex steps. False positives that were suppressed at
1608*6777b538SAndroid Build Coastguard Worker        # per-target dex steps are emitted here since this is using jar files
1609*6777b538SAndroid Build Coastguard Worker        # rather than dex files.
1610*6777b538SAndroid Build Coastguard Worker        ignore_desugar_missing_deps = true
1611*6777b538SAndroid Build Coastguard Worker      } else {
1612*6777b538SAndroid Build Coastguard Worker        _rebased_build_config = rebase_path(_build_config, root_build_dir)
1613*6777b538SAndroid Build Coastguard Worker        input_dex_filearg =
1614*6777b538SAndroid Build Coastguard Worker            "@FileArg(${_rebased_build_config}:deps_info:all_dex_files)"
1615*6777b538SAndroid Build Coastguard Worker      }
1616*6777b538SAndroid Build Coastguard Worker    }
1617*6777b538SAndroid Build Coastguard Worker  }
1618*6777b538SAndroid Build Coastguard Worker
1619*6777b538SAndroid Build Coastguard Worker  # Creates an Android .aar library.
1620*6777b538SAndroid Build Coastguard Worker  #
1621*6777b538SAndroid Build Coastguard Worker  # Currently supports:
1622*6777b538SAndroid Build Coastguard Worker  #   * AndroidManifest.xml
1623*6777b538SAndroid Build Coastguard Worker  #   * classes.jar
1624*6777b538SAndroid Build Coastguard Worker  #   * jni/
1625*6777b538SAndroid Build Coastguard Worker  #   * res/
1626*6777b538SAndroid Build Coastguard Worker  #   * R.txt
1627*6777b538SAndroid Build Coastguard Worker  #   * proguard.txt
1628*6777b538SAndroid Build Coastguard Worker  # Does not yet support:
1629*6777b538SAndroid Build Coastguard Worker  #   * public.txt
1630*6777b538SAndroid Build Coastguard Worker  #   * annotations.zip
1631*6777b538SAndroid Build Coastguard Worker  #   * assets/
1632*6777b538SAndroid Build Coastguard Worker  # See: https://developer.android.com/studio/projects/android-library.html#aar-contents
1633*6777b538SAndroid Build Coastguard Worker  #
1634*6777b538SAndroid Build Coastguard Worker  # Variables:
1635*6777b538SAndroid Build Coastguard Worker  #   output: Path to the output .aar.
1636*6777b538SAndroid Build Coastguard Worker  #   proguard_configs: List of proguard configs (optional).
1637*6777b538SAndroid Build Coastguard Worker  #   android_manifest: Path to AndroidManifest.xml (optional).
1638*6777b538SAndroid Build Coastguard Worker  #   native_libraries: list of native libraries (optional).
1639*6777b538SAndroid Build Coastguard Worker  #   direct_deps_only: Do not recurse on deps (optional, defaults false).
1640*6777b538SAndroid Build Coastguard Worker  #   jar_excluded_patterns: List of globs for paths to exclude (optional).
1641*6777b538SAndroid Build Coastguard Worker  #   jar_included_patterns: List of globs for paths to include (optional).
1642*6777b538SAndroid Build Coastguard Worker  #
1643*6777b538SAndroid Build Coastguard Worker  # Example
1644*6777b538SAndroid Build Coastguard Worker  #   dist_aar("my_aar") {
1645*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":my_java_lib" ]
1646*6777b538SAndroid Build Coastguard Worker  #     output = "$root_build_dir/MyLibrary.aar"
1647*6777b538SAndroid Build Coastguard Worker  #   }
1648*6777b538SAndroid Build Coastguard Worker  template("dist_aar") {
1649*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1650*6777b538SAndroid Build Coastguard Worker
1651*6777b538SAndroid Build Coastguard Worker    _direct_deps_only =
1652*6777b538SAndroid Build Coastguard Worker        defined(invoker.direct_deps_only) && invoker.direct_deps_only
1653*6777b538SAndroid Build Coastguard Worker
1654*6777b538SAndroid Build Coastguard Worker    _deps = []
1655*6777b538SAndroid Build Coastguard Worker
1656*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
1657*6777b538SAndroid Build Coastguard Worker      _deps += invoker.deps
1658*6777b538SAndroid Build Coastguard Worker    }
1659*6777b538SAndroid Build Coastguard Worker
1660*6777b538SAndroid Build Coastguard Worker    _build_config = "$target_gen_dir/$target_name.build_config.json"
1661*6777b538SAndroid Build Coastguard Worker    _build_config_target_name = "$target_name$build_config_target_suffix"
1662*6777b538SAndroid Build Coastguard Worker
1663*6777b538SAndroid Build Coastguard Worker    write_build_config(_build_config_target_name) {
1664*6777b538SAndroid Build Coastguard Worker      type = "dist_aar"
1665*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, [ "proguard_configs" ])
1666*6777b538SAndroid Build Coastguard Worker      possible_config_deps = _deps
1667*6777b538SAndroid Build Coastguard Worker      supports_android = true
1668*6777b538SAndroid Build Coastguard Worker      requires_android = true
1669*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
1670*6777b538SAndroid Build Coastguard Worker    }
1671*6777b538SAndroid Build Coastguard Worker
1672*6777b538SAndroid Build Coastguard Worker    _deps += [ ":$_build_config_target_name" ]
1673*6777b538SAndroid Build Coastguard Worker
1674*6777b538SAndroid Build Coastguard Worker    _rebased_build_config = rebase_path(_build_config, root_build_dir)
1675*6777b538SAndroid Build Coastguard Worker
1676*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
1677*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
1678*6777b538SAndroid Build Coastguard Worker                             [
1679*6777b538SAndroid Build Coastguard Worker                               "data",
1680*6777b538SAndroid Build Coastguard Worker                               "assert_no_deps",
1681*6777b538SAndroid Build Coastguard Worker                             ])
1682*6777b538SAndroid Build Coastguard Worker      depfile = "$target_gen_dir/$target_name.d"
1683*6777b538SAndroid Build Coastguard Worker      deps = _deps
1684*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/dist_aar.py"
1685*6777b538SAndroid Build Coastguard Worker
1686*6777b538SAndroid Build Coastguard Worker      inputs = [ _build_config ]
1687*6777b538SAndroid Build Coastguard Worker
1688*6777b538SAndroid Build Coastguard Worker      # Although these will be listed as deps in the depfile, they must also
1689*6777b538SAndroid Build Coastguard Worker      # appear here so that "gn analyze" knows about them.
1690*6777b538SAndroid Build Coastguard Worker      # https://crbug.com/827197
1691*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.proguard_configs)) {
1692*6777b538SAndroid Build Coastguard Worker        inputs += invoker.proguard_configs
1693*6777b538SAndroid Build Coastguard Worker      }
1694*6777b538SAndroid Build Coastguard Worker
1695*6777b538SAndroid Build Coastguard Worker      outputs = [ invoker.output ]
1696*6777b538SAndroid Build Coastguard Worker
1697*6777b538SAndroid Build Coastguard Worker      args = [
1698*6777b538SAndroid Build Coastguard Worker        "--depfile",
1699*6777b538SAndroid Build Coastguard Worker        rebase_path(depfile, root_build_dir),
1700*6777b538SAndroid Build Coastguard Worker        "--output",
1701*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.output, root_build_dir),
1702*6777b538SAndroid Build Coastguard Worker        "--dependencies-res-zips=@FileArg($_rebased_build_config:deps_info:dependency_zips)",
1703*6777b538SAndroid Build Coastguard Worker        "--r-text-files=@FileArg($_rebased_build_config:deps_info:dependency_r_txt_files)",
1704*6777b538SAndroid Build Coastguard Worker        "--proguard-configs=@FileArg($_rebased_build_config:deps_info:proguard_all_configs)",
1705*6777b538SAndroid Build Coastguard Worker      ]
1706*6777b538SAndroid Build Coastguard Worker      if (_direct_deps_only) {
1707*6777b538SAndroid Build Coastguard Worker        args += [ "--jars=@FileArg($_rebased_build_config:javac:classpath)" ]
1708*6777b538SAndroid Build Coastguard Worker      } else {
1709*6777b538SAndroid Build Coastguard Worker        args += [
1710*6777b538SAndroid Build Coastguard Worker          "--jars=@FileArg($_rebased_build_config:deps_info:device_classpath)",
1711*6777b538SAndroid Build Coastguard Worker        ]
1712*6777b538SAndroid Build Coastguard Worker      }
1713*6777b538SAndroid Build Coastguard Worker
1714*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.android_manifest)) {
1715*6777b538SAndroid Build Coastguard Worker        args += [
1716*6777b538SAndroid Build Coastguard Worker          "--android-manifest",
1717*6777b538SAndroid Build Coastguard Worker          rebase_path(invoker.android_manifest, root_build_dir),
1718*6777b538SAndroid Build Coastguard Worker        ]
1719*6777b538SAndroid Build Coastguard Worker      }
1720*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.native_libraries) && invoker.native_libraries != []) {
1721*6777b538SAndroid Build Coastguard Worker        inputs += invoker.native_libraries
1722*6777b538SAndroid Build Coastguard Worker        _rebased_native_libraries =
1723*6777b538SAndroid Build Coastguard Worker            rebase_path(invoker.native_libraries, root_build_dir)
1724*6777b538SAndroid Build Coastguard Worker
1725*6777b538SAndroid Build Coastguard Worker        args += [
1726*6777b538SAndroid Build Coastguard Worker          "--native-libraries=$_rebased_native_libraries",
1727*6777b538SAndroid Build Coastguard Worker          "--abi=$android_app_abi",
1728*6777b538SAndroid Build Coastguard Worker        ]
1729*6777b538SAndroid Build Coastguard Worker      }
1730*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.jar_excluded_patterns)) {
1731*6777b538SAndroid Build Coastguard Worker        args += [ "--jar-excluded-globs=${invoker.jar_excluded_patterns}" ]
1732*6777b538SAndroid Build Coastguard Worker      }
1733*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.jar_included_patterns)) {
1734*6777b538SAndroid Build Coastguard Worker        args += [ "--jar-included-globs=${invoker.jar_included_patterns}" ]
1735*6777b538SAndroid Build Coastguard Worker      }
1736*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.resource_included_patterns)) {
1737*6777b538SAndroid Build Coastguard Worker        args += [
1738*6777b538SAndroid Build Coastguard Worker          "--resource-included-globs=${invoker.resource_included_patterns}",
1739*6777b538SAndroid Build Coastguard Worker        ]
1740*6777b538SAndroid Build Coastguard Worker      }
1741*6777b538SAndroid Build Coastguard Worker    }
1742*6777b538SAndroid Build Coastguard Worker  }
1743*6777b538SAndroid Build Coastguard Worker
1744*6777b538SAndroid Build Coastguard Worker  # Declare an Android library target
1745*6777b538SAndroid Build Coastguard Worker  #
1746*6777b538SAndroid Build Coastguard Worker  # This target creates an Android library containing java code and Android
1747*6777b538SAndroid Build Coastguard Worker  # resources.
1748*6777b538SAndroid Build Coastguard Worker  #
1749*6777b538SAndroid Build Coastguard Worker  # Supports all variables of java_library(), plus:
1750*6777b538SAndroid Build Coastguard Worker  #   deps: In addition to defining java deps, this can also include
1751*6777b538SAndroid Build Coastguard Worker  #     android_assets() and android_resources() targets.
1752*6777b538SAndroid Build Coastguard Worker  #   alternative_android_sdk_dep: android_system_java_prebuilt target to use
1753*6777b538SAndroid Build Coastguard Worker  #     in place of the default android.jar.
1754*6777b538SAndroid Build Coastguard Worker  #
1755*6777b538SAndroid Build Coastguard Worker  # Example
1756*6777b538SAndroid Build Coastguard Worker  #   android_library("foo_java") {
1757*6777b538SAndroid Build Coastguard Worker  #     sources = [
1758*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/Foo.java",
1759*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooInterface.java",
1760*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooService.java",
1761*6777b538SAndroid Build Coastguard Worker  #     ]
1762*6777b538SAndroid Build Coastguard Worker  #     deps = [
1763*6777b538SAndroid Build Coastguard Worker  #       ":bar_java"
1764*6777b538SAndroid Build Coastguard Worker  #     ]
1765*6777b538SAndroid Build Coastguard Worker  #     srcjar_deps = [
1766*6777b538SAndroid Build Coastguard Worker  #       ":foo_generated_enum"
1767*6777b538SAndroid Build Coastguard Worker  #     ]
1768*6777b538SAndroid Build Coastguard Worker  #     jar_excluded_patterns = [
1769*6777b538SAndroid Build Coastguard Worker  #       "*/FooService.class", "org/chromium/FooService\$*.class"
1770*6777b538SAndroid Build Coastguard Worker  #     ]
1771*6777b538SAndroid Build Coastguard Worker  #   }
1772*6777b538SAndroid Build Coastguard Worker  template("android_library") {
1773*6777b538SAndroid Build Coastguard Worker    java_library(target_name) {
1774*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
1775*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1776*6777b538SAndroid Build Coastguard Worker
1777*6777b538SAndroid Build Coastguard Worker      supports_android = true
1778*6777b538SAndroid Build Coastguard Worker      requires_android = true
1779*6777b538SAndroid Build Coastguard Worker
1780*6777b538SAndroid Build Coastguard Worker      if (!defined(jar_excluded_patterns)) {
1781*6777b538SAndroid Build Coastguard Worker        jar_excluded_patterns = []
1782*6777b538SAndroid Build Coastguard Worker      }
1783*6777b538SAndroid Build Coastguard Worker      jar_excluded_patterns += [
1784*6777b538SAndroid Build Coastguard Worker        "*/R.class",
1785*6777b538SAndroid Build Coastguard Worker        "*/R\$*.class",
1786*6777b538SAndroid Build Coastguard Worker        "*/Manifest.class",
1787*6777b538SAndroid Build Coastguard Worker        "*/Manifest\$*.class",
1788*6777b538SAndroid Build Coastguard Worker        "*/*GEN_JNI.class",
1789*6777b538SAndroid Build Coastguard Worker      ]
1790*6777b538SAndroid Build Coastguard Worker    }
1791*6777b538SAndroid Build Coastguard Worker  }
1792*6777b538SAndroid Build Coastguard Worker
1793*6777b538SAndroid Build Coastguard Worker  # Declare an Android robolectric library target
1794*6777b538SAndroid Build Coastguard Worker  #
1795*6777b538SAndroid Build Coastguard Worker  # This target creates an Android library containing java code and Android
1796*6777b538SAndroid Build Coastguard Worker  # resources.
1797*6777b538SAndroid Build Coastguard Worker  #
1798*6777b538SAndroid Build Coastguard Worker  # Supports all variables of java_library(), plus:
1799*6777b538SAndroid Build Coastguard Worker  #   deps: In addition to defining java deps, this can also include
1800*6777b538SAndroid Build Coastguard Worker  #     android_assets() and android_resources() targets.
1801*6777b538SAndroid Build Coastguard Worker  #
1802*6777b538SAndroid Build Coastguard Worker  # Example
1803*6777b538SAndroid Build Coastguard Worker  #   robolectric_library("foo_junit") {
1804*6777b538SAndroid Build Coastguard Worker  #     sources = [
1805*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooTest.java",
1806*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooTestUtils.java",
1807*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooMock.java",
1808*6777b538SAndroid Build Coastguard Worker  #     ]
1809*6777b538SAndroid Build Coastguard Worker  #     deps = [
1810*6777b538SAndroid Build Coastguard Worker  #       "//base:base_junit_test_support"
1811*6777b538SAndroid Build Coastguard Worker  #     ]
1812*6777b538SAndroid Build Coastguard Worker  #     srcjar_deps = [
1813*6777b538SAndroid Build Coastguard Worker  #       ":foo_generated_enum"
1814*6777b538SAndroid Build Coastguard Worker  #     ]
1815*6777b538SAndroid Build Coastguard Worker  #     jar_excluded_patterns = [
1816*6777b538SAndroid Build Coastguard Worker  #       "*/FooService.class", "org/chromium/FooService\$*.class"
1817*6777b538SAndroid Build Coastguard Worker  #     ]
1818*6777b538SAndroid Build Coastguard Worker  #   }
1819*6777b538SAndroid Build Coastguard Worker  template("robolectric_library") {
1820*6777b538SAndroid Build Coastguard Worker    java_library(target_name) {
1821*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
1822*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1823*6777b538SAndroid Build Coastguard Worker
1824*6777b538SAndroid Build Coastguard Worker      testonly = true
1825*6777b538SAndroid Build Coastguard Worker
1826*6777b538SAndroid Build Coastguard Worker      is_robolectric = true
1827*6777b538SAndroid Build Coastguard Worker      include_android_sdk = true
1828*6777b538SAndroid Build Coastguard Worker      alternative_android_sdk_dep =
1829*6777b538SAndroid Build Coastguard Worker          "//third_party/robolectric:robolectric_test_sdk_java"
1830*6777b538SAndroid Build Coastguard Worker
1831*6777b538SAndroid Build Coastguard Worker      if (!defined(jar_excluded_patterns)) {
1832*6777b538SAndroid Build Coastguard Worker        jar_excluded_patterns = []
1833*6777b538SAndroid Build Coastguard Worker      }
1834*6777b538SAndroid Build Coastguard Worker      jar_excluded_patterns += [
1835*6777b538SAndroid Build Coastguard Worker        "*/R.class",
1836*6777b538SAndroid Build Coastguard Worker        "*/R\$*.class",
1837*6777b538SAndroid Build Coastguard Worker        "*/Manifest.class",
1838*6777b538SAndroid Build Coastguard Worker        "*/Manifest\$*.class",
1839*6777b538SAndroid Build Coastguard Worker        "*/*GEN_JNI.class",
1840*6777b538SAndroid Build Coastguard Worker      ]
1841*6777b538SAndroid Build Coastguard Worker
1842*6777b538SAndroid Build Coastguard Worker      if (!defined(deps)) {
1843*6777b538SAndroid Build Coastguard Worker        deps = []
1844*6777b538SAndroid Build Coastguard Worker      }
1845*6777b538SAndroid Build Coastguard Worker      deps += [ "//third_party/android_deps:robolectric_all_java" ]
1846*6777b538SAndroid Build Coastguard Worker    }
1847*6777b538SAndroid Build Coastguard Worker  }
1848*6777b538SAndroid Build Coastguard Worker
1849*6777b538SAndroid Build Coastguard Worker  # Declare an Android library target for a prebuilt jar
1850*6777b538SAndroid Build Coastguard Worker  #
1851*6777b538SAndroid Build Coastguard Worker  # This target creates an Android library containing java code and Android
1852*6777b538SAndroid Build Coastguard Worker  # resources.
1853*6777b538SAndroid Build Coastguard Worker  #
1854*6777b538SAndroid Build Coastguard Worker  # Supports all variables of android_library().
1855*6777b538SAndroid Build Coastguard Worker  #
1856*6777b538SAndroid Build Coastguard Worker  # Example
1857*6777b538SAndroid Build Coastguard Worker  #   android_java_prebuilt("foo_java") {
1858*6777b538SAndroid Build Coastguard Worker  #     jar_path = "foo.jar"
1859*6777b538SAndroid Build Coastguard Worker  #     deps = [
1860*6777b538SAndroid Build Coastguard Worker  #       ":foo_resources",
1861*6777b538SAndroid Build Coastguard Worker  #       ":bar_java"
1862*6777b538SAndroid Build Coastguard Worker  #     ]
1863*6777b538SAndroid Build Coastguard Worker  #   }
1864*6777b538SAndroid Build Coastguard Worker  template("android_java_prebuilt") {
1865*6777b538SAndroid Build Coastguard Worker    android_library(target_name) {
1866*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
1867*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1868*6777b538SAndroid Build Coastguard Worker    }
1869*6777b538SAndroid Build Coastguard Worker  }
1870*6777b538SAndroid Build Coastguard Worker
1871*6777b538SAndroid Build Coastguard Worker  template("android_system_java_prebuilt") {
1872*6777b538SAndroid Build Coastguard Worker    java_library_impl(target_name) {
1873*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
1874*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1875*6777b538SAndroid Build Coastguard Worker      supports_android = true
1876*6777b538SAndroid Build Coastguard Worker      type = "system_java_library"
1877*6777b538SAndroid Build Coastguard Worker    }
1878*6777b538SAndroid Build Coastguard Worker  }
1879*6777b538SAndroid Build Coastguard Worker
1880*6777b538SAndroid Build Coastguard Worker  # Creates org/chromium/build/BuildConfig.java
1881*6777b538SAndroid Build Coastguard Worker  # This doesn't really belong in //build since it genates a file for //base.
1882*6777b538SAndroid Build Coastguard Worker  # However, we don't currently have a better way to include this file in all
1883*6777b538SAndroid Build Coastguard Worker  # apks that depend on //base:base_java.
1884*6777b538SAndroid Build Coastguard Worker  #
1885*6777b538SAndroid Build Coastguard Worker  # Variables:
1886*6777b538SAndroid Build Coastguard Worker  #   use_final_fields: True to use final fields. When false, all other
1887*6777b538SAndroid Build Coastguard Worker  #       variables must not be set.
1888*6777b538SAndroid Build Coastguard Worker  #   min_sdk_version: Value for MIN_SDK_VERSION.
1889*6777b538SAndroid Build Coastguard Worker  #   version_code: Value for VERSION_CODE.
1890*6777b538SAndroid Build Coastguard Worker  #   bundles_supported: Whether or not this target can be treated as a bundle.
1891*6777b538SAndroid Build Coastguard Worker  #   resources_version_variable:
1892*6777b538SAndroid Build Coastguard Worker  #   is_incremental_install:
1893*6777b538SAndroid Build Coastguard Worker  #   isolated_splits_enabled: Value for ISOLATED_SPLITS_ENABLED.
1894*6777b538SAndroid Build Coastguard Worker  template("generate_build_config_srcjar") {
1895*6777b538SAndroid Build Coastguard Worker    java_cpp_template(target_name) {
1896*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
1897*6777b538SAndroid Build Coastguard Worker      sources = [ "//build/android/java/templates/BuildConfig.template" ]
1898*6777b538SAndroid Build Coastguard Worker      defines = []
1899*6777b538SAndroid Build Coastguard Worker
1900*6777b538SAndroid Build Coastguard Worker      # Set these even when !use_final_fields so that they have correct default
1901*6777b538SAndroid Build Coastguard Worker      # values within robolectric_binary(), which ignores jar_excluded_patterns.
1902*6777b538SAndroid Build Coastguard Worker      if ((defined(invoker.assertions_implicitly_enabled) &&
1903*6777b538SAndroid Build Coastguard Worker           invoker.assertions_implicitly_enabled) || enable_java_asserts) {
1904*6777b538SAndroid Build Coastguard Worker        defines += [ "_ENABLE_ASSERTS" ]
1905*6777b538SAndroid Build Coastguard Worker      }
1906*6777b538SAndroid Build Coastguard Worker      if (use_cfi_diag || is_ubsan || is_ubsan_security || is_ubsan_vptr) {
1907*6777b538SAndroid Build Coastguard Worker        defines += [ "_IS_UBSAN" ]
1908*6777b538SAndroid Build Coastguard Worker      }
1909*6777b538SAndroid Build Coastguard Worker
1910*6777b538SAndroid Build Coastguard Worker      if (is_chrome_branded) {
1911*6777b538SAndroid Build Coastguard Worker        defines += [ "_IS_CHROME_BRANDED" ]
1912*6777b538SAndroid Build Coastguard Worker      }
1913*6777b538SAndroid Build Coastguard Worker
1914*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.bundles_supported) && invoker.bundles_supported) {
1915*6777b538SAndroid Build Coastguard Worker        defines += [ "_BUNDLES_SUPPORTED" ]
1916*6777b538SAndroid Build Coastguard Worker      }
1917*6777b538SAndroid Build Coastguard Worker
1918*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.isolated_splits_enabled) &&
1919*6777b538SAndroid Build Coastguard Worker          invoker.isolated_splits_enabled) {
1920*6777b538SAndroid Build Coastguard Worker        defines += [ "_ISOLATED_SPLITS_ENABLED" ]
1921*6777b538SAndroid Build Coastguard Worker      }
1922*6777b538SAndroid Build Coastguard Worker
1923*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.is_incremental_install) &&
1924*6777b538SAndroid Build Coastguard Worker          invoker.is_incremental_install) {
1925*6777b538SAndroid Build Coastguard Worker        defines += [ "_IS_INCREMENTAL_INSTALL" ]
1926*6777b538SAndroid Build Coastguard Worker      }
1927*6777b538SAndroid Build Coastguard Worker
1928*6777b538SAndroid Build Coastguard Worker      if (invoker.use_final_fields) {
1929*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, [ "deps" ])
1930*6777b538SAndroid Build Coastguard Worker        defines += [ "USE_FINAL" ]
1931*6777b538SAndroid Build Coastguard Worker        defines += [ "_MIN_SDK_VERSION=${invoker.min_sdk_version}" ]
1932*6777b538SAndroid Build Coastguard Worker        defines += [ "_VERSION_CODE=${invoker.version_code}" ]
1933*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.resources_version_variable)) {
1934*6777b538SAndroid Build Coastguard Worker          defines += [
1935*6777b538SAndroid Build Coastguard Worker            "_RESOURCES_VERSION_VARIABLE=${invoker.resources_version_variable}",
1936*6777b538SAndroid Build Coastguard Worker          ]
1937*6777b538SAndroid Build Coastguard Worker        }
1938*6777b538SAndroid Build Coastguard Worker      }
1939*6777b538SAndroid Build Coastguard Worker
1940*6777b538SAndroid Build Coastguard Worker      if (defined(testonly) && testonly) {
1941*6777b538SAndroid Build Coastguard Worker        defines += [ "_IS_FOR_TEST" ]
1942*6777b538SAndroid Build Coastguard Worker      }
1943*6777b538SAndroid Build Coastguard Worker
1944*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.write_clang_profiling_data) &&
1945*6777b538SAndroid Build Coastguard Worker          invoker.write_clang_profiling_data) {
1946*6777b538SAndroid Build Coastguard Worker        defines += [ "_WRITE_CLANG_PROFILING_DATA" ]
1947*6777b538SAndroid Build Coastguard Worker      }
1948*6777b538SAndroid Build Coastguard Worker    }
1949*6777b538SAndroid Build Coastguard Worker  }
1950*6777b538SAndroid Build Coastguard Worker
1951*6777b538SAndroid Build Coastguard Worker  # Creates ProductConfig.java, a file containing product-specific configuration.
1952*6777b538SAndroid Build Coastguard Worker  #
1953*6777b538SAndroid Build Coastguard Worker  # Currently, this includes the list of locales, both in their compressed and
1954*6777b538SAndroid Build Coastguard Worker  # uncompressed format, as well as library loading
1955*6777b538SAndroid Build Coastguard Worker  #
1956*6777b538SAndroid Build Coastguard Worker  # Variables:
1957*6777b538SAndroid Build Coastguard Worker  #   build_config: Path to build_config used for locale lists.
1958*6777b538SAndroid Build Coastguard Worker  #   is_bundle_module: Whether or not this target is part of a bundle build.
1959*6777b538SAndroid Build Coastguard Worker  #   java_package: Java package for the generated class.
1960*6777b538SAndroid Build Coastguard Worker  #   use_chromium_linker:
1961*6777b538SAndroid Build Coastguard Worker  template("generate_product_config_srcjar") {
1962*6777b538SAndroid Build Coastguard Worker    java_cpp_template(target_name) {
1963*6777b538SAndroid Build Coastguard Worker      defines = []
1964*6777b538SAndroid Build Coastguard Worker      _use_final =
1965*6777b538SAndroid Build Coastguard Worker          defined(invoker.build_config) ||
1966*6777b538SAndroid Build Coastguard Worker          defined(invoker.use_chromium_linker) || defined(invoker.is_bundle)
1967*6777b538SAndroid Build Coastguard Worker      if (_use_final) {
1968*6777b538SAndroid Build Coastguard Worker        defines += [ "USE_FINAL" ]
1969*6777b538SAndroid Build Coastguard Worker      }
1970*6777b538SAndroid Build Coastguard Worker
1971*6777b538SAndroid Build Coastguard Worker      sources = [ "//build/android/java/templates/ProductConfig.template" ]
1972*6777b538SAndroid Build Coastguard Worker      defines += [ "PACKAGE=${invoker.java_package}" ]
1973*6777b538SAndroid Build Coastguard Worker
1974*6777b538SAndroid Build Coastguard Worker      _use_chromium_linker =
1975*6777b538SAndroid Build Coastguard Worker          defined(invoker.use_chromium_linker) && invoker.use_chromium_linker
1976*6777b538SAndroid Build Coastguard Worker      _is_bundle = defined(invoker.is_bundle_module) && invoker.is_bundle_module
1977*6777b538SAndroid Build Coastguard Worker      defines += [
1978*6777b538SAndroid Build Coastguard Worker        "USE_CHROMIUM_LINKER_VALUE=$_use_chromium_linker",
1979*6777b538SAndroid Build Coastguard Worker        "IS_BUNDLE_VALUE=$_is_bundle",
1980*6777b538SAndroid Build Coastguard Worker      ]
1981*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.build_config)) {
1982*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "deps" ])
1983*6777b538SAndroid Build Coastguard Worker        _rebased_build_config =
1984*6777b538SAndroid Build Coastguard Worker            rebase_path(invoker.build_config, root_build_dir)
1985*6777b538SAndroid Build Coastguard Worker        defines += [ "LOCALE_LIST=@FileArg($_rebased_build_config:deps_info:locales_java_list)" ]
1986*6777b538SAndroid Build Coastguard Worker      }
1987*6777b538SAndroid Build Coastguard Worker    }
1988*6777b538SAndroid Build Coastguard Worker  }
1989*6777b538SAndroid Build Coastguard Worker
1990*6777b538SAndroid Build Coastguard Worker  # Declare an Android app module target, which is used as the basis for an
1991*6777b538SAndroid Build Coastguard Worker  # Android APK or an Android app bundle module.
1992*6777b538SAndroid Build Coastguard Worker  #
1993*6777b538SAndroid Build Coastguard Worker  # Supports all variables of android_library(), plus:
1994*6777b538SAndroid Build Coastguard Worker  #   android_manifest: Path to AndroidManifest.xml. NOTE: This manifest must
1995*6777b538SAndroid Build Coastguard Worker  #     not contain a <uses-sdk> element. Use [min|target|max]_sdk_version
1996*6777b538SAndroid Build Coastguard Worker  #     instead.
1997*6777b538SAndroid Build Coastguard Worker  #   android_manifest_dep: Target that generates AndroidManifest (if applicable)
1998*6777b538SAndroid Build Coastguard Worker  #   png_to_webp: If true, pngs (with the exception of 9-patch) are
1999*6777b538SAndroid Build Coastguard Worker  #     converted to webp during resource packaging.
2000*6777b538SAndroid Build Coastguard Worker  #   loadable_modules: List of paths to native libraries to include. Different
2001*6777b538SAndroid Build Coastguard Worker  #     from |shared_libraries| in that:
2002*6777b538SAndroid Build Coastguard Worker  #       * dependencies of this .so are not automatically included
2003*6777b538SAndroid Build Coastguard Worker  #       * they are not side-loaded when incremental_install=true.
2004*6777b538SAndroid Build Coastguard Worker  #       * they are not included in NativeLibraries.java
2005*6777b538SAndroid Build Coastguard Worker  #     Use this instead of shared_libraries when you are going to load the library
2006*6777b538SAndroid Build Coastguard Worker  #     conditionally, and only when shared_libraries doesn't work for you.
2007*6777b538SAndroid Build Coastguard Worker  #   secondary_abi_loadable_modules: This is the loadable_modules analog to
2008*6777b538SAndroid Build Coastguard Worker  #     secondary_abi_shared_libraries.
2009*6777b538SAndroid Build Coastguard Worker  #   shared_libraries: List shared_library targets to bundle. If these
2010*6777b538SAndroid Build Coastguard Worker  #     libraries depend on other shared_library targets, those dependencies will
2011*6777b538SAndroid Build Coastguard Worker  #     also be included in the apk (e.g. for is_component_build).
2012*6777b538SAndroid Build Coastguard Worker  #   secondary_abi_shared_libraries: secondary abi shared_library targets to
2013*6777b538SAndroid Build Coastguard Worker  #     bundle. If these libraries depend on other shared_library targets, those
2014*6777b538SAndroid Build Coastguard Worker  #     dependencies will also be included in the apk (e.g. for is_component_build).
2015*6777b538SAndroid Build Coastguard Worker  #   native_lib_placeholders: List of placeholder filenames to add to the apk
2016*6777b538SAndroid Build Coastguard Worker  #     (optional).
2017*6777b538SAndroid Build Coastguard Worker  #   secondary_native_lib_placeholders: List of placeholder filenames to add to
2018*6777b538SAndroid Build Coastguard Worker  #     the apk for the secondary ABI (optional).
2019*6777b538SAndroid Build Coastguard Worker  #   generate_buildconfig_java: If defined and false, skip generating the
2020*6777b538SAndroid Build Coastguard Worker  #     BuildConfig java class describing the build configuration. The default
2021*6777b538SAndroid Build Coastguard Worker  #     is true when building with Chromium for non-test APKs.
2022*6777b538SAndroid Build Coastguard Worker  #   generate_native_libraries_java: If defined, whether NativeLibraries.java is
2023*6777b538SAndroid Build Coastguard Worker  #     generated is solely controlled by this flag. Otherwise, the default behavior
2024*6777b538SAndroid Build Coastguard Worker  #     is NativeLibraries.java will only be generated for the base module/apk when
2025*6777b538SAndroid Build Coastguard Worker  #     its `shared_libraries` is not empty.
2026*6777b538SAndroid Build Coastguard Worker  #   aapt_locale_allowlist: If set, all locales not in this list will be
2027*6777b538SAndroid Build Coastguard Worker  #     stripped from resources.arsc.
2028*6777b538SAndroid Build Coastguard Worker  #   resource_exclusion_regex: Causes all drawable images matching the regex to
2029*6777b538SAndroid Build Coastguard Worker  #     be excluded (mipmaps are still included).
2030*6777b538SAndroid Build Coastguard Worker  #   resource_exclusion_exceptions: A list of globs used when
2031*6777b538SAndroid Build Coastguard Worker  #     resource_exclusion_regex is set. Files that match this list will
2032*6777b538SAndroid Build Coastguard Worker  #     still be included.
2033*6777b538SAndroid Build Coastguard Worker  #   resource_values_filter_rules: List of "source_path:name_regex" used to
2034*6777b538SAndroid Build Coastguard Worker  #     filter out unwanted values/ resources.
2035*6777b538SAndroid Build Coastguard Worker  #   shared_resources: True if this is a runtime shared library APK, like
2036*6777b538SAndroid Build Coastguard Worker  #     the system_webview_apk target. Ensures that its resources can be
2037*6777b538SAndroid Build Coastguard Worker  #     used by the loading application process.
2038*6777b538SAndroid Build Coastguard Worker  #   app_as_shared_lib: True if this is a regular application apk that can
2039*6777b538SAndroid Build Coastguard Worker  #     also serve as a runtime shared library, like the monochrome_public_apk
2040*6777b538SAndroid Build Coastguard Worker  #     target. Ensures that the resources are usable both by the APK running
2041*6777b538SAndroid Build Coastguard Worker  #     as an application, or by another process that loads it at runtime.
2042*6777b538SAndroid Build Coastguard Worker  #   shared_resources_allowlist_target: Optional name of a target specifying
2043*6777b538SAndroid Build Coastguard Worker  #     an input R.txt file that lists the resources that can be exported
2044*6777b538SAndroid Build Coastguard Worker  #     by the APK when shared_resources or app_as_shared_lib is defined.
2045*6777b538SAndroid Build Coastguard Worker  #   uncompress_dex: Store final .dex files uncompressed in the apk.
2046*6777b538SAndroid Build Coastguard Worker  #   omit_dex: If true, do not build or include classes.dex.
2047*6777b538SAndroid Build Coastguard Worker  #   strip_resource_names: True if resource names should be stripped from the
2048*6777b538SAndroid Build Coastguard Worker  #     resources.arsc file in the apk or module.
2049*6777b538SAndroid Build Coastguard Worker  #   strip_unused_resources: True if unused resources should be stripped from
2050*6777b538SAndroid Build Coastguard Worker  #     the apk or module.
2051*6777b538SAndroid Build Coastguard Worker  #   short_resource_paths: True if resource paths should be shortened in the
2052*6777b538SAndroid Build Coastguard Worker  #     apk or module.
2053*6777b538SAndroid Build Coastguard Worker  #   resources_config_paths: List of paths to the aapt2 optimize config files
2054*6777b538SAndroid Build Coastguard Worker  #     that tags resources with acceptable/non-acceptable optimizations.
2055*6777b538SAndroid Build Coastguard Worker  #   expected_android_manifest: Enables verification of expected merged
2056*6777b538SAndroid Build Coastguard Worker  #     manifest based on a golden file.
2057*6777b538SAndroid Build Coastguard Worker  #   resource_ids_provider_dep: If passed, this target will use the resource
2058*6777b538SAndroid Build Coastguard Worker  #     IDs generated by {resource_ids_provider_dep}__compile_res during
2059*6777b538SAndroid Build Coastguard Worker  #     resource compilation.
2060*6777b538SAndroid Build Coastguard Worker  #   enforce_resource_overlays_in_tests: Enables check for testonly targets that
2061*6777b538SAndroid Build Coastguard Worker  #     dependent resource targets which override another target set
2062*6777b538SAndroid Build Coastguard Worker  #     overlay_resources=true. This check is on for non-test targets and
2063*6777b538SAndroid Build Coastguard Worker  #     cannot be disabled.
2064*6777b538SAndroid Build Coastguard Worker  #   static_library_provider: Specifies a single target that this target will
2065*6777b538SAndroid Build Coastguard Worker  #     use as a static library APK.
2066*6777b538SAndroid Build Coastguard Worker  #   min_sdk_version: The minimum Android SDK version this target supports.
2067*6777b538SAndroid Build Coastguard Worker  #     Optional, default $default_min_sdk_version.
2068*6777b538SAndroid Build Coastguard Worker  #   target_sdk_version: The target Android SDK version for this target.
2069*6777b538SAndroid Build Coastguard Worker  #     Optional, default to android_sdk_version.
2070*6777b538SAndroid Build Coastguard Worker  #   max_sdk_version: The maximum Android SDK version this target supports.
2071*6777b538SAndroid Build Coastguard Worker  #     Optional, default not set.
2072*6777b538SAndroid Build Coastguard Worker  #   require_native_mocks: Enforce that any native calls using
2073*6777b538SAndroid Build Coastguard Worker  #     org.chromium.base.annotations.NativeMethods must have a mock set
2074*6777b538SAndroid Build Coastguard Worker  #     (optional).
2075*6777b538SAndroid Build Coastguard Worker  #   product_config_java_packages: Optional list of java packages. If given, a
2076*6777b538SAndroid Build Coastguard Worker  #     ProductConfig.java file will be generated for each package.
2077*6777b538SAndroid Build Coastguard Worker  #   enable_proguard_checks: Turns on -checkdiscard directives and missing
2078*6777b538SAndroid Build Coastguard Worker  #     symbols check in the proguard step (default=true).
2079*6777b538SAndroid Build Coastguard Worker  #   annotation_processor_deps: List of java_annotation_processor targets to
2080*6777b538SAndroid Build Coastguard Worker  #     use when compiling the sources given to this target (optional).
2081*6777b538SAndroid Build Coastguard Worker  #   processor_args_javac: List of args to pass to annotation processors when
2082*6777b538SAndroid Build Coastguard Worker  #     compiling sources given to this target (optional).
2083*6777b538SAndroid Build Coastguard Worker  #   bundles_supported: Enable Java code to treat this target as a bundle
2084*6777b538SAndroid Build Coastguard Worker  #     whether (by default determined by the target type).
2085*6777b538SAndroid Build Coastguard Worker  #   expected_libs_and_assets: Verify the list of included native libraries
2086*6777b538SAndroid Build Coastguard Worker  #     and assets is consistent with the given expectation file.
2087*6777b538SAndroid Build Coastguard Worker  #   expected_libs_and_assets_base: Treat expected_libs_and_assets as a diff
2088*6777b538SAndroid Build Coastguard Worker  #     with this file as the base.
2089*6777b538SAndroid Build Coastguard Worker  #   expected_proguard_config: Checks that the merged set of proguard flags
2090*6777b538SAndroid Build Coastguard Worker  #     matches the given config.
2091*6777b538SAndroid Build Coastguard Worker  #   expected_proguard_config_base: Treat expected_proguard_config as a diff
2092*6777b538SAndroid Build Coastguard Worker  #     with this file as the base.
2093*6777b538SAndroid Build Coastguard Worker  template("android_apk_or_module") {
2094*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
2095*6777b538SAndroid Build Coastguard Worker    _template_name = target_name
2096*6777b538SAndroid Build Coastguard Worker    _base_path = "$target_out_dir/$target_name/$target_name"
2097*6777b538SAndroid Build Coastguard Worker    _build_config = "$target_gen_dir/$target_name.build_config.json"
2098*6777b538SAndroid Build Coastguard Worker    _build_config_target = "$target_name$build_config_target_suffix"
2099*6777b538SAndroid Build Coastguard Worker    _java_target_name = "${_template_name}__java"
2100*6777b538SAndroid Build Coastguard Worker
2101*6777b538SAndroid Build Coastguard Worker    _min_sdk_version = default_min_sdk_version
2102*6777b538SAndroid Build Coastguard Worker    _target_sdk_version = android_sdk_version
2103*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.min_sdk_version)) {
2104*6777b538SAndroid Build Coastguard Worker      _min_sdk_version = invoker.min_sdk_version
2105*6777b538SAndroid Build Coastguard Worker    }
2106*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.target_sdk_version)) {
2107*6777b538SAndroid Build Coastguard Worker      _target_sdk_version = invoker.target_sdk_version
2108*6777b538SAndroid Build Coastguard Worker    }
2109*6777b538SAndroid Build Coastguard Worker
2110*6777b538SAndroid Build Coastguard Worker    _is_bundle_module =
2111*6777b538SAndroid Build Coastguard Worker        defined(invoker.is_bundle_module) && invoker.is_bundle_module
2112*6777b538SAndroid Build Coastguard Worker    _is_base_module = !_is_bundle_module || (defined(invoker.is_base_module) &&
2113*6777b538SAndroid Build Coastguard Worker                                             invoker.is_base_module)
2114*6777b538SAndroid Build Coastguard Worker
2115*6777b538SAndroid Build Coastguard Worker    _omit_dex = defined(invoker.omit_dex) && invoker.omit_dex
2116*6777b538SAndroid Build Coastguard Worker
2117*6777b538SAndroid Build Coastguard Worker    if (!_is_bundle_module) {
2118*6777b538SAndroid Build Coastguard Worker      _final_apk_path = invoker.final_apk_path
2119*6777b538SAndroid Build Coastguard Worker      _final_rtxt_path = "${_final_apk_path}.R.txt"
2120*6777b538SAndroid Build Coastguard Worker    }
2121*6777b538SAndroid Build Coastguard Worker
2122*6777b538SAndroid Build Coastguard Worker    _res_size_info_path = "$target_out_dir/$target_name.ap_.info"
2123*6777b538SAndroid Build Coastguard Worker    if (!_is_bundle_module) {
2124*6777b538SAndroid Build Coastguard Worker      _final_apk_path_no_ext_list =
2125*6777b538SAndroid Build Coastguard Worker          process_file_template([ _final_apk_path ],
2126*6777b538SAndroid Build Coastguard Worker                                "{{source_dir}}/{{source_name_part}}")
2127*6777b538SAndroid Build Coastguard Worker      _final_apk_path_no_ext = _final_apk_path_no_ext_list[0]
2128*6777b538SAndroid Build Coastguard Worker      not_needed([ "_final_apk_path_no_ext" ])
2129*6777b538SAndroid Build Coastguard Worker    }
2130*6777b538SAndroid Build Coastguard Worker
2131*6777b538SAndroid Build Coastguard Worker    # Non-base bundle modules create only proto resources.
2132*6777b538SAndroid Build Coastguard Worker    if (_is_base_module) {
2133*6777b538SAndroid Build Coastguard Worker      _arsc_resources_path = "$target_out_dir/$target_name.ap_"
2134*6777b538SAndroid Build Coastguard Worker    }
2135*6777b538SAndroid Build Coastguard Worker    if (_is_bundle_module) {
2136*6777b538SAndroid Build Coastguard Worker      # Path to the intermediate proto-format resources zip file.
2137*6777b538SAndroid Build Coastguard Worker      _proto_resources_path = "$target_out_dir/$target_name.proto.ap_"
2138*6777b538SAndroid Build Coastguard Worker    } else {
2139*6777b538SAndroid Build Coastguard Worker      # resource_sizes.py needs to be able to find the unpacked resources.arsc
2140*6777b538SAndroid Build Coastguard Worker      # file based on apk name to compute normatlized size.
2141*6777b538SAndroid Build Coastguard Worker      _resource_sizes_arsc_path =
2142*6777b538SAndroid Build Coastguard Worker          "$root_out_dir/arsc/" +
2143*6777b538SAndroid Build Coastguard Worker          rebase_path(_final_apk_path_no_ext, root_build_dir) + ".ap_"
2144*6777b538SAndroid Build Coastguard Worker    }
2145*6777b538SAndroid Build Coastguard Worker
2146*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.version_code)) {
2147*6777b538SAndroid Build Coastguard Worker      _version_code = invoker.version_code
2148*6777b538SAndroid Build Coastguard Worker    } else {
2149*6777b538SAndroid Build Coastguard Worker      _version_code = android_default_version_code
2150*6777b538SAndroid Build Coastguard Worker    }
2151*6777b538SAndroid Build Coastguard Worker
2152*6777b538SAndroid Build Coastguard Worker    if (android_override_version_code != "") {
2153*6777b538SAndroid Build Coastguard Worker      _version_code = android_override_version_code
2154*6777b538SAndroid Build Coastguard Worker    }
2155*6777b538SAndroid Build Coastguard Worker
2156*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.version_name)) {
2157*6777b538SAndroid Build Coastguard Worker      _version_name = invoker.version_name
2158*6777b538SAndroid Build Coastguard Worker    } else {
2159*6777b538SAndroid Build Coastguard Worker      _version_name = android_default_version_name
2160*6777b538SAndroid Build Coastguard Worker    }
2161*6777b538SAndroid Build Coastguard Worker
2162*6777b538SAndroid Build Coastguard Worker    if (android_override_version_name != "") {
2163*6777b538SAndroid Build Coastguard Worker      _version_name = android_override_version_name
2164*6777b538SAndroid Build Coastguard Worker    }
2165*6777b538SAndroid Build Coastguard Worker
2166*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
2167*6777b538SAndroid Build Coastguard Worker      _invoker_deps = invoker.deps
2168*6777b538SAndroid Build Coastguard Worker    } else {
2169*6777b538SAndroid Build Coastguard Worker      _invoker_deps = []
2170*6777b538SAndroid Build Coastguard Worker    }
2171*6777b538SAndroid Build Coastguard Worker    _non_java_deps = filter_exclude(_invoker_deps, java_target_patterns)
2172*6777b538SAndroid Build Coastguard Worker    _java_assetres_deps = [ ":${_java_target_name}__assetres" ]
2173*6777b538SAndroid Build Coastguard Worker
2174*6777b538SAndroid Build Coastguard Worker    _srcjar_deps = []
2175*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.srcjar_deps)) {
2176*6777b538SAndroid Build Coastguard Worker      _srcjar_deps = invoker.srcjar_deps
2177*6777b538SAndroid Build Coastguard Worker    }
2178*6777b538SAndroid Build Coastguard Worker
2179*6777b538SAndroid Build Coastguard Worker    _use_chromium_linker =
2180*6777b538SAndroid Build Coastguard Worker        defined(invoker.use_chromium_linker) && invoker.use_chromium_linker
2181*6777b538SAndroid Build Coastguard Worker
2182*6777b538SAndroid Build Coastguard Worker    not_needed([ "_use_chromium_linker" ])
2183*6777b538SAndroid Build Coastguard Worker
2184*6777b538SAndroid Build Coastguard Worker    # The dependency that makes the chromium linker, if any is needed.
2185*6777b538SAndroid Build Coastguard Worker    _native_libs_deps = []
2186*6777b538SAndroid Build Coastguard Worker    _shared_libraries_is_valid =
2187*6777b538SAndroid Build Coastguard Worker        defined(invoker.shared_libraries) && invoker.shared_libraries != []
2188*6777b538SAndroid Build Coastguard Worker
2189*6777b538SAndroid Build Coastguard Worker    if (_shared_libraries_is_valid) {
2190*6777b538SAndroid Build Coastguard Worker      _native_libs_deps += invoker.shared_libraries
2191*6777b538SAndroid Build Coastguard Worker
2192*6777b538SAndroid Build Coastguard Worker      # Write shared library output files of all dependencies to a file. Those
2193*6777b538SAndroid Build Coastguard Worker      # will be the shared libraries packaged into the APK.
2194*6777b538SAndroid Build Coastguard Worker      _shared_library_list_file =
2195*6777b538SAndroid Build Coastguard Worker          "$target_gen_dir/${_template_name}.native_libs"
2196*6777b538SAndroid Build Coastguard Worker      generated_file("${_template_name}__shared_library_list") {
2197*6777b538SAndroid Build Coastguard Worker        deps = _native_libs_deps
2198*6777b538SAndroid Build Coastguard Worker        outputs = [ _shared_library_list_file ]
2199*6777b538SAndroid Build Coastguard Worker        data_keys = [ "shared_libraries" ]
2200*6777b538SAndroid Build Coastguard Worker        walk_keys = [ "shared_libraries_barrier" ]
2201*6777b538SAndroid Build Coastguard Worker        rebase = root_build_dir
2202*6777b538SAndroid Build Coastguard Worker      }
2203*6777b538SAndroid Build Coastguard Worker    } else {
2204*6777b538SAndroid Build Coastguard Worker      # Must exist for instrumentation_test_apk() to depend on.
2205*6777b538SAndroid Build Coastguard Worker      group("${_template_name}__shared_library_list") {
2206*6777b538SAndroid Build Coastguard Worker      }
2207*6777b538SAndroid Build Coastguard Worker    }
2208*6777b538SAndroid Build Coastguard Worker
2209*6777b538SAndroid Build Coastguard Worker    _secondary_abi_native_libs_deps = []
2210*6777b538SAndroid Build Coastguard Worker
2211*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.secondary_abi_shared_libraries) &&
2212*6777b538SAndroid Build Coastguard Worker        invoker.secondary_abi_shared_libraries != []) {
2213*6777b538SAndroid Build Coastguard Worker      _secondary_abi_native_libs_deps = invoker.secondary_abi_shared_libraries
2214*6777b538SAndroid Build Coastguard Worker
2215*6777b538SAndroid Build Coastguard Worker      # Write shared library output files of all dependencies to a file. Those
2216*6777b538SAndroid Build Coastguard Worker      # will be the shared libraries packaged into the APK.
2217*6777b538SAndroid Build Coastguard Worker      _secondary_abi_shared_library_list_file =
2218*6777b538SAndroid Build Coastguard Worker          "$target_gen_dir/${_template_name}.secondary_abi_native_libs"
2219*6777b538SAndroid Build Coastguard Worker      generated_file("${_template_name}__secondary_abi_shared_library_list") {
2220*6777b538SAndroid Build Coastguard Worker        deps = _secondary_abi_native_libs_deps
2221*6777b538SAndroid Build Coastguard Worker        outputs = [ _secondary_abi_shared_library_list_file ]
2222*6777b538SAndroid Build Coastguard Worker        data_keys = [ "shared_libraries" ]
2223*6777b538SAndroid Build Coastguard Worker        walk_keys = [ "shared_libraries_barrier" ]
2224*6777b538SAndroid Build Coastguard Worker        rebase = root_build_dir
2225*6777b538SAndroid Build Coastguard Worker      }
2226*6777b538SAndroid Build Coastguard Worker    } else {
2227*6777b538SAndroid Build Coastguard Worker      # Must exist for instrumentation_test_apk() to depend on.
2228*6777b538SAndroid Build Coastguard Worker      group("${_template_name}__secondary_abi_shared_library_list") {
2229*6777b538SAndroid Build Coastguard Worker      }
2230*6777b538SAndroid Build Coastguard Worker    }
2231*6777b538SAndroid Build Coastguard Worker
2232*6777b538SAndroid Build Coastguard Worker    _rebased_build_config = rebase_path(_build_config, root_build_dir)
2233*6777b538SAndroid Build Coastguard Worker    assert(_rebased_build_config != "")  # Mark as used.
2234*6777b538SAndroid Build Coastguard Worker
2235*6777b538SAndroid Build Coastguard Worker    _generate_productconfig_java =
2236*6777b538SAndroid Build Coastguard Worker        defined(invoker.product_config_java_packages) && !_omit_dex
2237*6777b538SAndroid Build Coastguard Worker
2238*6777b538SAndroid Build Coastguard Worker    _proguard_enabled =
2239*6777b538SAndroid Build Coastguard Worker        defined(invoker.proguard_enabled) && invoker.proguard_enabled
2240*6777b538SAndroid Build Coastguard Worker
2241*6777b538SAndroid Build Coastguard Worker    if (!_is_bundle_module && _proguard_enabled) {
2242*6777b538SAndroid Build Coastguard Worker      _proguard_mapping_path = "$_final_apk_path.mapping"
2243*6777b538SAndroid Build Coastguard Worker    }
2244*6777b538SAndroid Build Coastguard Worker
2245*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.resource_ids_provider_dep)) {
2246*6777b538SAndroid Build Coastguard Worker      _resource_ids_provider_dep = invoker.resource_ids_provider_dep
2247*6777b538SAndroid Build Coastguard Worker    }
2248*6777b538SAndroid Build Coastguard Worker
2249*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.shared_resources_allowlist_target)) {
2250*6777b538SAndroid Build Coastguard Worker      _shared_resources_allowlist_target =
2251*6777b538SAndroid Build Coastguard Worker          invoker.shared_resources_allowlist_target
2252*6777b538SAndroid Build Coastguard Worker    }
2253*6777b538SAndroid Build Coastguard Worker
2254*6777b538SAndroid Build Coastguard Worker    _uses_static_library = defined(invoker.static_library_provider)
2255*6777b538SAndroid Build Coastguard Worker
2256*6777b538SAndroid Build Coastguard Worker    # TODO(crbug.com/864142): Allow incremental installs of bundle modules.
2257*6777b538SAndroid Build Coastguard Worker    _incremental_apk =
2258*6777b538SAndroid Build Coastguard Worker        !_is_bundle_module &&
2259*6777b538SAndroid Build Coastguard Worker        !(defined(invoker.never_incremental) && invoker.never_incremental) &&
2260*6777b538SAndroid Build Coastguard Worker        incremental_install && _min_sdk_version >= default_min_sdk_version
2261*6777b538SAndroid Build Coastguard Worker    if (_incremental_apk) {
2262*6777b538SAndroid Build Coastguard Worker      _target_dir_name = get_label_info(target_name, "dir")
2263*6777b538SAndroid Build Coastguard Worker      _incremental_install_json_path = "$root_out_dir/gen.runtime/$_target_dir_name/$target_name.incremental.json"
2264*6777b538SAndroid Build Coastguard Worker      _incremental_apk_path = "${_final_apk_path_no_ext}_incremental.apk"
2265*6777b538SAndroid Build Coastguard Worker    }
2266*6777b538SAndroid Build Coastguard Worker
2267*6777b538SAndroid Build Coastguard Worker    if (!_incremental_apk && !_omit_dex) {
2268*6777b538SAndroid Build Coastguard Worker      # Bundle modules don't build the dex here, but need to write this path
2269*6777b538SAndroid Build Coastguard Worker      # to their .build_config.json file only when proguarding.
2270*6777b538SAndroid Build Coastguard Worker      if (_proguard_enabled) {
2271*6777b538SAndroid Build Coastguard Worker        _final_dex_path = "$_base_path.r8dex.jar"
2272*6777b538SAndroid Build Coastguard Worker      } else if (!_is_bundle_module) {
2273*6777b538SAndroid Build Coastguard Worker        _final_dex_path = "$_base_path.mergeddex.jar"
2274*6777b538SAndroid Build Coastguard Worker      }
2275*6777b538SAndroid Build Coastguard Worker    }
2276*6777b538SAndroid Build Coastguard Worker
2277*6777b538SAndroid Build Coastguard Worker    _android_manifest =
2278*6777b538SAndroid Build Coastguard Worker        "$target_gen_dir/${_template_name}/AndroidManifest.merged.xml"
2279*6777b538SAndroid Build Coastguard Worker    _merge_manifest_target = "${_template_name}__merge_manifests"
2280*6777b538SAndroid Build Coastguard Worker    merge_manifests(_merge_manifest_target) {
2281*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
2282*6777b538SAndroid Build Coastguard Worker                             [
2283*6777b538SAndroid Build Coastguard Worker                               "manifest_package",
2284*6777b538SAndroid Build Coastguard Worker                               "max_sdk_version",
2285*6777b538SAndroid Build Coastguard Worker                             ])
2286*6777b538SAndroid Build Coastguard Worker      input_manifest = invoker.android_manifest
2287*6777b538SAndroid Build Coastguard Worker      output_manifest = _android_manifest
2288*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
2289*6777b538SAndroid Build Coastguard Worker      min_sdk_version = _min_sdk_version
2290*6777b538SAndroid Build Coastguard Worker      target_sdk_version = _target_sdk_version
2291*6777b538SAndroid Build Coastguard Worker
2292*6777b538SAndroid Build Coastguard Worker      # Depend on android_resources() targets that use generated files
2293*6777b538SAndroid Build Coastguard Worker      # in mergeable_android_manifests (such as android_aar_prebuilt).
2294*6777b538SAndroid Build Coastguard Worker      deps = _java_assetres_deps + [ ":$_build_config_target" ]
2295*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.android_manifest_dep)) {
2296*6777b538SAndroid Build Coastguard Worker        deps += [ invoker.android_manifest_dep ]
2297*6777b538SAndroid Build Coastguard Worker      }
2298*6777b538SAndroid Build Coastguard Worker    }
2299*6777b538SAndroid Build Coastguard Worker
2300*6777b538SAndroid Build Coastguard Worker    _final_deps = [ ":$_java_target_name" ]
2301*6777b538SAndroid Build Coastguard Worker
2302*6777b538SAndroid Build Coastguard Worker    _generated_proguard_config = "$_base_path.resources.proguard.txt"
2303*6777b538SAndroid Build Coastguard Worker
2304*6777b538SAndroid Build Coastguard Worker    if (defined(_shared_resources_allowlist_target)) {
2305*6777b538SAndroid Build Coastguard Worker      _allowlist_gen_dir =
2306*6777b538SAndroid Build Coastguard Worker          get_label_info(_shared_resources_allowlist_target, "target_gen_dir")
2307*6777b538SAndroid Build Coastguard Worker      _allowlist_target_name =
2308*6777b538SAndroid Build Coastguard Worker          get_label_info(_shared_resources_allowlist_target, "name")
2309*6777b538SAndroid Build Coastguard Worker      _allowlist_r_txt_path =
2310*6777b538SAndroid Build Coastguard Worker          "${_allowlist_gen_dir}/${_allowlist_target_name}" +
2311*6777b538SAndroid Build Coastguard Worker          "__compile_resources_R.txt"
2312*6777b538SAndroid Build Coastguard Worker      _allowlist_deps =
2313*6777b538SAndroid Build Coastguard Worker          "${_shared_resources_allowlist_target}__compile_resources"
2314*6777b538SAndroid Build Coastguard Worker    }
2315*6777b538SAndroid Build Coastguard Worker
2316*6777b538SAndroid Build Coastguard Worker    if (_incremental_apk) {
2317*6777b538SAndroid Build Coastguard Worker      _incremental_android_manifest =
2318*6777b538SAndroid Build Coastguard Worker          "$target_gen_dir/${_template_name}/AndroidManifest.incremental.xml"
2319*6777b538SAndroid Build Coastguard Worker      _incremental_manifest_target_name = "${target_name}__incremental_manifest"
2320*6777b538SAndroid Build Coastguard Worker      action_with_pydeps(_incremental_manifest_target_name) {
2321*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_merge_manifest_target" ]
2322*6777b538SAndroid Build Coastguard Worker        script =
2323*6777b538SAndroid Build Coastguard Worker            "//build/android/incremental_install/generate_android_manifest.py"
2324*6777b538SAndroid Build Coastguard Worker        inputs = [ _android_manifest ]
2325*6777b538SAndroid Build Coastguard Worker        outputs = [ _incremental_android_manifest ]
2326*6777b538SAndroid Build Coastguard Worker
2327*6777b538SAndroid Build Coastguard Worker        args = [
2328*6777b538SAndroid Build Coastguard Worker          "--disable-isolated-processes",
2329*6777b538SAndroid Build Coastguard Worker          "--src-manifest",
2330*6777b538SAndroid Build Coastguard Worker          rebase_path(_android_manifest, root_build_dir),
2331*6777b538SAndroid Build Coastguard Worker          "--dst-manifest",
2332*6777b538SAndroid Build Coastguard Worker          rebase_path(_incremental_android_manifest, root_build_dir),
2333*6777b538SAndroid Build Coastguard Worker        ]
2334*6777b538SAndroid Build Coastguard Worker      }
2335*6777b538SAndroid Build Coastguard Worker    }
2336*6777b538SAndroid Build Coastguard Worker
2337*6777b538SAndroid Build Coastguard Worker    _compile_resources_target = "${_template_name}__compile_resources"
2338*6777b538SAndroid Build Coastguard Worker    _compile_resources_rtxt_out =
2339*6777b538SAndroid Build Coastguard Worker        "${target_gen_dir}/${_compile_resources_target}_R.txt"
2340*6777b538SAndroid Build Coastguard Worker    _compile_resources_emit_ids_out =
2341*6777b538SAndroid Build Coastguard Worker        "${target_gen_dir}/${_compile_resources_target}.resource_ids"
2342*6777b538SAndroid Build Coastguard Worker    compile_resources(_compile_resources_target) {
2343*6777b538SAndroid Build Coastguard Worker      forward_variables_from(
2344*6777b538SAndroid Build Coastguard Worker          invoker,
2345*6777b538SAndroid Build Coastguard Worker          [
2346*6777b538SAndroid Build Coastguard Worker            "aapt_locale_allowlist",
2347*6777b538SAndroid Build Coastguard Worker            "app_as_shared_lib",
2348*6777b538SAndroid Build Coastguard Worker            "enforce_resource_overlays_in_tests",
2349*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest",
2350*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_base",
2351*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_library_version_offset",
2352*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_version_code_offset",
2353*6777b538SAndroid Build Coastguard Worker            "manifest_package",
2354*6777b538SAndroid Build Coastguard Worker            "max_sdk_version",
2355*6777b538SAndroid Build Coastguard Worker            "override_target_sdk",
2356*6777b538SAndroid Build Coastguard Worker            "package_id",
2357*6777b538SAndroid Build Coastguard Worker            "png_to_webp",
2358*6777b538SAndroid Build Coastguard Worker            "r_java_root_package_name",
2359*6777b538SAndroid Build Coastguard Worker            "resource_exclusion_exceptions",
2360*6777b538SAndroid Build Coastguard Worker            "resource_exclusion_regex",
2361*6777b538SAndroid Build Coastguard Worker            "resource_values_filter_rules",
2362*6777b538SAndroid Build Coastguard Worker            "shared_resources",
2363*6777b538SAndroid Build Coastguard Worker            "shared_resources_allowlist_locales",
2364*6777b538SAndroid Build Coastguard Worker            "uses_split",
2365*6777b538SAndroid Build Coastguard Worker          ])
2366*6777b538SAndroid Build Coastguard Worker      android_manifest = _android_manifest
2367*6777b538SAndroid Build Coastguard Worker      android_manifest_dep = ":$_merge_manifest_target"
2368*6777b538SAndroid Build Coastguard Worker      version_code = _version_code
2369*6777b538SAndroid Build Coastguard Worker      version_name = _version_name
2370*6777b538SAndroid Build Coastguard Worker      min_sdk_version = _min_sdk_version
2371*6777b538SAndroid Build Coastguard Worker      target_sdk_version = _target_sdk_version
2372*6777b538SAndroid Build Coastguard Worker
2373*6777b538SAndroid Build Coastguard Worker      if (defined(expected_android_manifest)) {
2374*6777b538SAndroid Build Coastguard Worker        top_target_name = _template_name
2375*6777b538SAndroid Build Coastguard Worker      }
2376*6777b538SAndroid Build Coastguard Worker
2377*6777b538SAndroid Build Coastguard Worker      if (defined(_resource_ids_provider_dep)) {
2378*6777b538SAndroid Build Coastguard Worker        resource_ids_provider_dep = _resource_ids_provider_dep
2379*6777b538SAndroid Build Coastguard Worker      }
2380*6777b538SAndroid Build Coastguard Worker
2381*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.module_name)) {
2382*6777b538SAndroid Build Coastguard Worker        package_name = invoker.module_name
2383*6777b538SAndroid Build Coastguard Worker      }
2384*6777b538SAndroid Build Coastguard Worker
2385*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.post_process_package_resources_script)) {
2386*6777b538SAndroid Build Coastguard Worker        post_process_script = invoker.post_process_package_resources_script
2387*6777b538SAndroid Build Coastguard Worker      }
2388*6777b538SAndroid Build Coastguard Worker      r_text_out_path = _compile_resources_rtxt_out
2389*6777b538SAndroid Build Coastguard Worker      emit_ids_out_path = _compile_resources_emit_ids_out
2390*6777b538SAndroid Build Coastguard Worker      size_info_path = _res_size_info_path
2391*6777b538SAndroid Build Coastguard Worker      proguard_file = _generated_proguard_config
2392*6777b538SAndroid Build Coastguard Worker
2393*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
2394*6777b538SAndroid Build Coastguard Worker      build_config_dep = ":$_build_config_target"
2395*6777b538SAndroid Build Coastguard Worker      deps = _java_assetres_deps + _non_java_deps
2396*6777b538SAndroid Build Coastguard Worker
2397*6777b538SAndroid Build Coastguard Worker      if (_incremental_apk) {
2398*6777b538SAndroid Build Coastguard Worker        android_manifest = _incremental_android_manifest
2399*6777b538SAndroid Build Coastguard Worker        android_manifest_dep = ":$_incremental_manifest_target_name"
2400*6777b538SAndroid Build Coastguard Worker      }
2401*6777b538SAndroid Build Coastguard Worker
2402*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.apk_under_test)) {
2403*6777b538SAndroid Build Coastguard Worker        # Set the arsc package name to match the apk_under_test package name
2404*6777b538SAndroid Build Coastguard Worker        # So that test resources can references under_test resources via
2405*6777b538SAndroid Build Coastguard Worker        # @type/name syntax.
2406*6777b538SAndroid Build Coastguard Worker        r_java_root_package_name = "test"
2407*6777b538SAndroid Build Coastguard Worker        arsc_package_name =
2408*6777b538SAndroid Build Coastguard Worker            "@FileArg($_rebased_build_config:deps_info:arsc_package_name)"
2409*6777b538SAndroid Build Coastguard Worker
2410*6777b538SAndroid Build Coastguard Worker        # Passing in the --emit-ids mapping will cause aapt2 to assign resources
2411*6777b538SAndroid Build Coastguard Worker        # IDs that do not conflict with those from apk_under_test.
2412*6777b538SAndroid Build Coastguard Worker        assert(!defined(resource_ids_provider_dep))
2413*6777b538SAndroid Build Coastguard Worker        resource_ids_provider_dep = invoker.apk_under_test
2414*6777b538SAndroid Build Coastguard Worker
2415*6777b538SAndroid Build Coastguard Worker        _link_against = invoker.apk_under_test
2416*6777b538SAndroid Build Coastguard Worker      }
2417*6777b538SAndroid Build Coastguard Worker
2418*6777b538SAndroid Build Coastguard Worker      if (_is_bundle_module) {
2419*6777b538SAndroid Build Coastguard Worker        is_bundle_module = true
2420*6777b538SAndroid Build Coastguard Worker        proto_output = _proto_resources_path
2421*6777b538SAndroid Build Coastguard Worker
2422*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.base_module_target)) {
2423*6777b538SAndroid Build Coastguard Worker          _link_against = invoker.base_module_target
2424*6777b538SAndroid Build Coastguard Worker        }
2425*6777b538SAndroid Build Coastguard Worker      }
2426*6777b538SAndroid Build Coastguard Worker
2427*6777b538SAndroid Build Coastguard Worker      if (defined(_link_against)) {
2428*6777b538SAndroid Build Coastguard Worker        deps += [ "${_link_against}__compile_resources" ]
2429*6777b538SAndroid Build Coastguard Worker        include_resource = get_label_info(_link_against, "target_out_dir") +
2430*6777b538SAndroid Build Coastguard Worker                           "/" + get_label_info(_link_against, "name") + ".ap_"
2431*6777b538SAndroid Build Coastguard Worker      }
2432*6777b538SAndroid Build Coastguard Worker
2433*6777b538SAndroid Build Coastguard Worker      # Bundle modules have to reference resources from the base module.
2434*6777b538SAndroid Build Coastguard Worker      if (_is_base_module) {
2435*6777b538SAndroid Build Coastguard Worker        arsc_output = _arsc_resources_path
2436*6777b538SAndroid Build Coastguard Worker      }
2437*6777b538SAndroid Build Coastguard Worker
2438*6777b538SAndroid Build Coastguard Worker      if (defined(_shared_resources_allowlist_target)) {
2439*6777b538SAndroid Build Coastguard Worker        # Used to ensure that the WebView resources are properly shared
2440*6777b538SAndroid Build Coastguard Worker        # (i.e. are non-final and with package ID 0).
2441*6777b538SAndroid Build Coastguard Worker        shared_resources_allowlist = _allowlist_r_txt_path
2442*6777b538SAndroid Build Coastguard Worker        deps += [ _allowlist_deps ]
2443*6777b538SAndroid Build Coastguard Worker      }
2444*6777b538SAndroid Build Coastguard Worker    }
2445*6777b538SAndroid Build Coastguard Worker    _srcjar_deps += [ ":$_compile_resources_target" ]
2446*6777b538SAndroid Build Coastguard Worker
2447*6777b538SAndroid Build Coastguard Worker    # We don't ship apks anymore, only optimize bundle builds
2448*6777b538SAndroid Build Coastguard Worker    if (_is_bundle_module) {
2449*6777b538SAndroid Build Coastguard Worker      _short_resource_paths =
2450*6777b538SAndroid Build Coastguard Worker          defined(invoker.short_resource_paths) &&
2451*6777b538SAndroid Build Coastguard Worker          invoker.short_resource_paths && enable_arsc_obfuscation
2452*6777b538SAndroid Build Coastguard Worker      _strip_resource_names =
2453*6777b538SAndroid Build Coastguard Worker          defined(invoker.strip_resource_names) &&
2454*6777b538SAndroid Build Coastguard Worker          invoker.strip_resource_names && enable_arsc_obfuscation
2455*6777b538SAndroid Build Coastguard Worker      _strip_unused_resources =
2456*6777b538SAndroid Build Coastguard Worker          defined(invoker.strip_unused_resources) &&
2457*6777b538SAndroid Build Coastguard Worker          invoker.strip_unused_resources && enable_unused_resource_stripping
2458*6777b538SAndroid Build Coastguard Worker      _optimize_resources = _strip_resource_names || _short_resource_paths ||
2459*6777b538SAndroid Build Coastguard Worker                            _strip_unused_resources
2460*6777b538SAndroid Build Coastguard Worker    }
2461*6777b538SAndroid Build Coastguard Worker
2462*6777b538SAndroid Build Coastguard Worker    if (_is_bundle_module && _optimize_resources) {
2463*6777b538SAndroid Build Coastguard Worker      _optimized_proto_resources_path =
2464*6777b538SAndroid Build Coastguard Worker          "$target_out_dir/$target_name.optimized.proto.ap_"
2465*6777b538SAndroid Build Coastguard Worker      if (_short_resource_paths) {
2466*6777b538SAndroid Build Coastguard Worker        _resources_path_map_out_path =
2467*6777b538SAndroid Build Coastguard Worker            "${target_gen_dir}/${_template_name}_resources_path_map.txt"
2468*6777b538SAndroid Build Coastguard Worker      }
2469*6777b538SAndroid Build Coastguard Worker      _optimize_resources_target = "${_template_name}__optimize_resources"
2470*6777b538SAndroid Build Coastguard Worker      optimize_resources(_optimize_resources_target) {
2471*6777b538SAndroid Build Coastguard Worker        deps = _non_java_deps + [ ":$_compile_resources_target" ]
2472*6777b538SAndroid Build Coastguard Worker        short_resource_paths = _short_resource_paths
2473*6777b538SAndroid Build Coastguard Worker        strip_resource_names = _strip_resource_names
2474*6777b538SAndroid Build Coastguard Worker        if (_short_resource_paths) {
2475*6777b538SAndroid Build Coastguard Worker          resources_path_map_out_path = _resources_path_map_out_path
2476*6777b538SAndroid Build Coastguard Worker        }
2477*6777b538SAndroid Build Coastguard Worker        r_text_path = _compile_resources_rtxt_out
2478*6777b538SAndroid Build Coastguard Worker        proto_input_path = _proto_resources_path
2479*6777b538SAndroid Build Coastguard Worker        optimized_proto_output = _optimized_proto_resources_path
2480*6777b538SAndroid Build Coastguard Worker        if (_strip_unused_resources) {
2481*6777b538SAndroid Build Coastguard Worker          # These need to be kept in sync with the target names + output paths
2482*6777b538SAndroid Build Coastguard Worker          # in the android_app_bundle template.
2483*6777b538SAndroid Build Coastguard Worker          _unused_resources_target = "${_template_name}__unused_resources"
2484*6777b538SAndroid Build Coastguard Worker          _unused_resources_config_path =
2485*6777b538SAndroid Build Coastguard Worker              "$target_gen_dir/${_template_name}_unused_resources.config"
2486*6777b538SAndroid Build Coastguard Worker          resources_config_paths = [ _unused_resources_config_path ]
2487*6777b538SAndroid Build Coastguard Worker          deps += [ ":$_unused_resources_target" ]
2488*6777b538SAndroid Build Coastguard Worker        } else {
2489*6777b538SAndroid Build Coastguard Worker          resources_config_paths = []
2490*6777b538SAndroid Build Coastguard Worker        }
2491*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.resources_config_paths)) {
2492*6777b538SAndroid Build Coastguard Worker          resources_config_paths += invoker.resources_config_paths
2493*6777b538SAndroid Build Coastguard Worker        }
2494*6777b538SAndroid Build Coastguard Worker      }
2495*6777b538SAndroid Build Coastguard Worker
2496*6777b538SAndroid Build Coastguard Worker      if (_strip_unused_resources) {
2497*6777b538SAndroid Build Coastguard Worker        # Copy the unused resources config to the final bundle output dir.
2498*6777b538SAndroid Build Coastguard Worker        _copy_unused_resources_target =
2499*6777b538SAndroid Build Coastguard Worker            "${_template_name}__copy_unused_resources"
2500*6777b538SAndroid Build Coastguard Worker        _final_deps += [ ":$_copy_unused_resources_target" ]
2501*6777b538SAndroid Build Coastguard Worker      }
2502*6777b538SAndroid Build Coastguard Worker    } else {
2503*6777b538SAndroid Build Coastguard Worker      not_needed(invoker, [ "resources_config_paths" ])
2504*6777b538SAndroid Build Coastguard Worker    }
2505*6777b538SAndroid Build Coastguard Worker
2506*6777b538SAndroid Build Coastguard Worker    if (!_is_bundle_module) {
2507*6777b538SAndroid Build Coastguard Worker      # Output the R.txt file to a more easily discoverable location for
2508*6777b538SAndroid Build Coastguard Worker      # archiving. This is necessary when stripping resource names so that we
2509*6777b538SAndroid Build Coastguard Worker      # have an archive of resource names to ids for shipped apks (for
2510*6777b538SAndroid Build Coastguard Worker      # debugging purposes). We copy the file rather than change the location
2511*6777b538SAndroid Build Coastguard Worker      # of the original because other targets rely on the location of the R.txt
2512*6777b538SAndroid Build Coastguard Worker      # file.
2513*6777b538SAndroid Build Coastguard Worker      _copy_rtxt_target = "${_template_name}__copy_rtxt"
2514*6777b538SAndroid Build Coastguard Worker      copy(_copy_rtxt_target) {
2515*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_compile_resources_target" ]
2516*6777b538SAndroid Build Coastguard Worker        sources = [ _compile_resources_rtxt_out ]
2517*6777b538SAndroid Build Coastguard Worker        outputs = [ _final_rtxt_path ]
2518*6777b538SAndroid Build Coastguard Worker      }
2519*6777b538SAndroid Build Coastguard Worker      _final_deps += [ ":$_copy_rtxt_target" ]
2520*6777b538SAndroid Build Coastguard Worker    }
2521*6777b538SAndroid Build Coastguard Worker
2522*6777b538SAndroid Build Coastguard Worker    if (defined(_resource_sizes_arsc_path)) {
2523*6777b538SAndroid Build Coastguard Worker      _copy_arsc_target = "${_template_name}__copy_arsc"
2524*6777b538SAndroid Build Coastguard Worker      copy(_copy_arsc_target) {
2525*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_compile_resources_target" ]
2526*6777b538SAndroid Build Coastguard Worker
2527*6777b538SAndroid Build Coastguard Worker        # resource_sizes.py doesn't care if it gets the optimized .arsc.
2528*6777b538SAndroid Build Coastguard Worker        sources = [ _arsc_resources_path ]
2529*6777b538SAndroid Build Coastguard Worker        outputs = [ _resource_sizes_arsc_path ]
2530*6777b538SAndroid Build Coastguard Worker      }
2531*6777b538SAndroid Build Coastguard Worker      _final_deps += [ ":$_copy_arsc_target" ]
2532*6777b538SAndroid Build Coastguard Worker    }
2533*6777b538SAndroid Build Coastguard Worker
2534*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.generate_native_libraries_java)) {
2535*6777b538SAndroid Build Coastguard Worker      _generate_native_libraries_java = invoker.generate_native_libraries_java
2536*6777b538SAndroid Build Coastguard Worker    } else {
2537*6777b538SAndroid Build Coastguard Worker      _generate_native_libraries_java =
2538*6777b538SAndroid Build Coastguard Worker          _is_base_module && !_omit_dex && !defined(invoker.apk_under_test)
2539*6777b538SAndroid Build Coastguard Worker    }
2540*6777b538SAndroid Build Coastguard Worker    if (_generate_native_libraries_java) {
2541*6777b538SAndroid Build Coastguard Worker      write_native_libraries_java("${_template_name}__native_libraries") {
2542*6777b538SAndroid Build Coastguard Worker        # Do not add a dep on the generated_file target in order to avoid having
2543*6777b538SAndroid Build Coastguard Worker        # to build the native libraries before this target. The dependency is
2544*6777b538SAndroid Build Coastguard Worker        # instead captured via a depfile.
2545*6777b538SAndroid Build Coastguard Worker        if (_uses_static_library) {
2546*6777b538SAndroid Build Coastguard Worker          _prefix = get_label_info(invoker.static_library_provider,
2547*6777b538SAndroid Build Coastguard Worker                                   "target_gen_dir") + "/" +
2548*6777b538SAndroid Build Coastguard Worker                    get_label_info(invoker.static_library_provider, "name")
2549*6777b538SAndroid Build Coastguard Worker          if (defined(invoker.static_library_provider_use_secondary_abi) &&
2550*6777b538SAndroid Build Coastguard Worker              invoker.static_library_provider_use_secondary_abi) {
2551*6777b538SAndroid Build Coastguard Worker            native_libraries_list_file = "${_prefix}.secondary_abi_native_libs"
2552*6777b538SAndroid Build Coastguard Worker            _use_secondary_abi = true
2553*6777b538SAndroid Build Coastguard Worker          } else {
2554*6777b538SAndroid Build Coastguard Worker            native_libraries_list_file = "${_prefix}.native_libs"
2555*6777b538SAndroid Build Coastguard Worker            _use_secondary_abi = false
2556*6777b538SAndroid Build Coastguard Worker          }
2557*6777b538SAndroid Build Coastguard Worker        } else if (_native_libs_deps != []) {
2558*6777b538SAndroid Build Coastguard Worker          native_libraries_list_file = _shared_library_list_file
2559*6777b538SAndroid Build Coastguard Worker          _use_secondary_abi = false
2560*6777b538SAndroid Build Coastguard Worker        } else if (_secondary_abi_native_libs_deps != []) {
2561*6777b538SAndroid Build Coastguard Worker          native_libraries_list_file = _secondary_abi_shared_library_list_file
2562*6777b538SAndroid Build Coastguard Worker          _use_secondary_abi = true
2563*6777b538SAndroid Build Coastguard Worker        }
2564*6777b538SAndroid Build Coastguard Worker
2565*6777b538SAndroid Build Coastguard Worker        if (defined(_use_secondary_abi)) {
2566*6777b538SAndroid Build Coastguard Worker          if (_use_secondary_abi || !android_64bit_target_cpu) {
2567*6777b538SAndroid Build Coastguard Worker            native_lib_32_bit = true
2568*6777b538SAndroid Build Coastguard Worker          } else {
2569*6777b538SAndroid Build Coastguard Worker            native_lib_64_bit = true
2570*6777b538SAndroid Build Coastguard Worker          }
2571*6777b538SAndroid Build Coastguard Worker        }
2572*6777b538SAndroid Build Coastguard Worker
2573*6777b538SAndroid Build Coastguard Worker        enable_chromium_linker = _use_chromium_linker
2574*6777b538SAndroid Build Coastguard Worker        use_final_fields = true
2575*6777b538SAndroid Build Coastguard Worker      }
2576*6777b538SAndroid Build Coastguard Worker      _srcjar_deps += [ ":${_template_name}__native_libraries" ]
2577*6777b538SAndroid Build Coastguard Worker    }
2578*6777b538SAndroid Build Coastguard Worker
2579*6777b538SAndroid Build Coastguard Worker    _loadable_modules = []
2580*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.loadable_modules)) {
2581*6777b538SAndroid Build Coastguard Worker      _loadable_modules = invoker.loadable_modules
2582*6777b538SAndroid Build Coastguard Worker    }
2583*6777b538SAndroid Build Coastguard Worker
2584*6777b538SAndroid Build Coastguard Worker    if (_native_libs_deps != []) {
2585*6777b538SAndroid Build Coastguard Worker      _loadable_modules += _sanitizer_runtimes
2586*6777b538SAndroid Build Coastguard Worker    }
2587*6777b538SAndroid Build Coastguard Worker
2588*6777b538SAndroid Build Coastguard Worker    _assertions_implicitly_enabled = defined(invoker.custom_assertion_handler)
2589*6777b538SAndroid Build Coastguard Worker
2590*6777b538SAndroid Build Coastguard Worker    # Many possible paths where we wouldn't use this variable.
2591*6777b538SAndroid Build Coastguard Worker    not_needed([ "_assertions_implicitly_enabled" ])
2592*6777b538SAndroid Build Coastguard Worker
2593*6777b538SAndroid Build Coastguard Worker    _generate_buildconfig_java = !defined(invoker.apk_under_test) && !_omit_dex
2594*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.generate_buildconfig_java)) {
2595*6777b538SAndroid Build Coastguard Worker      _generate_buildconfig_java = invoker.generate_buildconfig_java
2596*6777b538SAndroid Build Coastguard Worker    }
2597*6777b538SAndroid Build Coastguard Worker    if (_generate_buildconfig_java) {
2598*6777b538SAndroid Build Coastguard Worker      generate_build_config_srcjar("${_template_name}__build_config_srcjar") {
2599*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, [ "isolated_splits_enabled" ])
2600*6777b538SAndroid Build Coastguard Worker        _bundles_supported = _is_bundle_module
2601*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.bundles_supported)) {
2602*6777b538SAndroid Build Coastguard Worker          _bundles_supported = invoker.bundles_supported
2603*6777b538SAndroid Build Coastguard Worker        }
2604*6777b538SAndroid Build Coastguard Worker        bundles_supported = _bundles_supported
2605*6777b538SAndroid Build Coastguard Worker        use_final_fields = true
2606*6777b538SAndroid Build Coastguard Worker        assertions_implicitly_enabled = _assertions_implicitly_enabled
2607*6777b538SAndroid Build Coastguard Worker        is_incremental_install = _incremental_apk
2608*6777b538SAndroid Build Coastguard Worker        version_code = _version_code
2609*6777b538SAndroid Build Coastguard Worker        min_sdk_version = _min_sdk_version
2610*6777b538SAndroid Build Coastguard Worker        write_clang_profiling_data =
2611*6777b538SAndroid Build Coastguard Worker            use_clang_coverage && _generate_native_libraries_java
2612*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.build_config_include_product_version_resource) &&
2613*6777b538SAndroid Build Coastguard Worker            invoker.build_config_include_product_version_resource) {
2614*6777b538SAndroid Build Coastguard Worker          resources_version_variable =
2615*6777b538SAndroid Build Coastguard Worker              "org.chromium.base.R.string.product_version"
2616*6777b538SAndroid Build Coastguard Worker        }
2617*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_build_config_target" ]
2618*6777b538SAndroid Build Coastguard Worker      }
2619*6777b538SAndroid Build Coastguard Worker      _srcjar_deps += [ ":${_template_name}__build_config_srcjar" ]
2620*6777b538SAndroid Build Coastguard Worker    }
2621*6777b538SAndroid Build Coastguard Worker
2622*6777b538SAndroid Build Coastguard Worker    if (_generate_productconfig_java) {
2623*6777b538SAndroid Build Coastguard Worker      foreach(_package, invoker.product_config_java_packages) {
2624*6777b538SAndroid Build Coastguard Worker        _locale_target_name =
2625*6777b538SAndroid Build Coastguard Worker            "${_template_name}_${_package}__product_config_srcjar"
2626*6777b538SAndroid Build Coastguard Worker        generate_product_config_srcjar("$_locale_target_name") {
2627*6777b538SAndroid Build Coastguard Worker          forward_variables_from(invoker, [ "is_bundle_module" ])
2628*6777b538SAndroid Build Coastguard Worker          build_config = _build_config
2629*6777b538SAndroid Build Coastguard Worker          java_package = _package
2630*6777b538SAndroid Build Coastguard Worker          use_chromium_linker = _use_chromium_linker
2631*6777b538SAndroid Build Coastguard Worker          deps = [ ":$_build_config_target" ]
2632*6777b538SAndroid Build Coastguard Worker        }
2633*6777b538SAndroid Build Coastguard Worker        _srcjar_deps += [ ":$_locale_target_name" ]
2634*6777b538SAndroid Build Coastguard Worker      }
2635*6777b538SAndroid Build Coastguard Worker    }
2636*6777b538SAndroid Build Coastguard Worker
2637*6777b538SAndroid Build Coastguard Worker    if (_is_bundle_module) {
2638*6777b538SAndroid Build Coastguard Worker      _add_view_trace_events =
2639*6777b538SAndroid Build Coastguard Worker          defined(invoker.add_view_trace_events) &&
2640*6777b538SAndroid Build Coastguard Worker          invoker.add_view_trace_events && enable_trace_event_bytecode_rewriting
2641*6777b538SAndroid Build Coastguard Worker    }
2642*6777b538SAndroid Build Coastguard Worker
2643*6777b538SAndroid Build Coastguard Worker    # We cannot skip this target when omit_dex = true because it writes the
2644*6777b538SAndroid Build Coastguard Worker    # build_config.json.
2645*6777b538SAndroid Build Coastguard Worker    java_library_impl(_java_target_name) {
2646*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
2647*6777b538SAndroid Build Coastguard Worker                             [
2648*6777b538SAndroid Build Coastguard Worker                               "alternative_android_sdk_dep",
2649*6777b538SAndroid Build Coastguard Worker                               "android_manifest",
2650*6777b538SAndroid Build Coastguard Worker                               "android_manifest_dep",
2651*6777b538SAndroid Build Coastguard Worker                               "annotation_processor_deps",
2652*6777b538SAndroid Build Coastguard Worker                               "apk_under_test",
2653*6777b538SAndroid Build Coastguard Worker                               "asset_deps",
2654*6777b538SAndroid Build Coastguard Worker                               "base_module_target",
2655*6777b538SAndroid Build Coastguard Worker                               "chromium_code",
2656*6777b538SAndroid Build Coastguard Worker                               "deps",
2657*6777b538SAndroid Build Coastguard Worker                               "jacoco_never_instrument",
2658*6777b538SAndroid Build Coastguard Worker                               "jar_excluded_patterns",
2659*6777b538SAndroid Build Coastguard Worker                               "javac_args",
2660*6777b538SAndroid Build Coastguard Worker                               "mergeable_android_manifests",
2661*6777b538SAndroid Build Coastguard Worker                               "native_lib_placeholders",
2662*6777b538SAndroid Build Coastguard Worker                               "parent_module_target",
2663*6777b538SAndroid Build Coastguard Worker                               "processor_args_javac",
2664*6777b538SAndroid Build Coastguard Worker                               "secondary_abi_loadable_modules",
2665*6777b538SAndroid Build Coastguard Worker                               "secondary_native_lib_placeholders",
2666*6777b538SAndroid Build Coastguard Worker                               "sources",
2667*6777b538SAndroid Build Coastguard Worker                               "library_always_compress",
2668*6777b538SAndroid Build Coastguard Worker                             ])
2669*6777b538SAndroid Build Coastguard Worker      version_code = _version_code
2670*6777b538SAndroid Build Coastguard Worker      version_name = _version_name
2671*6777b538SAndroid Build Coastguard Worker      if (_is_bundle_module) {
2672*6777b538SAndroid Build Coastguard Worker        type = "android_app_bundle_module"
2673*6777b538SAndroid Build Coastguard Worker        res_size_info_path = _res_size_info_path
2674*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.module_name)) {
2675*6777b538SAndroid Build Coastguard Worker          module_name = invoker.module_name
2676*6777b538SAndroid Build Coastguard Worker        } else {
2677*6777b538SAndroid Build Coastguard Worker          module_name = "base"
2678*6777b538SAndroid Build Coastguard Worker        }
2679*6777b538SAndroid Build Coastguard Worker        add_view_trace_events = _add_view_trace_events
2680*6777b538SAndroid Build Coastguard Worker      } else {
2681*6777b538SAndroid Build Coastguard Worker        type = "android_apk"
2682*6777b538SAndroid Build Coastguard Worker      }
2683*6777b538SAndroid Build Coastguard Worker      r_text_path = _compile_resources_rtxt_out
2684*6777b538SAndroid Build Coastguard Worker      main_target_name = _template_name
2685*6777b538SAndroid Build Coastguard Worker      supports_android = true
2686*6777b538SAndroid Build Coastguard Worker      requires_android = true
2687*6777b538SAndroid Build Coastguard Worker      srcjar_deps = _srcjar_deps
2688*6777b538SAndroid Build Coastguard Worker      merged_android_manifest = _android_manifest
2689*6777b538SAndroid Build Coastguard Worker      if (defined(_final_dex_path)) {
2690*6777b538SAndroid Build Coastguard Worker        final_dex_path = _final_dex_path
2691*6777b538SAndroid Build Coastguard Worker      }
2692*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.assert_no_native_deps)) {
2693*6777b538SAndroid Build Coastguard Worker        assert_no_deps = invoker.assert_no_native_deps
2694*6777b538SAndroid Build Coastguard Worker      }
2695*6777b538SAndroid Build Coastguard Worker
2696*6777b538SAndroid Build Coastguard Worker      if (_is_bundle_module) {
2697*6777b538SAndroid Build Coastguard Worker        proto_resources_path = _proto_resources_path
2698*6777b538SAndroid Build Coastguard Worker        if (_optimize_resources) {
2699*6777b538SAndroid Build Coastguard Worker          proto_resources_path = _optimized_proto_resources_path
2700*6777b538SAndroid Build Coastguard Worker          if (_short_resource_paths) {
2701*6777b538SAndroid Build Coastguard Worker            module_pathmap_path = _resources_path_map_out_path
2702*6777b538SAndroid Build Coastguard Worker          }
2703*6777b538SAndroid Build Coastguard Worker        }
2704*6777b538SAndroid Build Coastguard Worker      } else {
2705*6777b538SAndroid Build Coastguard Worker        apk_path = _final_apk_path
2706*6777b538SAndroid Build Coastguard Worker        if (_incremental_apk) {
2707*6777b538SAndroid Build Coastguard Worker          incremental_apk_path = _incremental_apk_path
2708*6777b538SAndroid Build Coastguard Worker          incremental_install_json_path = _incremental_install_json_path
2709*6777b538SAndroid Build Coastguard Worker        }
2710*6777b538SAndroid Build Coastguard Worker      }
2711*6777b538SAndroid Build Coastguard Worker
2712*6777b538SAndroid Build Coastguard Worker      proguard_enabled = _proguard_enabled
2713*6777b538SAndroid Build Coastguard Worker      if (_proguard_enabled) {
2714*6777b538SAndroid Build Coastguard Worker        proguard_configs = [ _generated_proguard_config ]
2715*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.proguard_configs)) {
2716*6777b538SAndroid Build Coastguard Worker          proguard_configs += invoker.proguard_configs
2717*6777b538SAndroid Build Coastguard Worker        }
2718*6777b538SAndroid Build Coastguard Worker        if (!_is_bundle_module) {
2719*6777b538SAndroid Build Coastguard Worker          proguard_mapping_path = _proguard_mapping_path
2720*6777b538SAndroid Build Coastguard Worker        }
2721*6777b538SAndroid Build Coastguard Worker      }
2722*6777b538SAndroid Build Coastguard Worker
2723*6777b538SAndroid Build Coastguard Worker      # Do not add a dep on the generated_file target in order to avoid having
2724*6777b538SAndroid Build Coastguard Worker      # to build the native libraries before this target. The dependency is
2725*6777b538SAndroid Build Coastguard Worker      # instead captured via a depfile.
2726*6777b538SAndroid Build Coastguard Worker      if (_native_libs_deps != []) {
2727*6777b538SAndroid Build Coastguard Worker        shared_libraries_runtime_deps_file = _shared_library_list_file
2728*6777b538SAndroid Build Coastguard Worker      }
2729*6777b538SAndroid Build Coastguard Worker      if (defined(_secondary_abi_shared_library_list_file)) {
2730*6777b538SAndroid Build Coastguard Worker        secondary_abi_shared_libraries_runtime_deps_file =
2731*6777b538SAndroid Build Coastguard Worker            _secondary_abi_shared_library_list_file
2732*6777b538SAndroid Build Coastguard Worker      }
2733*6777b538SAndroid Build Coastguard Worker
2734*6777b538SAndroid Build Coastguard Worker      loadable_modules = _loadable_modules
2735*6777b538SAndroid Build Coastguard Worker
2736*6777b538SAndroid Build Coastguard Worker      if (defined(_allowlist_r_txt_path) && _is_bundle_module) {
2737*6777b538SAndroid Build Coastguard Worker        # Used to write the file path to the target's .build_config.json only.
2738*6777b538SAndroid Build Coastguard Worker        base_allowlist_rtxt_path = _allowlist_r_txt_path
2739*6777b538SAndroid Build Coastguard Worker      }
2740*6777b538SAndroid Build Coastguard Worker    }
2741*6777b538SAndroid Build Coastguard Worker
2742*6777b538SAndroid Build Coastguard Worker    # Old name for variable, mark as not_needed while it is being renamed
2743*6777b538SAndroid Build Coastguard Worker    # downstream. Remove after all references to baseline_profile_path have been
2744*6777b538SAndroid Build Coastguard Worker    # changed.
2745*6777b538SAndroid Build Coastguard Worker    not_needed(invoker, [ "baseline_profile_path" ])
2746*6777b538SAndroid Build Coastguard Worker
2747*6777b538SAndroid Build Coastguard Worker    _enable_art_profile_optimizations =
2748*6777b538SAndroid Build Coastguard Worker        defined(invoker.art_profile_path) && _proguard_enabled
2749*6777b538SAndroid Build Coastguard Worker
2750*6777b538SAndroid Build Coastguard Worker    if (_enable_art_profile_optimizations) {
2751*6777b538SAndroid Build Coastguard Worker      _include_baseline_profile = enable_baseline_profiles
2752*6777b538SAndroid Build Coastguard Worker      _enable_startup_profile = enable_startup_profiles
2753*6777b538SAndroid Build Coastguard Worker      if (_include_baseline_profile) {
2754*6777b538SAndroid Build Coastguard Worker        _obfuscated_art_profile =
2755*6777b538SAndroid Build Coastguard Worker            "$target_out_dir/${target_name}.obfuscated.hrf"
2756*6777b538SAndroid Build Coastguard Worker      }
2757*6777b538SAndroid Build Coastguard Worker    } else {
2758*6777b538SAndroid Build Coastguard Worker      not_needed(invoker, [ "art_profile_path" ])
2759*6777b538SAndroid Build Coastguard Worker    }
2760*6777b538SAndroid Build Coastguard Worker
2761*6777b538SAndroid Build Coastguard Worker    if (_is_bundle_module || _omit_dex) {
2762*6777b538SAndroid Build Coastguard Worker      # Dex generation for app bundle modules take place in the
2763*6777b538SAndroid Build Coastguard Worker      # android_app_bundle template.
2764*6777b538SAndroid Build Coastguard Worker      not_needed(invoker, [ "custom_assertion_handler" ])
2765*6777b538SAndroid Build Coastguard Worker    } else if (_incremental_apk) {
2766*6777b538SAndroid Build Coastguard Worker      not_needed(invoker,
2767*6777b538SAndroid Build Coastguard Worker                 [
2768*6777b538SAndroid Build Coastguard Worker                   "enable_proguard_checks",
2769*6777b538SAndroid Build Coastguard Worker                   "custom_assertion_handler",
2770*6777b538SAndroid Build Coastguard Worker                 ])
2771*6777b538SAndroid Build Coastguard Worker    } else {
2772*6777b538SAndroid Build Coastguard Worker      _final_dex_target_name = "${_template_name}__final_dex"
2773*6777b538SAndroid Build Coastguard Worker      dex(_final_dex_target_name) {
2774*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker,
2775*6777b538SAndroid Build Coastguard Worker                               [
2776*6777b538SAndroid Build Coastguard Worker                                 "enable_proguard_checks",
2777*6777b538SAndroid Build Coastguard Worker                                 "custom_assertion_handler",
2778*6777b538SAndroid Build Coastguard Worker                                 "proguard_enable_obfuscation",
2779*6777b538SAndroid Build Coastguard Worker                                 "repackage_classes",
2780*6777b538SAndroid Build Coastguard Worker                               ])
2781*6777b538SAndroid Build Coastguard Worker        min_sdk_version = _min_sdk_version
2782*6777b538SAndroid Build Coastguard Worker        proguard_enabled = _proguard_enabled
2783*6777b538SAndroid Build Coastguard Worker        build_config = _build_config
2784*6777b538SAndroid Build Coastguard Worker        output = _final_dex_path
2785*6777b538SAndroid Build Coastguard Worker        deps = [
2786*6777b538SAndroid Build Coastguard Worker          ":$_build_config_target",
2787*6777b538SAndroid Build Coastguard Worker          ":$_java_target_name",
2788*6777b538SAndroid Build Coastguard Worker        ]
2789*6777b538SAndroid Build Coastguard Worker        if (_proguard_enabled) {
2790*6777b538SAndroid Build Coastguard Worker          # Generates proguard configs
2791*6777b538SAndroid Build Coastguard Worker          deps += [ ":$_compile_resources_target" ]
2792*6777b538SAndroid Build Coastguard Worker          proguard_mapping_path = _proguard_mapping_path
2793*6777b538SAndroid Build Coastguard Worker          has_apk_under_test = defined(invoker.apk_under_test)
2794*6777b538SAndroid Build Coastguard Worker
2795*6777b538SAndroid Build Coastguard Worker          if (_enable_art_profile_optimizations) {
2796*6777b538SAndroid Build Coastguard Worker            input_art_profile = invoker.art_profile_path
2797*6777b538SAndroid Build Coastguard Worker            if (_include_baseline_profile) {
2798*6777b538SAndroid Build Coastguard Worker              output_art_profile = _obfuscated_art_profile
2799*6777b538SAndroid Build Coastguard Worker            }
2800*6777b538SAndroid Build Coastguard Worker            enable_startup_profile = _enable_startup_profile
2801*6777b538SAndroid Build Coastguard Worker          }
2802*6777b538SAndroid Build Coastguard Worker
2803*6777b538SAndroid Build Coastguard Worker          # Must not be set via write_build_config, because that will cause it
2804*6777b538SAndroid Build Coastguard Worker          # to be picked up by test apks that use apk_under_test.
2805*6777b538SAndroid Build Coastguard Worker          if (!_assertions_implicitly_enabled && !enable_java_asserts &&
2806*6777b538SAndroid Build Coastguard Worker              (!defined(testonly) || !testonly) &&
2807*6777b538SAndroid Build Coastguard Worker              # Injected JaCoCo code causes -checkdiscards to fail.
2808*6777b538SAndroid Build Coastguard Worker              !use_jacoco_coverage) {
2809*6777b538SAndroid Build Coastguard Worker            proguard_configs = [
2810*6777b538SAndroid Build Coastguard Worker              "//build/android/dcheck_is_off.flags",
2811*6777b538SAndroid Build Coastguard Worker              "//third_party/jni_zero/checkdiscard_proguard.flags",
2812*6777b538SAndroid Build Coastguard Worker            ]
2813*6777b538SAndroid Build Coastguard Worker          }
2814*6777b538SAndroid Build Coastguard Worker        } else {
2815*6777b538SAndroid Build Coastguard Worker          if (_min_sdk_version >= default_min_sdk_version) {
2816*6777b538SAndroid Build Coastguard Worker            # Enable dex merging only when min_sdk_version is >= what the library
2817*6777b538SAndroid Build Coastguard Worker            # .dex files were created with.
2818*6777b538SAndroid Build Coastguard Worker            input_dex_filearg =
2819*6777b538SAndroid Build Coastguard Worker                "@FileArg(${_rebased_build_config}:deps_info:all_dex_files)"
2820*6777b538SAndroid Build Coastguard Worker
2821*6777b538SAndroid Build Coastguard Worker            # Pure dex-merge.
2822*6777b538SAndroid Build Coastguard Worker            enable_desugar = false
2823*6777b538SAndroid Build Coastguard Worker          } else {
2824*6777b538SAndroid Build Coastguard Worker            input_classes_filearg =
2825*6777b538SAndroid Build Coastguard Worker                "@FileArg($_rebased_build_config:deps_info:device_classpath)"
2826*6777b538SAndroid Build Coastguard Worker          }
2827*6777b538SAndroid Build Coastguard Worker        }
2828*6777b538SAndroid Build Coastguard Worker
2829*6777b538SAndroid Build Coastguard Worker        # The individual dependencies would have caught real missing deps in
2830*6777b538SAndroid Build Coastguard Worker        # their respective dex steps. False positives that were suppressed at
2831*6777b538SAndroid Build Coastguard Worker        # per-target dex steps are emitted here since this may use jar files
2832*6777b538SAndroid Build Coastguard Worker        # rather than dex files.
2833*6777b538SAndroid Build Coastguard Worker        if (!defined(enable_desugar)) {
2834*6777b538SAndroid Build Coastguard Worker          ignore_desugar_missing_deps = true
2835*6777b538SAndroid Build Coastguard Worker        }
2836*6777b538SAndroid Build Coastguard Worker      }
2837*6777b538SAndroid Build Coastguard Worker
2838*6777b538SAndroid Build Coastguard Worker      _final_dex_target_dep = ":$_final_dex_target_name"
2839*6777b538SAndroid Build Coastguard Worker
2840*6777b538SAndroid Build Coastguard Worker      if (_enable_art_profile_optimizations && _include_baseline_profile) {
2841*6777b538SAndroid Build Coastguard Worker        _binary_profile_target = "${_template_name}__binary_baseline_profile"
2842*6777b538SAndroid Build Coastguard Worker        _binary_baseline_profile_path =
2843*6777b538SAndroid Build Coastguard Worker            "$target_out_dir/$_template_name.baseline.prof"
2844*6777b538SAndroid Build Coastguard Worker        _binary_baseline_profile_metadata_path =
2845*6777b538SAndroid Build Coastguard Worker            _binary_baseline_profile_path + "m"
2846*6777b538SAndroid Build Coastguard Worker        create_binary_profile(_binary_profile_target) {
2847*6777b538SAndroid Build Coastguard Worker          forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
2848*6777b538SAndroid Build Coastguard Worker          binary_baseline_profile_path = _binary_baseline_profile_path
2849*6777b538SAndroid Build Coastguard Worker          binary_baseline_profile_metadata_path =
2850*6777b538SAndroid Build Coastguard Worker              _binary_baseline_profile_metadata_path
2851*6777b538SAndroid Build Coastguard Worker          build_config = _build_config
2852*6777b538SAndroid Build Coastguard Worker          input_profile_path = _obfuscated_art_profile
2853*6777b538SAndroid Build Coastguard Worker          deps = [
2854*6777b538SAndroid Build Coastguard Worker            ":$_build_config_target",
2855*6777b538SAndroid Build Coastguard Worker            _final_dex_target_dep,
2856*6777b538SAndroid Build Coastguard Worker          ]
2857*6777b538SAndroid Build Coastguard Worker        }
2858*6777b538SAndroid Build Coastguard Worker      }
2859*6777b538SAndroid Build Coastguard Worker    }
2860*6777b538SAndroid Build Coastguard Worker
2861*6777b538SAndroid Build Coastguard Worker    _all_native_libs_deps = _native_libs_deps + _secondary_abi_native_libs_deps
2862*6777b538SAndroid Build Coastguard Worker    if (_all_native_libs_deps != []) {
2863*6777b538SAndroid Build Coastguard Worker      _native_libs_filearg_dep = ":$_build_config_target"
2864*6777b538SAndroid Build Coastguard Worker      _all_native_libs_deps += [ _native_libs_filearg_dep ]
2865*6777b538SAndroid Build Coastguard Worker
2866*6777b538SAndroid Build Coastguard Worker      if (!_is_bundle_module) {
2867*6777b538SAndroid Build Coastguard Worker        _native_libs_filearg =
2868*6777b538SAndroid Build Coastguard Worker            "@FileArg($_rebased_build_config:native:libraries)"
2869*6777b538SAndroid Build Coastguard Worker      }
2870*6777b538SAndroid Build Coastguard Worker    }
2871*6777b538SAndroid Build Coastguard Worker
2872*6777b538SAndroid Build Coastguard Worker    if (_is_bundle_module) {
2873*6777b538SAndroid Build Coastguard Worker      _final_deps += [
2874*6777b538SAndroid Build Coastguard Worker                       ":$_build_config_target",
2875*6777b538SAndroid Build Coastguard Worker                       ":$_compile_resources_target",
2876*6777b538SAndroid Build Coastguard Worker                       ":$_merge_manifest_target",
2877*6777b538SAndroid Build Coastguard Worker                     ] + _all_native_libs_deps
2878*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.asset_deps)) {
2879*6777b538SAndroid Build Coastguard Worker        _final_deps += invoker.asset_deps
2880*6777b538SAndroid Build Coastguard Worker      }
2881*6777b538SAndroid Build Coastguard Worker      if (_optimize_resources) {
2882*6777b538SAndroid Build Coastguard Worker        _final_deps += [ ":$_optimize_resources_target" ]
2883*6777b538SAndroid Build Coastguard Worker      }
2884*6777b538SAndroid Build Coastguard Worker      if (defined(_final_dex_target_dep)) {
2885*6777b538SAndroid Build Coastguard Worker        not_needed([ "_final_dex_target_dep" ])
2886*6777b538SAndroid Build Coastguard Worker      }
2887*6777b538SAndroid Build Coastguard Worker    } else {
2888*6777b538SAndroid Build Coastguard Worker      # Generate size-info/*.jar.info files.
2889*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.name)) {
2890*6777b538SAndroid Build Coastguard Worker        # Create size info files for targets that care about size
2891*6777b538SAndroid Build Coastguard Worker        # (have proguard enabled).
2892*6777b538SAndroid Build Coastguard Worker        _include_size_info =
2893*6777b538SAndroid Build Coastguard Worker            defined(invoker.include_size_info) && invoker.include_size_info
2894*6777b538SAndroid Build Coastguard Worker        if (_include_size_info || _proguard_enabled) {
2895*6777b538SAndroid Build Coastguard Worker          _size_info_target = "${target_name}__size_info"
2896*6777b538SAndroid Build Coastguard Worker          create_size_info_files(_size_info_target) {
2897*6777b538SAndroid Build Coastguard Worker            name = "${invoker.name}.apk"
2898*6777b538SAndroid Build Coastguard Worker            build_config = _build_config
2899*6777b538SAndroid Build Coastguard Worker            res_size_info_path = _res_size_info_path
2900*6777b538SAndroid Build Coastguard Worker            deps = [
2901*6777b538SAndroid Build Coastguard Worker              ":$_build_config_target",
2902*6777b538SAndroid Build Coastguard Worker              ":$_compile_resources_target",
2903*6777b538SAndroid Build Coastguard Worker              ":$_java_target_name",
2904*6777b538SAndroid Build Coastguard Worker            ]
2905*6777b538SAndroid Build Coastguard Worker            if (defined(invoker.asset_deps)) {
2906*6777b538SAndroid Build Coastguard Worker              deps += invoker.asset_deps
2907*6777b538SAndroid Build Coastguard Worker            }
2908*6777b538SAndroid Build Coastguard Worker          }
2909*6777b538SAndroid Build Coastguard Worker          _final_deps += [ ":$_size_info_target" ]
2910*6777b538SAndroid Build Coastguard Worker        } else {
2911*6777b538SAndroid Build Coastguard Worker          not_needed(invoker, [ "name" ])
2912*6777b538SAndroid Build Coastguard Worker        }
2913*6777b538SAndroid Build Coastguard Worker      }
2914*6777b538SAndroid Build Coastguard Worker
2915*6777b538SAndroid Build Coastguard Worker      _create_apk_target = "${_template_name}__create"
2916*6777b538SAndroid Build Coastguard Worker      _final_deps += [ ":$_create_apk_target" ]
2917*6777b538SAndroid Build Coastguard Worker      package_apk("$_create_apk_target") {
2918*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker,
2919*6777b538SAndroid Build Coastguard Worker                               [
2920*6777b538SAndroid Build Coastguard Worker                                 "expected_libs_and_assets",
2921*6777b538SAndroid Build Coastguard Worker                                 "expected_libs_and_assets_base",
2922*6777b538SAndroid Build Coastguard Worker                                 "keystore_name",
2923*6777b538SAndroid Build Coastguard Worker                                 "keystore_path",
2924*6777b538SAndroid Build Coastguard Worker                                 "keystore_password",
2925*6777b538SAndroid Build Coastguard Worker                                 "native_lib_placeholders",
2926*6777b538SAndroid Build Coastguard Worker                                 "secondary_abi_loadable_modules",
2927*6777b538SAndroid Build Coastguard Worker                                 "secondary_native_lib_placeholders",
2928*6777b538SAndroid Build Coastguard Worker                                 "uncompress_dex",
2929*6777b538SAndroid Build Coastguard Worker                                 "library_always_compress",
2930*6777b538SAndroid Build Coastguard Worker                               ])
2931*6777b538SAndroid Build Coastguard Worker
2932*6777b538SAndroid Build Coastguard Worker        if (defined(expected_libs_and_assets)) {
2933*6777b538SAndroid Build Coastguard Worker          build_config_dep = ":$_build_config_target"
2934*6777b538SAndroid Build Coastguard Worker          top_target_name = _template_name
2935*6777b538SAndroid Build Coastguard Worker        }
2936*6777b538SAndroid Build Coastguard Worker
2937*6777b538SAndroid Build Coastguard Worker        build_config = _build_config
2938*6777b538SAndroid Build Coastguard Worker        min_sdk_version = _min_sdk_version
2939*6777b538SAndroid Build Coastguard Worker        packaged_resources_path = _arsc_resources_path
2940*6777b538SAndroid Build Coastguard Worker
2941*6777b538SAndroid Build Coastguard Worker        # Need full deps rather than _non_java_deps, because loadable_modules
2942*6777b538SAndroid Build Coastguard Worker        # may include .so files extracted by __unpack_aar targets.
2943*6777b538SAndroid Build Coastguard Worker        deps = _invoker_deps + [ ":$_build_config_target" ]
2944*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.asset_deps)) {
2945*6777b538SAndroid Build Coastguard Worker          deps += invoker.asset_deps
2946*6777b538SAndroid Build Coastguard Worker        }
2947*6777b538SAndroid Build Coastguard Worker
2948*6777b538SAndroid Build Coastguard Worker        if (_incremental_apk) {
2949*6777b538SAndroid Build Coastguard Worker          _dex_target = "//build/android/incremental_install:apk_dex"
2950*6777b538SAndroid Build Coastguard Worker
2951*6777b538SAndroid Build Coastguard Worker          deps += [
2952*6777b538SAndroid Build Coastguard Worker            ":$_compile_resources_target",
2953*6777b538SAndroid Build Coastguard Worker            _dex_target,
2954*6777b538SAndroid Build Coastguard Worker          ]
2955*6777b538SAndroid Build Coastguard Worker
2956*6777b538SAndroid Build Coastguard Worker          dex_path = get_label_info(_dex_target, "target_out_dir") + "/apk.dex"
2957*6777b538SAndroid Build Coastguard Worker
2958*6777b538SAndroid Build Coastguard Worker          # Incremental APKs cannot be installed via `adb install` as such they
2959*6777b538SAndroid Build Coastguard Worker          # should be clearly named/labeled "incremental".
2960*6777b538SAndroid Build Coastguard Worker          output_apk_path = _incremental_apk_path
2961*6777b538SAndroid Build Coastguard Worker
2962*6777b538SAndroid Build Coastguard Worker          # All native libraries are side-loaded, so use a placeholder to force
2963*6777b538SAndroid Build Coastguard Worker          # the proper bitness for the app.
2964*6777b538SAndroid Build Coastguard Worker          _has_native_libs =
2965*6777b538SAndroid Build Coastguard Worker              defined(_native_libs_filearg) || _loadable_modules != []
2966*6777b538SAndroid Build Coastguard Worker          if (_has_native_libs && !defined(native_lib_placeholders)) {
2967*6777b538SAndroid Build Coastguard Worker            native_lib_placeholders = [ "libfix.crbug.384638.so" ]
2968*6777b538SAndroid Build Coastguard Worker          }
2969*6777b538SAndroid Build Coastguard Worker        } else {
2970*6777b538SAndroid Build Coastguard Worker          loadable_modules = _loadable_modules
2971*6777b538SAndroid Build Coastguard Worker          deps += _all_native_libs_deps + [
2972*6777b538SAndroid Build Coastguard Worker                    ":$_compile_resources_target",
2973*6777b538SAndroid Build Coastguard Worker                    ":$_merge_manifest_target",
2974*6777b538SAndroid Build Coastguard Worker                  ]
2975*6777b538SAndroid Build Coastguard Worker
2976*6777b538SAndroid Build Coastguard Worker          if (defined(_final_dex_path)) {
2977*6777b538SAndroid Build Coastguard Worker            dex_path = _final_dex_path
2978*6777b538SAndroid Build Coastguard Worker            deps += [ _final_dex_target_dep ]
2979*6777b538SAndroid Build Coastguard Worker            if (_enable_art_profile_optimizations &&
2980*6777b538SAndroid Build Coastguard Worker                _include_baseline_profile) {
2981*6777b538SAndroid Build Coastguard Worker              # extra_assets is a list of ["{src_path}:{dst_path}"]
2982*6777b538SAndroid Build Coastguard Worker              extra_assets = [
2983*6777b538SAndroid Build Coastguard Worker                rebase_path(_binary_baseline_profile_path, root_build_dir) +
2984*6777b538SAndroid Build Coastguard Worker                    ":dexopt/baseline.prof",
2985*6777b538SAndroid Build Coastguard Worker                rebase_path(_binary_baseline_profile_metadata_path,
2986*6777b538SAndroid Build Coastguard Worker                            root_build_dir) + ":dexopt/baseline.profm",
2987*6777b538SAndroid Build Coastguard Worker              ]
2988*6777b538SAndroid Build Coastguard Worker              deps += [ ":$_binary_profile_target" ]
2989*6777b538SAndroid Build Coastguard Worker            }
2990*6777b538SAndroid Build Coastguard Worker          }
2991*6777b538SAndroid Build Coastguard Worker
2992*6777b538SAndroid Build Coastguard Worker          output_apk_path = _final_apk_path
2993*6777b538SAndroid Build Coastguard Worker
2994*6777b538SAndroid Build Coastguard Worker          if (defined(_native_libs_filearg)) {
2995*6777b538SAndroid Build Coastguard Worker            native_libs_filearg = _native_libs_filearg
2996*6777b538SAndroid Build Coastguard Worker            secondary_abi_native_libs_filearg = "@FileArg($_rebased_build_config:native:secondary_abi_libraries)"
2997*6777b538SAndroid Build Coastguard Worker          }
2998*6777b538SAndroid Build Coastguard Worker        }
2999*6777b538SAndroid Build Coastguard Worker      }
3000*6777b538SAndroid Build Coastguard Worker    }
3001*6777b538SAndroid Build Coastguard Worker
3002*6777b538SAndroid Build Coastguard Worker    if (_incremental_apk) {
3003*6777b538SAndroid Build Coastguard Worker      _write_installer_json_rule_name = "${_template_name}__incremental_json"
3004*6777b538SAndroid Build Coastguard Worker      action_with_pydeps(_write_installer_json_rule_name) {
3005*6777b538SAndroid Build Coastguard Worker        script = "//build/android/incremental_install/write_installer_json.py"
3006*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_build_config_target" ] + _all_native_libs_deps
3007*6777b538SAndroid Build Coastguard Worker
3008*6777b538SAndroid Build Coastguard Worker        data = [ _incremental_install_json_path ]
3009*6777b538SAndroid Build Coastguard Worker        inputs = [ _build_config ]
3010*6777b538SAndroid Build Coastguard Worker        outputs = [ _incremental_install_json_path ]
3011*6777b538SAndroid Build Coastguard Worker
3012*6777b538SAndroid Build Coastguard Worker        _rebased_incremental_apk_path =
3013*6777b538SAndroid Build Coastguard Worker            rebase_path(_incremental_apk_path, root_build_dir)
3014*6777b538SAndroid Build Coastguard Worker        _rebased_incremental_install_json_path =
3015*6777b538SAndroid Build Coastguard Worker            rebase_path(_incremental_install_json_path, root_build_dir)
3016*6777b538SAndroid Build Coastguard Worker        args = [
3017*6777b538SAndroid Build Coastguard Worker          "--apk-path=$_rebased_incremental_apk_path",
3018*6777b538SAndroid Build Coastguard Worker          "--output-path=$_rebased_incremental_install_json_path",
3019*6777b538SAndroid Build Coastguard Worker          "--dex-file=@FileArg($_rebased_build_config:deps_info:all_dex_files)",
3020*6777b538SAndroid Build Coastguard Worker        ]
3021*6777b538SAndroid Build Coastguard Worker        if (_proguard_enabled) {
3022*6777b538SAndroid Build Coastguard Worker          args += [ "--show-proguard-warning" ]
3023*6777b538SAndroid Build Coastguard Worker        }
3024*6777b538SAndroid Build Coastguard Worker        if (defined(_native_libs_filearg)) {
3025*6777b538SAndroid Build Coastguard Worker          args += [ "--native-libs=$_native_libs_filearg" ]
3026*6777b538SAndroid Build Coastguard Worker          deps += [ _native_libs_filearg_dep ]
3027*6777b538SAndroid Build Coastguard Worker        }
3028*6777b538SAndroid Build Coastguard Worker        if (_loadable_modules != []) {
3029*6777b538SAndroid Build Coastguard Worker          _rebased_loadable_modules =
3030*6777b538SAndroid Build Coastguard Worker              rebase_path(_loadable_modules, root_build_dir)
3031*6777b538SAndroid Build Coastguard Worker          args += [ "--native-libs=$_rebased_loadable_modules" ]
3032*6777b538SAndroid Build Coastguard Worker        }
3033*6777b538SAndroid Build Coastguard Worker      }
3034*6777b538SAndroid Build Coastguard Worker      _final_deps += [ ":$_write_installer_json_rule_name" ]
3035*6777b538SAndroid Build Coastguard Worker    }
3036*6777b538SAndroid Build Coastguard Worker
3037*6777b538SAndroid Build Coastguard Worker    # Generate apk operation related script.
3038*6777b538SAndroid Build Coastguard Worker    if (!_is_bundle_module &&
3039*6777b538SAndroid Build Coastguard Worker        (!defined(invoker.create_apk_script) || invoker.create_apk_script)) {
3040*6777b538SAndroid Build Coastguard Worker      if (_uses_static_library) {
3041*6777b538SAndroid Build Coastguard Worker        _install_artifacts_target = "${target_name}__install_artifacts"
3042*6777b538SAndroid Build Coastguard Worker        _install_artifacts_json =
3043*6777b538SAndroid Build Coastguard Worker            "${target_gen_dir}/${target_name}.install_artifacts"
3044*6777b538SAndroid Build Coastguard Worker        generated_file(_install_artifacts_target) {
3045*6777b538SAndroid Build Coastguard Worker          output_conversion = "json"
3046*6777b538SAndroid Build Coastguard Worker          deps = [ invoker.static_library_provider ]
3047*6777b538SAndroid Build Coastguard Worker          outputs = [ _install_artifacts_json ]
3048*6777b538SAndroid Build Coastguard Worker          data_keys = [ "install_artifacts" ]
3049*6777b538SAndroid Build Coastguard Worker          rebase = root_build_dir
3050*6777b538SAndroid Build Coastguard Worker        }
3051*6777b538SAndroid Build Coastguard Worker      }
3052*6777b538SAndroid Build Coastguard Worker      _apk_operations_target_name = "${target_name}__apk_operations"
3053*6777b538SAndroid Build Coastguard Worker      action_with_pydeps(_apk_operations_target_name) {
3054*6777b538SAndroid Build Coastguard Worker        _generated_script = "$root_build_dir/bin/${invoker.target_name}"
3055*6777b538SAndroid Build Coastguard Worker        script = "//build/android/gyp/create_apk_operations_script.py"
3056*6777b538SAndroid Build Coastguard Worker        outputs = [ _generated_script ]
3057*6777b538SAndroid Build Coastguard Worker        args = [
3058*6777b538SAndroid Build Coastguard Worker          "--script-output-path",
3059*6777b538SAndroid Build Coastguard Worker          rebase_path(_generated_script, root_build_dir),
3060*6777b538SAndroid Build Coastguard Worker          "--target-cpu=$target_cpu",
3061*6777b538SAndroid Build Coastguard Worker        ]
3062*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.command_line_flags_file)) {
3063*6777b538SAndroid Build Coastguard Worker          args += [
3064*6777b538SAndroid Build Coastguard Worker            "--command-line-flags-file",
3065*6777b538SAndroid Build Coastguard Worker            invoker.command_line_flags_file,
3066*6777b538SAndroid Build Coastguard Worker          ]
3067*6777b538SAndroid Build Coastguard Worker        }
3068*6777b538SAndroid Build Coastguard Worker        if (_incremental_apk) {
3069*6777b538SAndroid Build Coastguard Worker          args += [
3070*6777b538SAndroid Build Coastguard Worker            "--incremental-install-json-path",
3071*6777b538SAndroid Build Coastguard Worker            rebase_path(_incremental_install_json_path, root_build_dir),
3072*6777b538SAndroid Build Coastguard Worker          ]
3073*6777b538SAndroid Build Coastguard Worker        } else {
3074*6777b538SAndroid Build Coastguard Worker          args += [
3075*6777b538SAndroid Build Coastguard Worker            "--apk-path",
3076*6777b538SAndroid Build Coastguard Worker            rebase_path(_final_apk_path, root_build_dir),
3077*6777b538SAndroid Build Coastguard Worker          ]
3078*6777b538SAndroid Build Coastguard Worker        }
3079*6777b538SAndroid Build Coastguard Worker        if (_uses_static_library) {
3080*6777b538SAndroid Build Coastguard Worker          deps = [ ":$_install_artifacts_target" ]
3081*6777b538SAndroid Build Coastguard Worker          _rebased_install_artifacts_json =
3082*6777b538SAndroid Build Coastguard Worker              rebase_path(_install_artifacts_json, root_build_dir)
3083*6777b538SAndroid Build Coastguard Worker          _static_library_apk_path =
3084*6777b538SAndroid Build Coastguard Worker              "@FileArg($_rebased_install_artifacts_json[])"
3085*6777b538SAndroid Build Coastguard Worker          args += [
3086*6777b538SAndroid Build Coastguard Worker            "--additional-apk",
3087*6777b538SAndroid Build Coastguard Worker            _static_library_apk_path,
3088*6777b538SAndroid Build Coastguard Worker          ]
3089*6777b538SAndroid Build Coastguard Worker        }
3090*6777b538SAndroid Build Coastguard Worker        data = []
3091*6777b538SAndroid Build Coastguard Worker        data_deps = [
3092*6777b538SAndroid Build Coastguard Worker          "//build/android:apk_operations_py",
3093*6777b538SAndroid Build Coastguard Worker          "//build/android:stack_tools",
3094*6777b538SAndroid Build Coastguard Worker        ]
3095*6777b538SAndroid Build Coastguard Worker
3096*6777b538SAndroid Build Coastguard Worker        if (_proguard_enabled && !_incremental_apk) {
3097*6777b538SAndroid Build Coastguard Worker          # Required by logcat command.
3098*6777b538SAndroid Build Coastguard Worker          data_deps += [ "//build/android/stacktrace:java_deobfuscate" ]
3099*6777b538SAndroid Build Coastguard Worker          data += [ "$_final_apk_path.mapping" ]
3100*6777b538SAndroid Build Coastguard Worker          args += [
3101*6777b538SAndroid Build Coastguard Worker            "--proguard-mapping-path",
3102*6777b538SAndroid Build Coastguard Worker            rebase_path("$_final_apk_path.mapping", root_build_dir),
3103*6777b538SAndroid Build Coastguard Worker          ]
3104*6777b538SAndroid Build Coastguard Worker        }
3105*6777b538SAndroid Build Coastguard Worker      }
3106*6777b538SAndroid Build Coastguard Worker      _final_deps += [ ":$_apk_operations_target_name" ]
3107*6777b538SAndroid Build Coastguard Worker    }
3108*6777b538SAndroid Build Coastguard Worker
3109*6777b538SAndroid Build Coastguard Worker    _enable_lint = defined(invoker.enable_lint) && invoker.enable_lint &&
3110*6777b538SAndroid Build Coastguard Worker                   !disable_android_lint
3111*6777b538SAndroid Build Coastguard Worker    if (_enable_lint) {
3112*6777b538SAndroid Build Coastguard Worker      android_lint("${target_name}__lint") {
3113*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker,
3114*6777b538SAndroid Build Coastguard Worker                               [
3115*6777b538SAndroid Build Coastguard Worker                                 "lint_baseline_file",
3116*6777b538SAndroid Build Coastguard Worker                                 "lint_gen_dir",
3117*6777b538SAndroid Build Coastguard Worker                                 "lint_suppressions_file",
3118*6777b538SAndroid Build Coastguard Worker                                 "min_sdk_version",
3119*6777b538SAndroid Build Coastguard Worker                               ])
3120*6777b538SAndroid Build Coastguard Worker        build_config = _build_config
3121*6777b538SAndroid Build Coastguard Worker        build_config_dep = ":$_build_config_target"
3122*6777b538SAndroid Build Coastguard Worker
3123*6777b538SAndroid Build Coastguard Worker        # This will use library subtargets under-the-hood
3124*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_java_target_name" ]
3125*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.lint_suppressions_dep)) {
3126*6777b538SAndroid Build Coastguard Worker          deps += [ invoker.lint_suppressions_dep ]
3127*6777b538SAndroid Build Coastguard Worker        }
3128*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.asset_deps)) {
3129*6777b538SAndroid Build Coastguard Worker          deps += invoker.asset_deps
3130*6777b538SAndroid Build Coastguard Worker        }
3131*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.lint_min_sdk_version)) {
3132*6777b538SAndroid Build Coastguard Worker          min_sdk_version = invoker.lint_min_sdk_version
3133*6777b538SAndroid Build Coastguard Worker        }
3134*6777b538SAndroid Build Coastguard Worker      }
3135*6777b538SAndroid Build Coastguard Worker    } else {
3136*6777b538SAndroid Build Coastguard Worker      not_needed(invoker,
3137*6777b538SAndroid Build Coastguard Worker                 [
3138*6777b538SAndroid Build Coastguard Worker                   "lint_baseline_file",
3139*6777b538SAndroid Build Coastguard Worker                   "lint_gen_dir",
3140*6777b538SAndroid Build Coastguard Worker                   "lint_jar_path",
3141*6777b538SAndroid Build Coastguard Worker                   "lint_min_sdk_version",
3142*6777b538SAndroid Build Coastguard Worker                   "lint_suppressions_dep",
3143*6777b538SAndroid Build Coastguard Worker                   "lint_suppressions_file",
3144*6777b538SAndroid Build Coastguard Worker                 ])
3145*6777b538SAndroid Build Coastguard Worker    }
3146*6777b538SAndroid Build Coastguard Worker
3147*6777b538SAndroid Build Coastguard Worker    group(target_name) {
3148*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
3149*6777b538SAndroid Build Coastguard Worker                             [
3150*6777b538SAndroid Build Coastguard Worker                               "assert_no_deps",
3151*6777b538SAndroid Build Coastguard Worker                               "data",
3152*6777b538SAndroid Build Coastguard Worker                               "data_deps",
3153*6777b538SAndroid Build Coastguard Worker                             ])
3154*6777b538SAndroid Build Coastguard Worker      metadata = {
3155*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.metadata)) {
3156*6777b538SAndroid Build Coastguard Worker          forward_variables_from(invoker.metadata, "*")
3157*6777b538SAndroid Build Coastguard Worker        }
3158*6777b538SAndroid Build Coastguard Worker
3159*6777b538SAndroid Build Coastguard Worker        # Allows metadata collection via apk targets that traverse only java deps.
3160*6777b538SAndroid Build Coastguard Worker        java_walk_keys = [ ":$_java_target_name" ]
3161*6777b538SAndroid Build Coastguard Worker      }
3162*6777b538SAndroid Build Coastguard Worker
3163*6777b538SAndroid Build Coastguard Worker      # Generate apk related operations at runtime.
3164*6777b538SAndroid Build Coastguard Worker      public_deps = _final_deps
3165*6777b538SAndroid Build Coastguard Worker
3166*6777b538SAndroid Build Coastguard Worker      if (!defined(data_deps)) {
3167*6777b538SAndroid Build Coastguard Worker        data_deps = []
3168*6777b538SAndroid Build Coastguard Worker      }
3169*6777b538SAndroid Build Coastguard Worker
3170*6777b538SAndroid Build Coastguard Worker      # Include unstripped native libraries so tests can symbolize stacks.
3171*6777b538SAndroid Build Coastguard Worker      data_deps += _all_native_libs_deps + [ ":${_java_target_name}__validate" ]
3172*6777b538SAndroid Build Coastguard Worker      if (_enable_lint) {
3173*6777b538SAndroid Build Coastguard Worker        data_deps += [ ":${target_name}__lint" ]
3174*6777b538SAndroid Build Coastguard Worker      }
3175*6777b538SAndroid Build Coastguard Worker
3176*6777b538SAndroid Build Coastguard Worker      if (_uses_static_library) {
3177*6777b538SAndroid Build Coastguard Worker        data_deps += [ invoker.static_library_provider ]
3178*6777b538SAndroid Build Coastguard Worker      }
3179*6777b538SAndroid Build Coastguard Worker    }
3180*6777b538SAndroid Build Coastguard Worker  }
3181*6777b538SAndroid Build Coastguard Worker
3182*6777b538SAndroid Build Coastguard Worker  # Declare an Android APK target
3183*6777b538SAndroid Build Coastguard Worker  #
3184*6777b538SAndroid Build Coastguard Worker  # This target creates an Android APK containing java code, resources, assets,
3185*6777b538SAndroid Build Coastguard Worker  # and (possibly) native libraries.
3186*6777b538SAndroid Build Coastguard Worker  #
3187*6777b538SAndroid Build Coastguard Worker  # Supports all variables of android_apk_or_module(), plus:
3188*6777b538SAndroid Build Coastguard Worker  #   apk_name: Name for final apk.
3189*6777b538SAndroid Build Coastguard Worker  #   final_apk_path: (Optional) path to output APK.
3190*6777b538SAndroid Build Coastguard Worker  #
3191*6777b538SAndroid Build Coastguard Worker  # Example
3192*6777b538SAndroid Build Coastguard Worker  #   android_apk("foo_apk") {
3193*6777b538SAndroid Build Coastguard Worker  #     android_manifest = "AndroidManifest.xml"
3194*6777b538SAndroid Build Coastguard Worker  #     sources = [
3195*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooApplication.java",
3196*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooActivity.java",
3197*6777b538SAndroid Build Coastguard Worker  #     ]
3198*6777b538SAndroid Build Coastguard Worker  #     deps = [
3199*6777b538SAndroid Build Coastguard Worker  #       ":foo_support_java"
3200*6777b538SAndroid Build Coastguard Worker  #       ":foo_resources"
3201*6777b538SAndroid Build Coastguard Worker  #     ]
3202*6777b538SAndroid Build Coastguard Worker  #     srcjar_deps = [
3203*6777b538SAndroid Build Coastguard Worker  #       ":foo_generated_enum"
3204*6777b538SAndroid Build Coastguard Worker  #     ]
3205*6777b538SAndroid Build Coastguard Worker  #     shared_libraries = [
3206*6777b538SAndroid Build Coastguard Worker  #       ":my_shared_lib",
3207*6777b538SAndroid Build Coastguard Worker  #     ]
3208*6777b538SAndroid Build Coastguard Worker  #   }
3209*6777b538SAndroid Build Coastguard Worker  template("android_apk") {
3210*6777b538SAndroid Build Coastguard Worker    # TODO(crbug.com/1042017): Remove.
3211*6777b538SAndroid Build Coastguard Worker    not_needed(invoker, [ "no_build_hooks" ])
3212*6777b538SAndroid Build Coastguard Worker    android_apk_or_module(target_name) {
3213*6777b538SAndroid Build Coastguard Worker      forward_variables_from(
3214*6777b538SAndroid Build Coastguard Worker          invoker,
3215*6777b538SAndroid Build Coastguard Worker          [
3216*6777b538SAndroid Build Coastguard Worker            "aapt_locale_allowlist",
3217*6777b538SAndroid Build Coastguard Worker            "additional_jar_files",
3218*6777b538SAndroid Build Coastguard Worker            "allow_unused_jni_from_native",
3219*6777b538SAndroid Build Coastguard Worker            "alternative_android_sdk_dep",
3220*6777b538SAndroid Build Coastguard Worker            "android_manifest",
3221*6777b538SAndroid Build Coastguard Worker            "android_manifest_dep",
3222*6777b538SAndroid Build Coastguard Worker            "annotation_processor_deps",
3223*6777b538SAndroid Build Coastguard Worker            "apk_under_test",
3224*6777b538SAndroid Build Coastguard Worker            "app_as_shared_lib",
3225*6777b538SAndroid Build Coastguard Worker            "art_profile_path",
3226*6777b538SAndroid Build Coastguard Worker            "assert_no_deps",
3227*6777b538SAndroid Build Coastguard Worker            "assert_no_native_deps",
3228*6777b538SAndroid Build Coastguard Worker            "asset_deps",
3229*6777b538SAndroid Build Coastguard Worker            "baseline_profile_path",
3230*6777b538SAndroid Build Coastguard Worker            "build_config_include_product_version_resource",
3231*6777b538SAndroid Build Coastguard Worker            "bundles_supported",
3232*6777b538SAndroid Build Coastguard Worker            "chromium_code",
3233*6777b538SAndroid Build Coastguard Worker            "command_line_flags_file",
3234*6777b538SAndroid Build Coastguard Worker            "create_apk_script",
3235*6777b538SAndroid Build Coastguard Worker            "custom_assertion_handler",
3236*6777b538SAndroid Build Coastguard Worker            "data",
3237*6777b538SAndroid Build Coastguard Worker            "data_deps",
3238*6777b538SAndroid Build Coastguard Worker            "deps",
3239*6777b538SAndroid Build Coastguard Worker            "enable_lint",
3240*6777b538SAndroid Build Coastguard Worker            "enable_jni_multiplexing",
3241*6777b538SAndroid Build Coastguard Worker            "enable_proguard_checks",
3242*6777b538SAndroid Build Coastguard Worker            "enforce_resource_overlays_in_tests",
3243*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest",
3244*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_base",
3245*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_library_version_offset",
3246*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_version_code_offset",
3247*6777b538SAndroid Build Coastguard Worker            "expected_libs_and_assets",
3248*6777b538SAndroid Build Coastguard Worker            "expected_libs_and_assets_base",
3249*6777b538SAndroid Build Coastguard Worker            "generate_buildconfig_java",
3250*6777b538SAndroid Build Coastguard Worker            "generate_native_libraries_java",
3251*6777b538SAndroid Build Coastguard Worker            "include_size_info",
3252*6777b538SAndroid Build Coastguard Worker            "input_jars_paths",
3253*6777b538SAndroid Build Coastguard Worker            "jacoco_never_instrument",
3254*6777b538SAndroid Build Coastguard Worker            "javac_args",
3255*6777b538SAndroid Build Coastguard Worker            "keystore_name",
3256*6777b538SAndroid Build Coastguard Worker            "keystore_password",
3257*6777b538SAndroid Build Coastguard Worker            "keystore_path",
3258*6777b538SAndroid Build Coastguard Worker            "lint_baseline_file",
3259*6777b538SAndroid Build Coastguard Worker            "lint_gen_dir",
3260*6777b538SAndroid Build Coastguard Worker            "lint_min_sdk_version",
3261*6777b538SAndroid Build Coastguard Worker            "lint_suppressions_dep",
3262*6777b538SAndroid Build Coastguard Worker            "lint_suppressions_file",
3263*6777b538SAndroid Build Coastguard Worker            "loadable_modules",
3264*6777b538SAndroid Build Coastguard Worker            "manifest_package",
3265*6777b538SAndroid Build Coastguard Worker            "max_sdk_version",
3266*6777b538SAndroid Build Coastguard Worker            "mergeable_android_manifests",
3267*6777b538SAndroid Build Coastguard Worker            "product_config_java_packages",
3268*6777b538SAndroid Build Coastguard Worker            "min_sdk_version",
3269*6777b538SAndroid Build Coastguard Worker            "native_lib_placeholders",
3270*6777b538SAndroid Build Coastguard Worker            "never_incremental",
3271*6777b538SAndroid Build Coastguard Worker            "omit_dex",
3272*6777b538SAndroid Build Coastguard Worker            "png_to_webp",
3273*6777b538SAndroid Build Coastguard Worker            "post_process_package_resources_script",
3274*6777b538SAndroid Build Coastguard Worker            "processor_args_javac",
3275*6777b538SAndroid Build Coastguard Worker            "proguard_configs",
3276*6777b538SAndroid Build Coastguard Worker            "proguard_enabled",
3277*6777b538SAndroid Build Coastguard Worker            "proguard_enable_obfuscation",
3278*6777b538SAndroid Build Coastguard Worker            "r_java_root_package_name",
3279*6777b538SAndroid Build Coastguard Worker            "repackage_classes",
3280*6777b538SAndroid Build Coastguard Worker            "resource_exclusion_exceptions",
3281*6777b538SAndroid Build Coastguard Worker            "resource_exclusion_regex",
3282*6777b538SAndroid Build Coastguard Worker            "resource_ids_provider_dep",
3283*6777b538SAndroid Build Coastguard Worker            "resource_values_filter_rules",
3284*6777b538SAndroid Build Coastguard Worker            "require_native_mocks",
3285*6777b538SAndroid Build Coastguard Worker            "secondary_abi_loadable_modules",
3286*6777b538SAndroid Build Coastguard Worker            "secondary_abi_shared_libraries",
3287*6777b538SAndroid Build Coastguard Worker            "secondary_native_lib_placeholders",
3288*6777b538SAndroid Build Coastguard Worker            "shared_libraries",
3289*6777b538SAndroid Build Coastguard Worker            "shared_resources",
3290*6777b538SAndroid Build Coastguard Worker            "shared_resources_allowlist_locales",
3291*6777b538SAndroid Build Coastguard Worker            "shared_resources_allowlist_target",
3292*6777b538SAndroid Build Coastguard Worker            "sources",
3293*6777b538SAndroid Build Coastguard Worker            "srcjar_deps",
3294*6777b538SAndroid Build Coastguard Worker            "static_library_provider",
3295*6777b538SAndroid Build Coastguard Worker            "static_library_provider_use_secondary_abi",
3296*6777b538SAndroid Build Coastguard Worker            "target_sdk_version",
3297*6777b538SAndroid Build Coastguard Worker            "testonly",
3298*6777b538SAndroid Build Coastguard Worker            "uncompress_dex",
3299*6777b538SAndroid Build Coastguard Worker            "library_always_compress",
3300*6777b538SAndroid Build Coastguard Worker            "use_chromium_linker",
3301*6777b538SAndroid Build Coastguard Worker            "version_code",
3302*6777b538SAndroid Build Coastguard Worker            "version_name",
3303*6777b538SAndroid Build Coastguard Worker            "visibility",
3304*6777b538SAndroid Build Coastguard Worker          ])
3305*6777b538SAndroid Build Coastguard Worker      is_bundle_module = false
3306*6777b538SAndroid Build Coastguard Worker      name = invoker.apk_name
3307*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.final_apk_path)) {
3308*6777b538SAndroid Build Coastguard Worker        final_apk_path = invoker.final_apk_path
3309*6777b538SAndroid Build Coastguard Worker      } else {
3310*6777b538SAndroid Build Coastguard Worker        final_apk_path = "$root_build_dir/apks/${invoker.apk_name}.apk"
3311*6777b538SAndroid Build Coastguard Worker      }
3312*6777b538SAndroid Build Coastguard Worker      metadata = {
3313*6777b538SAndroid Build Coastguard Worker        install_artifacts = [ final_apk_path ]
3314*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.static_library_provider)) {
3315*6777b538SAndroid Build Coastguard Worker          install_artifacts_barrier = []
3316*6777b538SAndroid Build Coastguard Worker        }
3317*6777b538SAndroid Build Coastguard Worker      }
3318*6777b538SAndroid Build Coastguard Worker
3319*6777b538SAndroid Build Coastguard Worker      # TODO(smaier) - there were some remaining usages of this in angle. Once
3320*6777b538SAndroid Build Coastguard Worker      # they are removed, remove this line.
3321*6777b538SAndroid Build Coastguard Worker      not_needed(invoker, [ "generate_final_jni" ])
3322*6777b538SAndroid Build Coastguard Worker    }
3323*6777b538SAndroid Build Coastguard Worker  }
3324*6777b538SAndroid Build Coastguard Worker
3325*6777b538SAndroid Build Coastguard Worker  # Declare an Android app bundle module target.
3326*6777b538SAndroid Build Coastguard Worker  #
3327*6777b538SAndroid Build Coastguard Worker  # The module can be used for an android_apk_or_module().
3328*6777b538SAndroid Build Coastguard Worker  #
3329*6777b538SAndroid Build Coastguard Worker  # Supports all variables of android_library(), plus:
3330*6777b538SAndroid Build Coastguard Worker  #   module_name: Name of the module.
3331*6777b538SAndroid Build Coastguard Worker  #   is_base_module: If defined and true, indicates that this is the bundle's
3332*6777b538SAndroid Build Coastguard Worker  #     base module (optional).
3333*6777b538SAndroid Build Coastguard Worker  #   base_module_target: Base module target of the bundle this module will be
3334*6777b538SAndroid Build Coastguard Worker  #     added to (optional). Can only be specified for non-base modules.
3335*6777b538SAndroid Build Coastguard Worker  template("android_app_bundle_module") {
3336*6777b538SAndroid Build Coastguard Worker    _is_base_module = defined(invoker.is_base_module) && invoker.is_base_module
3337*6777b538SAndroid Build Coastguard Worker
3338*6777b538SAndroid Build Coastguard Worker    if (_is_base_module) {
3339*6777b538SAndroid Build Coastguard Worker      assert(!defined(invoker.base_module_target))
3340*6777b538SAndroid Build Coastguard Worker    } else {
3341*6777b538SAndroid Build Coastguard Worker      assert(!defined(invoker.app_as_shared_lib))
3342*6777b538SAndroid Build Coastguard Worker      assert(!defined(invoker.shared_resources))
3343*6777b538SAndroid Build Coastguard Worker      assert(!defined(invoker.shared_resources_allowlist_target))
3344*6777b538SAndroid Build Coastguard Worker      assert(!defined(invoker.shared_resources_allowlist_locales))
3345*6777b538SAndroid Build Coastguard Worker      assert(defined(invoker.base_module_target))
3346*6777b538SAndroid Build Coastguard Worker    }
3347*6777b538SAndroid Build Coastguard Worker
3348*6777b538SAndroid Build Coastguard Worker    # android_app_bundle's write_build_config expects module targets to be named
3349*6777b538SAndroid Build Coastguard Worker    # according to java_target_patterns otherwise it ignores them when listed in
3350*6777b538SAndroid Build Coastguard Worker    # possible_config_deps. See https://crbug.com/1418398.
3351*6777b538SAndroid Build Coastguard Worker    if (filter_exclude([ target_name ], [ "*_bundle_module" ]) != []) {
3352*6777b538SAndroid Build Coastguard Worker      assert(false,
3353*6777b538SAndroid Build Coastguard Worker             "Invalid android_app_bundle_module target name ($target_name), " +
3354*6777b538SAndroid Build Coastguard Worker                 "must end in _bundle_module.")
3355*6777b538SAndroid Build Coastguard Worker    }
3356*6777b538SAndroid Build Coastguard Worker
3357*6777b538SAndroid Build Coastguard Worker    # TODO(tiborg): We have several flags that are necessary for workarounds
3358*6777b538SAndroid Build Coastguard Worker    # that come from the fact that the resources get compiled in the bundle
3359*6777b538SAndroid Build Coastguard Worker    # module target, but bundle modules have to have certain flags in
3360*6777b538SAndroid Build Coastguard Worker    # common or bundle modules have to know information about the base module.
3361*6777b538SAndroid Build Coastguard Worker    # Those flags include version_code, version_name, and base_module_target.
3362*6777b538SAndroid Build Coastguard Worker    # It would be better to move the resource compile target into the bundle
3363*6777b538SAndroid Build Coastguard Worker    # target. Doing so would keep the bundle modules independent from the bundle
3364*6777b538SAndroid Build Coastguard Worker    # and potentially reuse the same bundle modules for multiple bundles.
3365*6777b538SAndroid Build Coastguard Worker    android_apk_or_module(target_name) {
3366*6777b538SAndroid Build Coastguard Worker      forward_variables_from(
3367*6777b538SAndroid Build Coastguard Worker          invoker,
3368*6777b538SAndroid Build Coastguard Worker          [
3369*6777b538SAndroid Build Coastguard Worker            "add_view_trace_events",
3370*6777b538SAndroid Build Coastguard Worker            "aapt_locale_allowlist",
3371*6777b538SAndroid Build Coastguard Worker            "additional_jar_files",
3372*6777b538SAndroid Build Coastguard Worker            "allow_unused_jni_from_native",
3373*6777b538SAndroid Build Coastguard Worker            "alternative_android_sdk_dep",
3374*6777b538SAndroid Build Coastguard Worker            "android_manifest",
3375*6777b538SAndroid Build Coastguard Worker            "android_manifest_dep",
3376*6777b538SAndroid Build Coastguard Worker            "annotation_processor_deps",
3377*6777b538SAndroid Build Coastguard Worker            "app_as_shared_lib",
3378*6777b538SAndroid Build Coastguard Worker            "assert_no_deps",
3379*6777b538SAndroid Build Coastguard Worker            "assert_no_native_deps",
3380*6777b538SAndroid Build Coastguard Worker            "asset_deps",
3381*6777b538SAndroid Build Coastguard Worker            "base_module_target",
3382*6777b538SAndroid Build Coastguard Worker            "build_config_include_product_version_resource",
3383*6777b538SAndroid Build Coastguard Worker            "bundle_target",
3384*6777b538SAndroid Build Coastguard Worker            "chromium_code",
3385*6777b538SAndroid Build Coastguard Worker            "custom_assertion_handler",
3386*6777b538SAndroid Build Coastguard Worker            "data",
3387*6777b538SAndroid Build Coastguard Worker            "data_deps",
3388*6777b538SAndroid Build Coastguard Worker            "deps",
3389*6777b538SAndroid Build Coastguard Worker            "enable_jni_multiplexing",
3390*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest",
3391*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_base",
3392*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_library_version_offset",
3393*6777b538SAndroid Build Coastguard Worker            "expected_android_manifest_version_code_offset",
3394*6777b538SAndroid Build Coastguard Worker            "generate_buildconfig_java",
3395*6777b538SAndroid Build Coastguard Worker            "generate_native_libraries_java",
3396*6777b538SAndroid Build Coastguard Worker            "input_jars_paths",
3397*6777b538SAndroid Build Coastguard Worker            "isolated_splits_enabled",
3398*6777b538SAndroid Build Coastguard Worker            "is_base_module",
3399*6777b538SAndroid Build Coastguard Worker            "jacoco_never_instrument",
3400*6777b538SAndroid Build Coastguard Worker            "jar_excluded_patterns",
3401*6777b538SAndroid Build Coastguard Worker            "javac_args",
3402*6777b538SAndroid Build Coastguard Worker            "loadable_modules",
3403*6777b538SAndroid Build Coastguard Worker            "product_config_java_packages",
3404*6777b538SAndroid Build Coastguard Worker            "manifest_package",
3405*6777b538SAndroid Build Coastguard Worker            "max_sdk_version",
3406*6777b538SAndroid Build Coastguard Worker            "min_sdk_version",
3407*6777b538SAndroid Build Coastguard Worker            "mergeable_android_manifests",
3408*6777b538SAndroid Build Coastguard Worker            "override_target_sdk",
3409*6777b538SAndroid Build Coastguard Worker            "module_name",
3410*6777b538SAndroid Build Coastguard Worker            "native_lib_placeholders",
3411*6777b538SAndroid Build Coastguard Worker            "package_id",
3412*6777b538SAndroid Build Coastguard Worker            "parent_module_target",
3413*6777b538SAndroid Build Coastguard Worker            "png_to_webp",
3414*6777b538SAndroid Build Coastguard Worker            "processor_args_javac",
3415*6777b538SAndroid Build Coastguard Worker            "proguard_configs",
3416*6777b538SAndroid Build Coastguard Worker            "proguard_enabled",
3417*6777b538SAndroid Build Coastguard Worker            "proguard_enable_obfuscation",
3418*6777b538SAndroid Build Coastguard Worker            "repackage_classes",
3419*6777b538SAndroid Build Coastguard Worker            "resource_exclusion_exceptions",
3420*6777b538SAndroid Build Coastguard Worker            "resource_exclusion_regex",
3421*6777b538SAndroid Build Coastguard Worker            "resource_ids_provider_dep",
3422*6777b538SAndroid Build Coastguard Worker            "resource_values_filter_rules",
3423*6777b538SAndroid Build Coastguard Worker            "resources_config_paths",
3424*6777b538SAndroid Build Coastguard Worker            "secondary_abi_loadable_modules",
3425*6777b538SAndroid Build Coastguard Worker            "secondary_abi_shared_libraries",
3426*6777b538SAndroid Build Coastguard Worker            "secondary_native_lib_placeholders",
3427*6777b538SAndroid Build Coastguard Worker            "shared_libraries",
3428*6777b538SAndroid Build Coastguard Worker            "shared_resources",
3429*6777b538SAndroid Build Coastguard Worker            "shared_resources_allowlist_locales",
3430*6777b538SAndroid Build Coastguard Worker            "shared_resources_allowlist_target",
3431*6777b538SAndroid Build Coastguard Worker            "short_resource_paths",
3432*6777b538SAndroid Build Coastguard Worker            "srcjar_deps",
3433*6777b538SAndroid Build Coastguard Worker            "static_library_provider",
3434*6777b538SAndroid Build Coastguard Worker            "static_library_provider_use_secondary_abi",
3435*6777b538SAndroid Build Coastguard Worker            "strip_resource_names",
3436*6777b538SAndroid Build Coastguard Worker            "strip_unused_resources",
3437*6777b538SAndroid Build Coastguard Worker            "target_sdk_version",
3438*6777b538SAndroid Build Coastguard Worker            "testonly",
3439*6777b538SAndroid Build Coastguard Worker            "library_always_compress",
3440*6777b538SAndroid Build Coastguard Worker            "use_chromium_linker",
3441*6777b538SAndroid Build Coastguard Worker            "uses_split",
3442*6777b538SAndroid Build Coastguard Worker            "version_code",
3443*6777b538SAndroid Build Coastguard Worker            "version_name",
3444*6777b538SAndroid Build Coastguard Worker            "visibility",
3445*6777b538SAndroid Build Coastguard Worker          ])
3446*6777b538SAndroid Build Coastguard Worker      is_bundle_module = true
3447*6777b538SAndroid Build Coastguard Worker      generate_buildconfig_java = _is_base_module
3448*6777b538SAndroid Build Coastguard Worker      if (defined(uses_split)) {
3449*6777b538SAndroid Build Coastguard Worker        assert(defined(parent_module_target),
3450*6777b538SAndroid Build Coastguard Worker               "Must set parent_module_target when uses_split is set")
3451*6777b538SAndroid Build Coastguard Worker      }
3452*6777b538SAndroid Build Coastguard Worker    }
3453*6777b538SAndroid Build Coastguard Worker  }
3454*6777b538SAndroid Build Coastguard Worker
3455*6777b538SAndroid Build Coastguard Worker  # Declare an Android instrumentation test runner.
3456*6777b538SAndroid Build Coastguard Worker  #
3457*6777b538SAndroid Build Coastguard Worker  # This target creates a wrapper script to run Android instrumentation tests.
3458*6777b538SAndroid Build Coastguard Worker  #
3459*6777b538SAndroid Build Coastguard Worker  # Arguments:
3460*6777b538SAndroid Build Coastguard Worker  #   android_test_apk: The target containing the tests.
3461*6777b538SAndroid Build Coastguard Worker  #
3462*6777b538SAndroid Build Coastguard Worker  #   The following args are optional:
3463*6777b538SAndroid Build Coastguard Worker  #   apk_under_test: The target being tested.
3464*6777b538SAndroid Build Coastguard Worker  #   additional_apks: Additional targets to install on device.
3465*6777b538SAndroid Build Coastguard Worker  #   data: List of runtime data file dependencies.
3466*6777b538SAndroid Build Coastguard Worker  #   data_deps: List of non-linked dependencies.
3467*6777b538SAndroid Build Coastguard Worker  #   deps: List of private dependencies.
3468*6777b538SAndroid Build Coastguard Worker  #   extra_args: Extra arguments set for test runner.
3469*6777b538SAndroid Build Coastguard Worker  #   ignore_all_data_deps: Don't build data_deps and additional_apks.
3470*6777b538SAndroid Build Coastguard Worker  #   modules: Extra dynamic feature modules to install for test target. Can
3471*6777b538SAndroid Build Coastguard Worker  #     only be used if |apk_under_test| is an Android app bundle.
3472*6777b538SAndroid Build Coastguard Worker  #   fake_modules: Similar to |modules| but fake installed instead.
3473*6777b538SAndroid Build Coastguard Worker  #   never_incremental: Disable incremental builds.
3474*6777b538SAndroid Build Coastguard Worker  #   proguard_enabled: Enable proguard
3475*6777b538SAndroid Build Coastguard Worker  #   public_deps: List of public dependencies
3476*6777b538SAndroid Build Coastguard Worker  #
3477*6777b538SAndroid Build Coastguard Worker  # Example
3478*6777b538SAndroid Build Coastguard Worker  #   instrumentation_test_runner("foo_test_for_bar") {
3479*6777b538SAndroid Build Coastguard Worker  #     android_test_apk: ":foo"
3480*6777b538SAndroid Build Coastguard Worker  #     apk_under_test: ":bar"
3481*6777b538SAndroid Build Coastguard Worker  #   }
3482*6777b538SAndroid Build Coastguard Worker  template("instrumentation_test_runner") {
3483*6777b538SAndroid Build Coastguard Worker    _incremental_apk = !(defined(invoker.never_incremental) &&
3484*6777b538SAndroid Build Coastguard Worker                         invoker.never_incremental) && incremental_install
3485*6777b538SAndroid Build Coastguard Worker    _apk_operations_target_name = "${target_name}__apk_operations"
3486*6777b538SAndroid Build Coastguard Worker    _apk_target = invoker.android_test_apk
3487*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.apk_under_test) && !_incremental_apk) {
3488*6777b538SAndroid Build Coastguard Worker      # The actual target is defined in the test_runner_script template.
3489*6777b538SAndroid Build Coastguard Worker      _install_artifacts_json =
3490*6777b538SAndroid Build Coastguard Worker          "${target_gen_dir}/${target_name}.install_artifacts"
3491*6777b538SAndroid Build Coastguard Worker      _install_artifacts_target_name = "${target_name}__install_artifacts"
3492*6777b538SAndroid Build Coastguard Worker    }
3493*6777b538SAndroid Build Coastguard Worker
3494*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(_apk_operations_target_name) {
3495*6777b538SAndroid Build Coastguard Worker      testonly = true
3496*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/create_test_apk_wrapper_script.py"
3497*6777b538SAndroid Build Coastguard Worker      deps = []
3498*6777b538SAndroid Build Coastguard Worker      _generated_script = "$root_build_dir/bin/${invoker.target_name}"
3499*6777b538SAndroid Build Coastguard Worker      outputs = [ _generated_script ]
3500*6777b538SAndroid Build Coastguard Worker      _apk_build_config =
3501*6777b538SAndroid Build Coastguard Worker          get_label_info(_apk_target, "target_gen_dir") + "/" +
3502*6777b538SAndroid Build Coastguard Worker          get_label_info(_apk_target, "name") + ".build_config.json"
3503*6777b538SAndroid Build Coastguard Worker      _rebased_apk_build_config = rebase_path(_apk_build_config, root_build_dir)
3504*6777b538SAndroid Build Coastguard Worker      args = [
3505*6777b538SAndroid Build Coastguard Worker        "--script-output-path",
3506*6777b538SAndroid Build Coastguard Worker        rebase_path(_generated_script, root_build_dir),
3507*6777b538SAndroid Build Coastguard Worker        "--package-name",
3508*6777b538SAndroid Build Coastguard Worker        "@FileArg($_rebased_apk_build_config:deps_info:package_name)",
3509*6777b538SAndroid Build Coastguard Worker      ]
3510*6777b538SAndroid Build Coastguard Worker      deps += [ "${_apk_target}$build_config_target_suffix" ]
3511*6777b538SAndroid Build Coastguard Worker      if (_incremental_apk) {
3512*6777b538SAndroid Build Coastguard Worker        args += [
3513*6777b538SAndroid Build Coastguard Worker          "--test-apk-incremental-install-json",
3514*6777b538SAndroid Build Coastguard Worker          "@FileArg($_rebased_apk_build_config:deps_info:incremental_install_json_path)",
3515*6777b538SAndroid Build Coastguard Worker        ]
3516*6777b538SAndroid Build Coastguard Worker      } else {
3517*6777b538SAndroid Build Coastguard Worker        args += [
3518*6777b538SAndroid Build Coastguard Worker          "--test-apk",
3519*6777b538SAndroid Build Coastguard Worker          "@FileArg($_rebased_apk_build_config:deps_info:apk_path)",
3520*6777b538SAndroid Build Coastguard Worker        ]
3521*6777b538SAndroid Build Coastguard Worker      }
3522*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.proguard_mapping_path) && !_incremental_apk) {
3523*6777b538SAndroid Build Coastguard Worker        args += [
3524*6777b538SAndroid Build Coastguard Worker          "--proguard-mapping-path",
3525*6777b538SAndroid Build Coastguard Worker          rebase_path(invoker.proguard_mapping_path, root_build_dir),
3526*6777b538SAndroid Build Coastguard Worker        ]
3527*6777b538SAndroid Build Coastguard Worker      }
3528*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.apk_under_test)) {
3529*6777b538SAndroid Build Coastguard Worker        if (_incremental_apk) {
3530*6777b538SAndroid Build Coastguard Worker          deps += [ "${invoker.apk_under_test}$build_config_target_suffix" ]
3531*6777b538SAndroid Build Coastguard Worker          _apk_under_test_build_config =
3532*6777b538SAndroid Build Coastguard Worker              get_label_info(invoker.apk_under_test, "target_gen_dir") + "/" +
3533*6777b538SAndroid Build Coastguard Worker              get_label_info(invoker.apk_under_test, "name") +
3534*6777b538SAndroid Build Coastguard Worker              ".build_config.json"
3535*6777b538SAndroid Build Coastguard Worker          _rebased_apk_under_test_build_config =
3536*6777b538SAndroid Build Coastguard Worker              rebase_path(_apk_under_test_build_config, root_build_dir)
3537*6777b538SAndroid Build Coastguard Worker          _apk_under_test = "@FileArg($_rebased_apk_under_test_build_config:deps_info:incremental_apk_path)"
3538*6777b538SAndroid Build Coastguard Worker        } else {
3539*6777b538SAndroid Build Coastguard Worker          deps += [ ":${_install_artifacts_target_name}" ]
3540*6777b538SAndroid Build Coastguard Worker          _rebased_install_artifacts_json =
3541*6777b538SAndroid Build Coastguard Worker              rebase_path(_install_artifacts_json, root_build_dir)
3542*6777b538SAndroid Build Coastguard Worker          _apk_under_test = "@FileArg($_rebased_install_artifacts_json[])"
3543*6777b538SAndroid Build Coastguard Worker        }
3544*6777b538SAndroid Build Coastguard Worker        args += [
3545*6777b538SAndroid Build Coastguard Worker          "--additional-apk",
3546*6777b538SAndroid Build Coastguard Worker          _apk_under_test,
3547*6777b538SAndroid Build Coastguard Worker        ]
3548*6777b538SAndroid Build Coastguard Worker      }
3549*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.additional_apks)) {
3550*6777b538SAndroid Build Coastguard Worker        foreach(additional_apk, invoker.additional_apks) {
3551*6777b538SAndroid Build Coastguard Worker          deps += [ "$additional_apk$build_config_target_suffix" ]
3552*6777b538SAndroid Build Coastguard Worker          _build_config =
3553*6777b538SAndroid Build Coastguard Worker              get_label_info(additional_apk, "target_gen_dir") + "/" +
3554*6777b538SAndroid Build Coastguard Worker              get_label_info(additional_apk, "name") + ".build_config.json"
3555*6777b538SAndroid Build Coastguard Worker          _rebased_build_config = rebase_path(_build_config, root_build_dir)
3556*6777b538SAndroid Build Coastguard Worker          args += [
3557*6777b538SAndroid Build Coastguard Worker            "--additional-apk",
3558*6777b538SAndroid Build Coastguard Worker            "@FileArg($_rebased_build_config:deps_info:apk_path)",
3559*6777b538SAndroid Build Coastguard Worker          ]
3560*6777b538SAndroid Build Coastguard Worker        }
3561*6777b538SAndroid Build Coastguard Worker        deps += invoker.additional_apks
3562*6777b538SAndroid Build Coastguard Worker      }
3563*6777b538SAndroid Build Coastguard Worker    }
3564*6777b538SAndroid Build Coastguard Worker    test_runner_script(target_name) {
3565*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
3566*6777b538SAndroid Build Coastguard Worker                             [
3567*6777b538SAndroid Build Coastguard Worker                               "additional_apks",
3568*6777b538SAndroid Build Coastguard Worker                               "additional_locales",
3569*6777b538SAndroid Build Coastguard Worker                               "apk_under_test",
3570*6777b538SAndroid Build Coastguard Worker                               "data",
3571*6777b538SAndroid Build Coastguard Worker                               "data_deps",
3572*6777b538SAndroid Build Coastguard Worker                               "deps",
3573*6777b538SAndroid Build Coastguard Worker                               "extra_args",
3574*6777b538SAndroid Build Coastguard Worker                               "fake_modules",
3575*6777b538SAndroid Build Coastguard Worker                               "ignore_all_data_deps",
3576*6777b538SAndroid Build Coastguard Worker                               "is_unit_test",
3577*6777b538SAndroid Build Coastguard Worker                               "modules",
3578*6777b538SAndroid Build Coastguard Worker                               "proguard_mapping_path",
3579*6777b538SAndroid Build Coastguard Worker                               "use_webview_provider",
3580*6777b538SAndroid Build Coastguard Worker                             ])
3581*6777b538SAndroid Build Coastguard Worker      test_name = invoker.target_name
3582*6777b538SAndroid Build Coastguard Worker      test_type = "instrumentation"
3583*6777b538SAndroid Build Coastguard Worker      apk_target = invoker.android_test_apk
3584*6777b538SAndroid Build Coastguard Worker      incremental_apk = _incremental_apk
3585*6777b538SAndroid Build Coastguard Worker
3586*6777b538SAndroid Build Coastguard Worker      public_deps = [
3587*6777b538SAndroid Build Coastguard Worker        ":$_apk_operations_target_name",
3588*6777b538SAndroid Build Coastguard Worker        apk_target,
3589*6777b538SAndroid Build Coastguard Worker      ]
3590*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.apk_under_test)) {
3591*6777b538SAndroid Build Coastguard Worker        public_deps += [ invoker.apk_under_test ]
3592*6777b538SAndroid Build Coastguard Worker      }
3593*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.additional_apks)) {
3594*6777b538SAndroid Build Coastguard Worker        public_deps += invoker.additional_apks
3595*6777b538SAndroid Build Coastguard Worker      }
3596*6777b538SAndroid Build Coastguard Worker    }
3597*6777b538SAndroid Build Coastguard Worker  }
3598*6777b538SAndroid Build Coastguard Worker
3599*6777b538SAndroid Build Coastguard Worker  # Declare an Android instrumentation test apk
3600*6777b538SAndroid Build Coastguard Worker  #
3601*6777b538SAndroid Build Coastguard Worker  # This target creates an Android instrumentation test apk.
3602*6777b538SAndroid Build Coastguard Worker  #
3603*6777b538SAndroid Build Coastguard Worker  # Supports all variables of android_apk(), plus:
3604*6777b538SAndroid Build Coastguard Worker  #   apk_under_test: The apk being tested (optional).
3605*6777b538SAndroid Build Coastguard Worker  #
3606*6777b538SAndroid Build Coastguard Worker  # Example
3607*6777b538SAndroid Build Coastguard Worker  #   android_test_apk("foo_test_apk") {
3608*6777b538SAndroid Build Coastguard Worker  #     android_manifest = "AndroidManifest.xml"
3609*6777b538SAndroid Build Coastguard Worker  #     apk_name = "FooTest"
3610*6777b538SAndroid Build Coastguard Worker  #     apk_under_test = "Foo"
3611*6777b538SAndroid Build Coastguard Worker  #     sources = [
3612*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooTestCase.java",
3613*6777b538SAndroid Build Coastguard Worker  #       "android/org/chromium/foo/FooExampleTest.java",
3614*6777b538SAndroid Build Coastguard Worker  #     ]
3615*6777b538SAndroid Build Coastguard Worker  #     deps = [
3616*6777b538SAndroid Build Coastguard Worker  #       ":foo_test_support_java"
3617*6777b538SAndroid Build Coastguard Worker  #     ]
3618*6777b538SAndroid Build Coastguard Worker  #   }
3619*6777b538SAndroid Build Coastguard Worker  template("android_test_apk") {
3620*6777b538SAndroid Build Coastguard Worker    android_apk(target_name) {
3621*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
3622*6777b538SAndroid Build Coastguard Worker      testonly = true
3623*6777b538SAndroid Build Coastguard Worker
3624*6777b538SAndroid Build Coastguard Worker      # The size info enables the test_runner to find the source file location
3625*6777b538SAndroid Build Coastguard Worker      # of a test after it is ran.
3626*6777b538SAndroid Build Coastguard Worker      include_size_info = true
3627*6777b538SAndroid Build Coastguard Worker      data = [ "$root_build_dir/size-info/${invoker.apk_name}.apk.jar.info" ]
3628*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.data)) {
3629*6777b538SAndroid Build Coastguard Worker        data += invoker.data
3630*6777b538SAndroid Build Coastguard Worker      }
3631*6777b538SAndroid Build Coastguard Worker
3632*6777b538SAndroid Build Coastguard Worker      deps = [
3633*6777b538SAndroid Build Coastguard Worker        "//testing/android/instrumentation:instrumentation_test_runner_java",
3634*6777b538SAndroid Build Coastguard Worker      ]
3635*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
3636*6777b538SAndroid Build Coastguard Worker        deps += invoker.deps
3637*6777b538SAndroid Build Coastguard Worker      }
3638*6777b538SAndroid Build Coastguard Worker      data_deps = [
3639*6777b538SAndroid Build Coastguard Worker        # Ensure unstripped libraries are included in runtime deps so that
3640*6777b538SAndroid Build Coastguard Worker        # symbolization can be done.
3641*6777b538SAndroid Build Coastguard Worker        ":${target_name}__secondary_abi_shared_library_list",
3642*6777b538SAndroid Build Coastguard Worker        ":${target_name}__shared_library_list",
3643*6777b538SAndroid Build Coastguard Worker      ]
3644*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.data_deps)) {
3645*6777b538SAndroid Build Coastguard Worker        data_deps += invoker.data_deps
3646*6777b538SAndroid Build Coastguard Worker      }
3647*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.apk_under_test)) {
3648*6777b538SAndroid Build Coastguard Worker        data_deps += [ invoker.apk_under_test ]
3649*6777b538SAndroid Build Coastguard Worker      }
3650*6777b538SAndroid Build Coastguard Worker
3651*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.apk_under_test)) {
3652*6777b538SAndroid Build Coastguard Worker        _under_test_label =
3653*6777b538SAndroid Build Coastguard Worker            get_label_info(invoker.apk_under_test, "label_no_toolchain")
3654*6777b538SAndroid Build Coastguard Worker        data_deps += [
3655*6777b538SAndroid Build Coastguard Worker          "${_under_test_label}__secondary_abi_shared_library_list",
3656*6777b538SAndroid Build Coastguard Worker          "${_under_test_label}__shared_library_list",
3657*6777b538SAndroid Build Coastguard Worker        ]
3658*6777b538SAndroid Build Coastguard Worker      }
3659*6777b538SAndroid Build Coastguard Worker
3660*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.additional_apks)) {
3661*6777b538SAndroid Build Coastguard Worker        data_deps += invoker.additional_apks
3662*6777b538SAndroid Build Coastguard Worker      }
3663*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.use_webview_provider)) {
3664*6777b538SAndroid Build Coastguard Worker        data_deps += [ invoker.use_webview_provider ]
3665*6777b538SAndroid Build Coastguard Worker      }
3666*6777b538SAndroid Build Coastguard Worker
3667*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.proguard_enabled) && invoker.proguard_enabled &&
3668*6777b538SAndroid Build Coastguard Worker          !incremental_install) {
3669*6777b538SAndroid Build Coastguard Worker        # When ProGuard is on, we use ProGuard to combine the under test java
3670*6777b538SAndroid Build Coastguard Worker        # code and the test java code. This is to allow us to apply all ProGuard
3671*6777b538SAndroid Build Coastguard Worker        # optimizations that we ship with, but not have them break tests. The
3672*6777b538SAndroid Build Coastguard Worker        # apk under test will still have the same resources, assets, and
3673*6777b538SAndroid Build Coastguard Worker        # manifest, all of which are the ones used in the tests.
3674*6777b538SAndroid Build Coastguard Worker        proguard_configs = [
3675*6777b538SAndroid Build Coastguard Worker          "//testing/android/proguard_for_test.flags",
3676*6777b538SAndroid Build Coastguard Worker          "//third_party/jni_zero/proguard_for_test.flags",
3677*6777b538SAndroid Build Coastguard Worker        ]
3678*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.proguard_configs)) {
3679*6777b538SAndroid Build Coastguard Worker          proguard_configs += invoker.proguard_configs
3680*6777b538SAndroid Build Coastguard Worker        }
3681*6777b538SAndroid Build Coastguard Worker        enable_proguard_checks = false
3682*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.final_apk_path)) {
3683*6777b538SAndroid Build Coastguard Worker          _final_apk_path = final_apk_path
3684*6777b538SAndroid Build Coastguard Worker        } else {
3685*6777b538SAndroid Build Coastguard Worker          _final_apk_path = "$root_build_dir/apks/${invoker.apk_name}.apk"
3686*6777b538SAndroid Build Coastguard Worker        }
3687*6777b538SAndroid Build Coastguard Worker        data += [ "$_final_apk_path.mapping" ]
3688*6777b538SAndroid Build Coastguard Worker      }
3689*6777b538SAndroid Build Coastguard Worker
3690*6777b538SAndroid Build Coastguard Worker      create_apk_script = false
3691*6777b538SAndroid Build Coastguard Worker
3692*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
3693*6777b538SAndroid Build Coastguard Worker                             "*",
3694*6777b538SAndroid Build Coastguard Worker                             TESTONLY_AND_VISIBILITY + [
3695*6777b538SAndroid Build Coastguard Worker                                   "data",
3696*6777b538SAndroid Build Coastguard Worker                                   "data_deps",
3697*6777b538SAndroid Build Coastguard Worker                                   "deps",
3698*6777b538SAndroid Build Coastguard Worker                                   "extra_args",
3699*6777b538SAndroid Build Coastguard Worker                                   "is_unit_test",
3700*6777b538SAndroid Build Coastguard Worker                                   "proguard_configs",
3701*6777b538SAndroid Build Coastguard Worker                                 ])
3702*6777b538SAndroid Build Coastguard Worker    }
3703*6777b538SAndroid Build Coastguard Worker  }
3704*6777b538SAndroid Build Coastguard Worker
3705*6777b538SAndroid Build Coastguard Worker  # Declare an Android instrumentation test apk with wrapper script.
3706*6777b538SAndroid Build Coastguard Worker  #
3707*6777b538SAndroid Build Coastguard Worker  # This target creates an Android instrumentation test apk with wrapper script
3708*6777b538SAndroid Build Coastguard Worker  # to run the test.
3709*6777b538SAndroid Build Coastguard Worker  #
3710*6777b538SAndroid Build Coastguard Worker  # Supports all variables of android_test_apk.
3711*6777b538SAndroid Build Coastguard Worker  template("instrumentation_test_apk") {
3712*6777b538SAndroid Build Coastguard Worker    assert(defined(invoker.apk_name))
3713*6777b538SAndroid Build Coastguard Worker    _apk_target_name = "${target_name}__test_apk"
3714*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
3715*6777b538SAndroid Build Coastguard Worker    android_test_apk(_apk_target_name) {
3716*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
3717*6777b538SAndroid Build Coastguard Worker    }
3718*6777b538SAndroid Build Coastguard Worker    instrumentation_test_runner(target_name) {
3719*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
3720*6777b538SAndroid Build Coastguard Worker                             [
3721*6777b538SAndroid Build Coastguard Worker                               "additional_apks",
3722*6777b538SAndroid Build Coastguard Worker                               "apk_under_test",
3723*6777b538SAndroid Build Coastguard Worker                               "data",
3724*6777b538SAndroid Build Coastguard Worker                               "data_deps",
3725*6777b538SAndroid Build Coastguard Worker                               "deps",
3726*6777b538SAndroid Build Coastguard Worker                               "extra_args",
3727*6777b538SAndroid Build Coastguard Worker                               "ignore_all_data_deps",
3728*6777b538SAndroid Build Coastguard Worker                               "is_unit_test",
3729*6777b538SAndroid Build Coastguard Worker                               "modules",
3730*6777b538SAndroid Build Coastguard Worker                               "never_incremental",
3731*6777b538SAndroid Build Coastguard Worker                               "public_deps",
3732*6777b538SAndroid Build Coastguard Worker                               "use_webview_provider",
3733*6777b538SAndroid Build Coastguard Worker                             ])
3734*6777b538SAndroid Build Coastguard Worker      android_test_apk = ":${_apk_target_name}"
3735*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) {
3736*6777b538SAndroid Build Coastguard Worker        proguard_mapping_path =
3737*6777b538SAndroid Build Coastguard Worker            "$root_build_dir/apks/${invoker.apk_name}.apk.mapping"
3738*6777b538SAndroid Build Coastguard Worker      }
3739*6777b538SAndroid Build Coastguard Worker    }
3740*6777b538SAndroid Build Coastguard Worker  }
3741*6777b538SAndroid Build Coastguard Worker
3742*6777b538SAndroid Build Coastguard Worker  # Declare an Android gtest apk
3743*6777b538SAndroid Build Coastguard Worker  #
3744*6777b538SAndroid Build Coastguard Worker  # This target creates an Android apk for running gtest-based unittests.
3745*6777b538SAndroid Build Coastguard Worker  #
3746*6777b538SAndroid Build Coastguard Worker  # Variables
3747*6777b538SAndroid Build Coastguard Worker  #   deps: Specifies the dependencies of this target. These will be passed to
3748*6777b538SAndroid Build Coastguard Worker  #     the underlying android_apk invocation and should include the java and
3749*6777b538SAndroid Build Coastguard Worker  #     resource dependencies of the apk.
3750*6777b538SAndroid Build Coastguard Worker  #   shared_library: shared_library target that contains the unit tests.
3751*6777b538SAndroid Build Coastguard Worker  #   apk_name: The name of the produced apk. If unspecified, it uses the name
3752*6777b538SAndroid Build Coastguard Worker  #             of the shared_library target suffixed with "_apk".
3753*6777b538SAndroid Build Coastguard Worker  #   use_default_launcher: Whether the default activity (NativeUnitTestActivity)
3754*6777b538SAndroid Build Coastguard Worker  #     should be used for launching tests.
3755*6777b538SAndroid Build Coastguard Worker  #   allow_cleartext_traffic: (Optional) Whether to allow cleartext network
3756*6777b538SAndroid Build Coastguard Worker  #     requests during the test.
3757*6777b538SAndroid Build Coastguard Worker  #   use_native_activity: Test implements ANativeActivity_onCreate().
3758*6777b538SAndroid Build Coastguard Worker  #
3759*6777b538SAndroid Build Coastguard Worker  # Example
3760*6777b538SAndroid Build Coastguard Worker  #   unittest_apk("foo_unittests_apk") {
3761*6777b538SAndroid Build Coastguard Worker  #     deps = [ ":foo_java", ":foo_resources" ]
3762*6777b538SAndroid Build Coastguard Worker  #     shared_library = ":foo_unittests"
3763*6777b538SAndroid Build Coastguard Worker  #   }
3764*6777b538SAndroid Build Coastguard Worker  template("unittest_apk") {
3765*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
3766*6777b538SAndroid Build Coastguard Worker    _use_native_activity =
3767*6777b538SAndroid Build Coastguard Worker        defined(invoker.use_native_activity) && invoker.use_native_activity
3768*6777b538SAndroid Build Coastguard Worker    _android_manifest = "$target_gen_dir/$target_name/AndroidManifest.xml"
3769*6777b538SAndroid Build Coastguard Worker    assert(invoker.shared_library != "")
3770*6777b538SAndroid Build Coastguard Worker
3771*6777b538SAndroid Build Coastguard Worker    # This trivial assert is needed in case android_manifest is defined,
3772*6777b538SAndroid Build Coastguard Worker    # as otherwise _use_native_activity and _android_manifest would not be used.
3773*6777b538SAndroid Build Coastguard Worker    assert(_use_native_activity != "" && _android_manifest != "")
3774*6777b538SAndroid Build Coastguard Worker
3775*6777b538SAndroid Build Coastguard Worker    if (!defined(invoker.android_manifest)) {
3776*6777b538SAndroid Build Coastguard Worker      _allow_cleartext_traffic = defined(invoker.allow_cleartext_traffic) &&
3777*6777b538SAndroid Build Coastguard Worker                                 invoker.allow_cleartext_traffic
3778*6777b538SAndroid Build Coastguard Worker      jinja_template("${target_name}_manifest") {
3779*6777b538SAndroid Build Coastguard Worker        _native_library_name = get_label_info(invoker.shared_library, "name")
3780*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.android_manifest_template)) {
3781*6777b538SAndroid Build Coastguard Worker          input = invoker.android_manifest_template
3782*6777b538SAndroid Build Coastguard Worker        } else {
3783*6777b538SAndroid Build Coastguard Worker          input =
3784*6777b538SAndroid Build Coastguard Worker              "//testing/android/native_test/java/AndroidManifest.xml.jinja2"
3785*6777b538SAndroid Build Coastguard Worker        }
3786*6777b538SAndroid Build Coastguard Worker        output = _android_manifest
3787*6777b538SAndroid Build Coastguard Worker        variables = [
3788*6777b538SAndroid Build Coastguard Worker          "is_component_build=${is_component_build}",
3789*6777b538SAndroid Build Coastguard Worker          "native_library_name=${_native_library_name}",
3790*6777b538SAndroid Build Coastguard Worker          "use_native_activity=${_use_native_activity}",
3791*6777b538SAndroid Build Coastguard Worker          "allow_cleartext_traffic=${_allow_cleartext_traffic}",
3792*6777b538SAndroid Build Coastguard Worker        ]
3793*6777b538SAndroid Build Coastguard Worker      }
3794*6777b538SAndroid Build Coastguard Worker    }
3795*6777b538SAndroid Build Coastguard Worker
3796*6777b538SAndroid Build Coastguard Worker    android_apk(target_name) {
3797*6777b538SAndroid Build Coastguard Worker      data_deps = []
3798*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
3799*6777b538SAndroid Build Coastguard Worker      testonly = true
3800*6777b538SAndroid Build Coastguard Worker      create_apk_script = false
3801*6777b538SAndroid Build Coastguard Worker
3802*6777b538SAndroid Build Coastguard Worker      # TODO(crbug.com/1099849): Figure out why angle tests fail to launch
3803*6777b538SAndroid Build Coastguard Worker      #     with newer target_sdk_version.
3804*6777b538SAndroid Build Coastguard Worker      if (!defined(invoker.target_sdk_version) && _use_native_activity) {
3805*6777b538SAndroid Build Coastguard Worker        target_sdk_version = 24
3806*6777b538SAndroid Build Coastguard Worker      }
3807*6777b538SAndroid Build Coastguard Worker
3808*6777b538SAndroid Build Coastguard Worker      assert(!defined(invoker.proguard_enabled) || !invoker.proguard_enabled ||
3809*6777b538SAndroid Build Coastguard Worker             invoker.proguard_configs != [])
3810*6777b538SAndroid Build Coastguard Worker
3811*6777b538SAndroid Build Coastguard Worker      if (!defined(apk_name)) {
3812*6777b538SAndroid Build Coastguard Worker        apk_name = get_label_info(invoker.shared_library, "name")
3813*6777b538SAndroid Build Coastguard Worker      }
3814*6777b538SAndroid Build Coastguard Worker
3815*6777b538SAndroid Build Coastguard Worker      if (!defined(android_manifest)) {
3816*6777b538SAndroid Build Coastguard Worker        android_manifest_dep = ":${target_name}_manifest"
3817*6777b538SAndroid Build Coastguard Worker        android_manifest = _android_manifest
3818*6777b538SAndroid Build Coastguard Worker      }
3819*6777b538SAndroid Build Coastguard Worker
3820*6777b538SAndroid Build Coastguard Worker      final_apk_path = "$root_build_dir/${apk_name}_apk/${apk_name}-debug.apk"
3821*6777b538SAndroid Build Coastguard Worker
3822*6777b538SAndroid Build Coastguard Worker      if (!defined(use_default_launcher) || use_default_launcher) {
3823*6777b538SAndroid Build Coastguard Worker        deps += [
3824*6777b538SAndroid Build Coastguard Worker          "//build/android/gtest_apk:native_test_instrumentation_test_runner_java",
3825*6777b538SAndroid Build Coastguard Worker          "//testing/android/native_test:native_test_java",
3826*6777b538SAndroid Build Coastguard Worker        ]
3827*6777b538SAndroid Build Coastguard Worker      }
3828*6777b538SAndroid Build Coastguard Worker      shared_libraries = [ invoker.shared_library ]
3829*6777b538SAndroid Build Coastguard Worker      deps += [
3830*6777b538SAndroid Build Coastguard Worker        ":${target_name}__secondary_abi_shared_library_list",
3831*6777b538SAndroid Build Coastguard Worker        ":${target_name}__shared_library_list",
3832*6777b538SAndroid Build Coastguard Worker      ]
3833*6777b538SAndroid Build Coastguard Worker    }
3834*6777b538SAndroid Build Coastguard Worker  }
3835*6777b538SAndroid Build Coastguard Worker
3836*6777b538SAndroid Build Coastguard Worker  # Generate .java files from .aidl files.
3837*6777b538SAndroid Build Coastguard Worker  #
3838*6777b538SAndroid Build Coastguard Worker  # This target will store the .java files in a srcjar and should be included in
3839*6777b538SAndroid Build Coastguard Worker  # an android_library or android_apk's srcjar_deps.
3840*6777b538SAndroid Build Coastguard Worker  #
3841*6777b538SAndroid Build Coastguard Worker  # Variables
3842*6777b538SAndroid Build Coastguard Worker  #   sources: Paths to .aidl files to compile.
3843*6777b538SAndroid Build Coastguard Worker  #   import_include: Path to directory containing .java files imported by the
3844*6777b538SAndroid Build Coastguard Worker  #     .aidl files.
3845*6777b538SAndroid Build Coastguard Worker  #   interface_file: Preprocessed aidl file to import.
3846*6777b538SAndroid Build Coastguard Worker  #
3847*6777b538SAndroid Build Coastguard Worker  # Example
3848*6777b538SAndroid Build Coastguard Worker  #   android_aidl("foo_aidl") {
3849*6777b538SAndroid Build Coastguard Worker  #     import_include = "java/src"
3850*6777b538SAndroid Build Coastguard Worker  #     sources = [
3851*6777b538SAndroid Build Coastguard Worker  #       "java/src/com/foo/bar/FooBarService.aidl",
3852*6777b538SAndroid Build Coastguard Worker  #       "java/src/com/foo/bar/FooBarServiceCallback.aidl",
3853*6777b538SAndroid Build Coastguard Worker  #     ]
3854*6777b538SAndroid Build Coastguard Worker  #   }
3855*6777b538SAndroid Build Coastguard Worker  template("android_aidl") {
3856*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
3857*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
3858*6777b538SAndroid Build Coastguard Worker
3859*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/aidl.py"
3860*6777b538SAndroid Build Coastguard Worker      depfile = "$target_gen_dir/$target_name.d"
3861*6777b538SAndroid Build Coastguard Worker      sources = invoker.sources
3862*6777b538SAndroid Build Coastguard Worker
3863*6777b538SAndroid Build Coastguard Worker      _srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
3864*6777b538SAndroid Build Coastguard Worker      _aidl_path = "${android_sdk_build_tools}/aidl"
3865*6777b538SAndroid Build Coastguard Worker      _framework_aidl = "$android_sdk/framework.aidl"
3866*6777b538SAndroid Build Coastguard Worker      _imports = [ _framework_aidl ]
3867*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.interface_file)) {
3868*6777b538SAndroid Build Coastguard Worker        assert(invoker.interface_file != "")
3869*6777b538SAndroid Build Coastguard Worker        _imports += [ invoker.interface_file ]
3870*6777b538SAndroid Build Coastguard Worker      }
3871*6777b538SAndroid Build Coastguard Worker
3872*6777b538SAndroid Build Coastguard Worker      inputs = [ _aidl_path ] + _imports
3873*6777b538SAndroid Build Coastguard Worker
3874*6777b538SAndroid Build Coastguard Worker      outputs = [ _srcjar_path ]
3875*6777b538SAndroid Build Coastguard Worker      _rebased_imports = rebase_path(_imports, root_build_dir)
3876*6777b538SAndroid Build Coastguard Worker      args = [
3877*6777b538SAndroid Build Coastguard Worker        "--aidl-path",
3878*6777b538SAndroid Build Coastguard Worker        rebase_path(_aidl_path, root_build_dir),
3879*6777b538SAndroid Build Coastguard Worker        "--imports=$_rebased_imports",
3880*6777b538SAndroid Build Coastguard Worker        "--srcjar",
3881*6777b538SAndroid Build Coastguard Worker        rebase_path(_srcjar_path, root_build_dir),
3882*6777b538SAndroid Build Coastguard Worker        "--depfile",
3883*6777b538SAndroid Build Coastguard Worker        rebase_path(depfile, root_build_dir),
3884*6777b538SAndroid Build Coastguard Worker      ]
3885*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.import_include) && invoker.import_include != []) {
3886*6777b538SAndroid Build Coastguard Worker        _rebased_import_paths = []
3887*6777b538SAndroid Build Coastguard Worker        foreach(_import_path, invoker.import_include) {
3888*6777b538SAndroid Build Coastguard Worker          _rebased_import_path = []
3889*6777b538SAndroid Build Coastguard Worker          _rebased_import_path = [ rebase_path(_import_path, root_build_dir) ]
3890*6777b538SAndroid Build Coastguard Worker          _rebased_import_paths += _rebased_import_path
3891*6777b538SAndroid Build Coastguard Worker        }
3892*6777b538SAndroid Build Coastguard Worker        args += [ "--includes=$_rebased_import_paths" ]
3893*6777b538SAndroid Build Coastguard Worker      }
3894*6777b538SAndroid Build Coastguard Worker      args += rebase_path(sources, root_build_dir)
3895*6777b538SAndroid Build Coastguard Worker    }
3896*6777b538SAndroid Build Coastguard Worker  }
3897*6777b538SAndroid Build Coastguard Worker
3898*6777b538SAndroid Build Coastguard Worker  # Compile a protocol buffer to java.
3899*6777b538SAndroid Build Coastguard Worker  #
3900*6777b538SAndroid Build Coastguard Worker  # This generates java files from protocol buffers and creates an Android library
3901*6777b538SAndroid Build Coastguard Worker  # containing the classes.
3902*6777b538SAndroid Build Coastguard Worker  #
3903*6777b538SAndroid Build Coastguard Worker  # Variables
3904*6777b538SAndroid Build Coastguard Worker  #   sources (required)
3905*6777b538SAndroid Build Coastguard Worker  #       Paths to .proto files to compile.
3906*6777b538SAndroid Build Coastguard Worker  #
3907*6777b538SAndroid Build Coastguard Worker  #   proto_path (required)
3908*6777b538SAndroid Build Coastguard Worker  #       Root directory of .proto files.
3909*6777b538SAndroid Build Coastguard Worker  #
3910*6777b538SAndroid Build Coastguard Worker  #   deps (optional)
3911*6777b538SAndroid Build Coastguard Worker  #       Additional dependencies. Passed through to both the action and the
3912*6777b538SAndroid Build Coastguard Worker  #       android_library targets.
3913*6777b538SAndroid Build Coastguard Worker  #
3914*6777b538SAndroid Build Coastguard Worker  #   import_dirs (optional)
3915*6777b538SAndroid Build Coastguard Worker  #       A list of extra import directories to be passed to protoc compiler.
3916*6777b538SAndroid Build Coastguard Worker  #       WARNING: This circumvents proto checkdeps, and should only be used
3917*6777b538SAndroid Build Coastguard Worker  #       when needed, typically when proto files cannot cleanly import through
3918*6777b538SAndroid Build Coastguard Worker  #       absolute paths, such as for third_party or generated .proto files.
3919*6777b538SAndroid Build Coastguard Worker  #       http://crbug.com/691451 tracks fixing this.
3920*6777b538SAndroid Build Coastguard Worker  #
3921*6777b538SAndroid Build Coastguard Worker  #   generator_plugin_label (optional)
3922*6777b538SAndroid Build Coastguard Worker  #       GN label for plugin executable which generates custom cc stubs.
3923*6777b538SAndroid Build Coastguard Worker  #       Don't specify a toolchain, host toolchain is assumed.
3924*6777b538SAndroid Build Coastguard Worker  #
3925*6777b538SAndroid Build Coastguard Worker  # Example:
3926*6777b538SAndroid Build Coastguard Worker  #  proto_java_library("foo_proto_java") {
3927*6777b538SAndroid Build Coastguard Worker  #    proto_path = "src/foo"
3928*6777b538SAndroid Build Coastguard Worker  #    sources = [ "$proto_path/foo.proto" ]
3929*6777b538SAndroid Build Coastguard Worker  #  }
3930*6777b538SAndroid Build Coastguard Worker  template("proto_java_library") {
3931*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
3932*6777b538SAndroid Build Coastguard Worker
3933*6777b538SAndroid Build Coastguard Worker    _template_name = target_name
3934*6777b538SAndroid Build Coastguard Worker
3935*6777b538SAndroid Build Coastguard Worker    action_with_pydeps("${_template_name}__protoc_java") {
3936*6777b538SAndroid Build Coastguard Worker      # The suffix "__protoc_java.srcjar" is used by SuperSize to identify
3937*6777b538SAndroid Build Coastguard Worker      # protobuf symbols.
3938*6777b538SAndroid Build Coastguard Worker      _srcjar_path = "$target_gen_dir/$target_name.srcjar"
3939*6777b538SAndroid Build Coastguard Worker      script = "//build/protoc_java.py"
3940*6777b538SAndroid Build Coastguard Worker
3941*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
3942*6777b538SAndroid Build Coastguard Worker        # Need to care only about targets that might generate .proto files.
3943*6777b538SAndroid Build Coastguard Worker        # No need to depend on java_library or android_resource targets.
3944*6777b538SAndroid Build Coastguard Worker        deps = filter_exclude(invoker.deps, java_target_patterns)
3945*6777b538SAndroid Build Coastguard Worker      }
3946*6777b538SAndroid Build Coastguard Worker
3947*6777b538SAndroid Build Coastguard Worker      sources = invoker.sources
3948*6777b538SAndroid Build Coastguard Worker      depfile = "$target_gen_dir/$target_name.d"
3949*6777b538SAndroid Build Coastguard Worker      outputs = [ _srcjar_path ]
3950*6777b538SAndroid Build Coastguard Worker      args = [
3951*6777b538SAndroid Build Coastguard Worker        "--depfile",
3952*6777b538SAndroid Build Coastguard Worker        rebase_path(depfile, root_build_dir),
3953*6777b538SAndroid Build Coastguard Worker        "--protoc",
3954*6777b538SAndroid Build Coastguard Worker        rebase_path(android_protoc_bin, root_build_dir),
3955*6777b538SAndroid Build Coastguard Worker        "--proto-path",
3956*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.proto_path, root_build_dir),
3957*6777b538SAndroid Build Coastguard Worker        "--srcjar",
3958*6777b538SAndroid Build Coastguard Worker        rebase_path(_srcjar_path, root_build_dir),
3959*6777b538SAndroid Build Coastguard Worker      ]
3960*6777b538SAndroid Build Coastguard Worker
3961*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.generator_plugin_label)) {
3962*6777b538SAndroid Build Coastguard Worker        if (host_os == "win") {
3963*6777b538SAndroid Build Coastguard Worker          _host_executable_suffix = ".exe"
3964*6777b538SAndroid Build Coastguard Worker        } else {
3965*6777b538SAndroid Build Coastguard Worker          _host_executable_suffix = ""
3966*6777b538SAndroid Build Coastguard Worker        }
3967*6777b538SAndroid Build Coastguard Worker
3968*6777b538SAndroid Build Coastguard Worker        _plugin_host_label =
3969*6777b538SAndroid Build Coastguard Worker            invoker.generator_plugin_label + "($host_toolchain)"
3970*6777b538SAndroid Build Coastguard Worker        _plugin_path =
3971*6777b538SAndroid Build Coastguard Worker            get_label_info(_plugin_host_label, "root_out_dir") + "/" +
3972*6777b538SAndroid Build Coastguard Worker            get_label_info(_plugin_host_label, "name") + _host_executable_suffix
3973*6777b538SAndroid Build Coastguard Worker        args += [
3974*6777b538SAndroid Build Coastguard Worker          "--plugin",
3975*6777b538SAndroid Build Coastguard Worker          rebase_path(_plugin_path, root_build_dir),
3976*6777b538SAndroid Build Coastguard Worker        ]
3977*6777b538SAndroid Build Coastguard Worker        deps += [ _plugin_host_label ]
3978*6777b538SAndroid Build Coastguard Worker        inputs = [ _plugin_path ]
3979*6777b538SAndroid Build Coastguard Worker      }
3980*6777b538SAndroid Build Coastguard Worker
3981*6777b538SAndroid Build Coastguard Worker      args += rebase_path(sources, root_build_dir)
3982*6777b538SAndroid Build Coastguard Worker
3983*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.import_dirs)) {
3984*6777b538SAndroid Build Coastguard Worker        foreach(_import_dir, invoker.import_dirs) {
3985*6777b538SAndroid Build Coastguard Worker          args += [
3986*6777b538SAndroid Build Coastguard Worker            "--import-dir",
3987*6777b538SAndroid Build Coastguard Worker            rebase_path(_import_dir, root_build_dir),
3988*6777b538SAndroid Build Coastguard Worker          ]
3989*6777b538SAndroid Build Coastguard Worker        }
3990*6777b538SAndroid Build Coastguard Worker      }
3991*6777b538SAndroid Build Coastguard Worker    }
3992*6777b538SAndroid Build Coastguard Worker
3993*6777b538SAndroid Build Coastguard Worker    android_library(target_name) {
3994*6777b538SAndroid Build Coastguard Worker      chromium_code = false
3995*6777b538SAndroid Build Coastguard Worker      sources = []
3996*6777b538SAndroid Build Coastguard Worker      srcjar_deps = [ ":${_template_name}__protoc_java" ]
3997*6777b538SAndroid Build Coastguard Worker      deps = [ "//third_party/android_deps:protobuf_lite_runtime_java" ]
3998*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
3999*6777b538SAndroid Build Coastguard Worker        deps += invoker.deps
4000*6777b538SAndroid Build Coastguard Worker      }
4001*6777b538SAndroid Build Coastguard Worker    }
4002*6777b538SAndroid Build Coastguard Worker  }
4003*6777b538SAndroid Build Coastguard Worker
4004*6777b538SAndroid Build Coastguard Worker  # Compile a flatbuffer to java.
4005*6777b538SAndroid Build Coastguard Worker  #
4006*6777b538SAndroid Build Coastguard Worker  # This generates java files from flat buffers and creates an Android library
4007*6777b538SAndroid Build Coastguard Worker  # containing the classes.
4008*6777b538SAndroid Build Coastguard Worker  #
4009*6777b538SAndroid Build Coastguard Worker  # Variables
4010*6777b538SAndroid Build Coastguard Worker  #   sources (required)
4011*6777b538SAndroid Build Coastguard Worker  #       Paths to .fbs files to compile.
4012*6777b538SAndroid Build Coastguard Worker  #
4013*6777b538SAndroid Build Coastguard Worker  #   root_dir (required)
4014*6777b538SAndroid Build Coastguard Worker  #       Root directory of .fbs files.
4015*6777b538SAndroid Build Coastguard Worker  #
4016*6777b538SAndroid Build Coastguard Worker  #   deps (optional)
4017*6777b538SAndroid Build Coastguard Worker  #       Additional dependencies. Passed through to both the action and the
4018*6777b538SAndroid Build Coastguard Worker  #       android_library targets.
4019*6777b538SAndroid Build Coastguard Worker  #
4020*6777b538SAndroid Build Coastguard Worker  #   flatc_include_dirs (optional)
4021*6777b538SAndroid Build Coastguard Worker  #       A list of extra import directories to be passed to flatc compiler.
4022*6777b538SAndroid Build Coastguard Worker  #
4023*6777b538SAndroid Build Coastguard Worker  #
4024*6777b538SAndroid Build Coastguard Worker  # Example:
4025*6777b538SAndroid Build Coastguard Worker  #  flatbuffer_java_library("foo_flatbuffer_java") {
4026*6777b538SAndroid Build Coastguard Worker  #    root_dir = "src/foo"
4027*6777b538SAndroid Build Coastguard Worker  #    sources = [ "$proto_path/foo.fbs" ]
4028*6777b538SAndroid Build Coastguard Worker  #  }
4029*6777b538SAndroid Build Coastguard Worker  template("flatbuffer_java_library") {
4030*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
4031*6777b538SAndroid Build Coastguard Worker
4032*6777b538SAndroid Build Coastguard Worker    _template_name = target_name
4033*6777b538SAndroid Build Coastguard Worker    _flatc_dep = "//third_party/flatbuffers:flatc($host_toolchain)"
4034*6777b538SAndroid Build Coastguard Worker    _flatc_out_dir = get_label_info(_flatc_dep, "root_out_dir")
4035*6777b538SAndroid Build Coastguard Worker    _flatc_bin = "$_flatc_out_dir/flatc"
4036*6777b538SAndroid Build Coastguard Worker
4037*6777b538SAndroid Build Coastguard Worker    action_with_pydeps("${_template_name}__flatc_java") {
4038*6777b538SAndroid Build Coastguard Worker      _srcjar_path = "$target_gen_dir/$target_name.srcjar"
4039*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/flatc_java.py"
4040*6777b538SAndroid Build Coastguard Worker
4041*6777b538SAndroid Build Coastguard Worker      deps = [ _flatc_dep ]
4042*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
4043*6777b538SAndroid Build Coastguard Worker        deps += invoker.deps
4044*6777b538SAndroid Build Coastguard Worker      }
4045*6777b538SAndroid Build Coastguard Worker      inputs = [ _flatc_bin ]
4046*6777b538SAndroid Build Coastguard Worker
4047*6777b538SAndroid Build Coastguard Worker      sources = invoker.sources
4048*6777b538SAndroid Build Coastguard Worker      outputs = [ _srcjar_path ]
4049*6777b538SAndroid Build Coastguard Worker      args = [
4050*6777b538SAndroid Build Coastguard Worker               "--flatc",
4051*6777b538SAndroid Build Coastguard Worker               rebase_path(_flatc_bin, root_build_dir),
4052*6777b538SAndroid Build Coastguard Worker               "--import-dir",
4053*6777b538SAndroid Build Coastguard Worker               rebase_path(invoker.root_dir, root_build_dir),
4054*6777b538SAndroid Build Coastguard Worker               "--srcjar",
4055*6777b538SAndroid Build Coastguard Worker               rebase_path(_srcjar_path, root_build_dir),
4056*6777b538SAndroid Build Coastguard Worker             ] + rebase_path(sources, root_build_dir)
4057*6777b538SAndroid Build Coastguard Worker
4058*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.flatc_include_dirs)) {
4059*6777b538SAndroid Build Coastguard Worker        foreach(_include_dir, invoker.flatc_include_dirs) {
4060*6777b538SAndroid Build Coastguard Worker          args += [
4061*6777b538SAndroid Build Coastguard Worker            "--import-dir",
4062*6777b538SAndroid Build Coastguard Worker            rebase_path(_include_dir, root_build_dir),
4063*6777b538SAndroid Build Coastguard Worker          ]
4064*6777b538SAndroid Build Coastguard Worker        }
4065*6777b538SAndroid Build Coastguard Worker      }
4066*6777b538SAndroid Build Coastguard Worker    }
4067*6777b538SAndroid Build Coastguard Worker
4068*6777b538SAndroid Build Coastguard Worker    android_library(target_name) {
4069*6777b538SAndroid Build Coastguard Worker      chromium_code = false
4070*6777b538SAndroid Build Coastguard Worker      sources = []
4071*6777b538SAndroid Build Coastguard Worker      srcjar_deps = [ ":${_template_name}__flatc_java" ]
4072*6777b538SAndroid Build Coastguard Worker      deps = [ "//third_party/flatbuffers:flatbuffers_java" ]
4073*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
4074*6777b538SAndroid Build Coastguard Worker        deps += invoker.deps
4075*6777b538SAndroid Build Coastguard Worker      }
4076*6777b538SAndroid Build Coastguard Worker    }
4077*6777b538SAndroid Build Coastguard Worker  }
4078*6777b538SAndroid Build Coastguard Worker
4079*6777b538SAndroid Build Coastguard Worker  # Declare an Android library target for a prebuilt AAR.
4080*6777b538SAndroid Build Coastguard Worker  #
4081*6777b538SAndroid Build Coastguard Worker  # This target creates an Android library containing java code and Android
4082*6777b538SAndroid Build Coastguard Worker  # resources. For libraries without resources, it will not generate
4083*6777b538SAndroid Build Coastguard Worker  # corresponding android_resources targets.
4084*6777b538SAndroid Build Coastguard Worker  #
4085*6777b538SAndroid Build Coastguard Worker  # To avoid slowing down "gn gen", an associated .info file must be committed
4086*6777b538SAndroid Build Coastguard Worker  # along with the .aar file. In order to create this file, define the target
4087*6777b538SAndroid Build Coastguard Worker  # and then run once with the gn arg "update_android_aar_prebuilts = true".
4088*6777b538SAndroid Build Coastguard Worker  #
4089*6777b538SAndroid Build Coastguard Worker  # Variables
4090*6777b538SAndroid Build Coastguard Worker  #   aar_path: Path to the AAR.
4091*6777b538SAndroid Build Coastguard Worker  #   info_path: Path to the .aar.info file (generated via
4092*6777b538SAndroid Build Coastguard Worker  #       update_android_aar_prebuilts GN arg).
4093*6777b538SAndroid Build Coastguard Worker  #   proguard_configs: List of proguard configs to use in final apk step for
4094*6777b538SAndroid Build Coastguard Worker  #       any apk that depends on this library.
4095*6777b538SAndroid Build Coastguard Worker  #   ignore_aidl: Whether to ignore .aidl files found with the .aar.
4096*6777b538SAndroid Build Coastguard Worker  #   ignore_assets: Whether to ignore assets found in the .aar.
4097*6777b538SAndroid Build Coastguard Worker  #   ignore_manifest: Whether to ignore creating manifest.
4098*6777b538SAndroid Build Coastguard Worker  #   ignore_native_libraries: Whether to ignore .so files found in the .aar.
4099*6777b538SAndroid Build Coastguard Worker  #       See also extract_native_libraries.
4100*6777b538SAndroid Build Coastguard Worker  #   ignore_proguard_configs: Whether to ignore proguard configs.
4101*6777b538SAndroid Build Coastguard Worker  #   strip_resources: Whether to ignore android resources found in the .aar.
4102*6777b538SAndroid Build Coastguard Worker  #   custom_package: Java package for generated R.java files.
4103*6777b538SAndroid Build Coastguard Worker  #   extract_native_libraries: Whether to extract .so files found in the .aar.
4104*6777b538SAndroid Build Coastguard Worker  #       If the file contains .so, either extract_native_libraries or
4105*6777b538SAndroid Build Coastguard Worker  #       ignore_native_libraries must be set.
4106*6777b538SAndroid Build Coastguard Worker  #   TODO(jbudorick@): remove this arguments after crbug.com/522043 is fixed.
4107*6777b538SAndroid Build Coastguard Worker  #   requires_android: Whether this target can only be used for compiling
4108*6777b538SAndroid Build Coastguard Worker  #       Android related targets.
4109*6777b538SAndroid Build Coastguard Worker  #
4110*6777b538SAndroid Build Coastguard Worker  # Example
4111*6777b538SAndroid Build Coastguard Worker  #   android_aar_prebuilt("foo_java") {
4112*6777b538SAndroid Build Coastguard Worker  #     aar_path = "foo.aar"
4113*6777b538SAndroid Build Coastguard Worker  #   }
4114*6777b538SAndroid Build Coastguard Worker  template("android_aar_prebuilt") {
4115*6777b538SAndroid Build Coastguard Worker    _info_path = "$target_name.info"
4116*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.info_path)) {
4117*6777b538SAndroid Build Coastguard Worker      _info_path = invoker.info_path
4118*6777b538SAndroid Build Coastguard Worker    }
4119*6777b538SAndroid Build Coastguard Worker    _output_path = "${target_out_dir}/${target_name}"
4120*6777b538SAndroid Build Coastguard Worker
4121*6777b538SAndroid Build Coastguard Worker    # Some targets only differ by _java with other targets so _java and _junit
4122*6777b538SAndroid Build Coastguard Worker    # need to be replaced by non-empty strings to avoid duplicate targets. (e.g.
4123*6777b538SAndroid Build Coastguard Worker    # androidx_window_window_java vs androidx_window_window_java_java).
4124*6777b538SAndroid Build Coastguard Worker    _target_name_without_java_or_junit =
4125*6777b538SAndroid Build Coastguard Worker        string_replace(string_replace(target_name, "_java", "_J"),
4126*6777b538SAndroid Build Coastguard Worker                       "_junit",
4127*6777b538SAndroid Build Coastguard Worker                       "_U")
4128*6777b538SAndroid Build Coastguard Worker
4129*6777b538SAndroid Build Coastguard Worker    # This unpack target is a python action, not a valid java target. Since the
4130*6777b538SAndroid Build Coastguard Worker    # java targets below depend on it, its name must not match the java patterns
4131*6777b538SAndroid Build Coastguard Worker    # in internal_rules.gni.
4132*6777b538SAndroid Build Coastguard Worker    _unpack_target_name = "${_target_name_without_java_or_junit}__unpack_aar"
4133*6777b538SAndroid Build Coastguard Worker    _ignore_aidl = defined(invoker.ignore_aidl) && invoker.ignore_aidl
4134*6777b538SAndroid Build Coastguard Worker    _ignore_assets = defined(invoker.ignore_assets) && invoker.ignore_assets
4135*6777b538SAndroid Build Coastguard Worker    _ignore_manifest =
4136*6777b538SAndroid Build Coastguard Worker        defined(invoker.ignore_manifest) && invoker.ignore_manifest
4137*6777b538SAndroid Build Coastguard Worker    _ignore_native_libraries = defined(invoker.ignore_native_libraries) &&
4138*6777b538SAndroid Build Coastguard Worker                               invoker.ignore_native_libraries
4139*6777b538SAndroid Build Coastguard Worker    _ignore_proguard_configs = defined(invoker.ignore_proguard_configs) &&
4140*6777b538SAndroid Build Coastguard Worker                               invoker.ignore_proguard_configs
4141*6777b538SAndroid Build Coastguard Worker    _extract_native_libraries = defined(invoker.extract_native_libraries) &&
4142*6777b538SAndroid Build Coastguard Worker                                invoker.extract_native_libraries
4143*6777b538SAndroid Build Coastguard Worker    _strip_resources =
4144*6777b538SAndroid Build Coastguard Worker        defined(invoker.strip_resources) && invoker.strip_resources
4145*6777b538SAndroid Build Coastguard Worker
4146*6777b538SAndroid Build Coastguard Worker    # Allow 'resource_overlay' parameter even if there are no resources in order
4147*6777b538SAndroid Build Coastguard Worker    # to keep the logic for generated 'android_aar_prebuilt' rules simple.
4148*6777b538SAndroid Build Coastguard Worker    not_needed(invoker, [ "resource_overlay" ])
4149*6777b538SAndroid Build Coastguard Worker
4150*6777b538SAndroid Build Coastguard Worker    _aar_common_args = [ rebase_path(invoker.aar_path, root_build_dir) ]
4151*6777b538SAndroid Build Coastguard Worker    if (_strip_resources) {
4152*6777b538SAndroid Build Coastguard Worker      _aar_common_args += [ "--ignore-resources" ]
4153*6777b538SAndroid Build Coastguard Worker    }
4154*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.resource_exclusion_globs)) {
4155*6777b538SAndroid Build Coastguard Worker      _aar_common_args +=
4156*6777b538SAndroid Build Coastguard Worker          [ "--resource-exclusion-globs=${invoker.resource_exclusion_globs}" ]
4157*6777b538SAndroid Build Coastguard Worker    }
4158*6777b538SAndroid Build Coastguard Worker
4159*6777b538SAndroid Build Coastguard Worker    # Scan the AAR file and determine the resources and jar files.
4160*6777b538SAndroid Build Coastguard Worker    # Some libraries might not have resources; others might have two jars.
4161*6777b538SAndroid Build Coastguard Worker    if (update_android_aar_prebuilts) {
4162*6777b538SAndroid Build Coastguard Worker      print("Writing " + rebase_path(_info_path, "//"))
4163*6777b538SAndroid Build Coastguard Worker      exec_script("//build/android/gyp/aar.py",
4164*6777b538SAndroid Build Coastguard Worker                  [
4165*6777b538SAndroid Build Coastguard Worker                        "list",
4166*6777b538SAndroid Build Coastguard Worker                        "--output",
4167*6777b538SAndroid Build Coastguard Worker                        rebase_path(_info_path, root_build_dir),
4168*6777b538SAndroid Build Coastguard Worker                      ] + _aar_common_args)
4169*6777b538SAndroid Build Coastguard Worker    }
4170*6777b538SAndroid Build Coastguard Worker
4171*6777b538SAndroid Build Coastguard Worker    # If "gn gen" is failing on the following line, you need to generate an
4172*6777b538SAndroid Build Coastguard Worker    # .info file for your new target by running:
4173*6777b538SAndroid Build Coastguard Worker    #   gn gen --args='target_os="android" update_android_aar_prebuilts=true' out/tmp
4174*6777b538SAndroid Build Coastguard Worker    #   rm -r out/tmp
4175*6777b538SAndroid Build Coastguard Worker    _scanned_files = read_file(_info_path, "scope")
4176*6777b538SAndroid Build Coastguard Worker
4177*6777b538SAndroid Build Coastguard Worker    _use_scanned_assets = !_ignore_assets && _scanned_files.assets != []
4178*6777b538SAndroid Build Coastguard Worker    _has_resources = _scanned_files.resources != []
4179*6777b538SAndroid Build Coastguard Worker    _common_deps = [ ":$_unpack_target_name" ]
4180*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
4181*6777b538SAndroid Build Coastguard Worker      _common_deps += invoker.deps
4182*6777b538SAndroid Build Coastguard Worker    }
4183*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.public_deps)) {
4184*6777b538SAndroid Build Coastguard Worker      _common_deps += invoker.public_deps
4185*6777b538SAndroid Build Coastguard Worker    }
4186*6777b538SAndroid Build Coastguard Worker
4187*6777b538SAndroid Build Coastguard Worker    assert(_ignore_aidl || _scanned_files.aidl == [],
4188*6777b538SAndroid Build Coastguard Worker           "android_aar_prebuilt() aidl not yet supported." +
4189*6777b538SAndroid Build Coastguard Worker               " Implement or use ignore_aidl = true." +
4190*6777b538SAndroid Build Coastguard Worker               " http://crbug.com/644439")
4191*6777b538SAndroid Build Coastguard Worker    assert(
4192*6777b538SAndroid Build Coastguard Worker        !_scanned_files.has_native_libraries ||
4193*6777b538SAndroid Build Coastguard Worker            (_ignore_native_libraries || _extract_native_libraries),
4194*6777b538SAndroid Build Coastguard Worker        "android_aar_prebuilt() contains .so files." +
4195*6777b538SAndroid Build Coastguard Worker            " Please set ignore_native_libraries or extract_native_libraries.")
4196*6777b538SAndroid Build Coastguard Worker    assert(
4197*6777b538SAndroid Build Coastguard Worker        !(_ignore_native_libraries && _extract_native_libraries),
4198*6777b538SAndroid Build Coastguard Worker        "ignore_native_libraries and extract_native_libraries cannot both be set.")
4199*6777b538SAndroid Build Coastguard Worker    assert(!_scanned_files.has_native_libraries ||
4200*6777b538SAndroid Build Coastguard Worker           _scanned_files.native_libraries != [])
4201*6777b538SAndroid Build Coastguard Worker    assert(_scanned_files.has_classes_jar || _scanned_files.subjars == [])
4202*6777b538SAndroid Build Coastguard Worker
4203*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(_unpack_target_name) {
4204*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/aar.py"  # Unzips the AAR
4205*6777b538SAndroid Build Coastguard Worker      args = [
4206*6777b538SAndroid Build Coastguard Worker               "extract",
4207*6777b538SAndroid Build Coastguard Worker               "--output-dir",
4208*6777b538SAndroid Build Coastguard Worker               rebase_path(_output_path, root_build_dir),
4209*6777b538SAndroid Build Coastguard Worker               "--assert-info-file",
4210*6777b538SAndroid Build Coastguard Worker               rebase_path(_info_path, root_build_dir),
4211*6777b538SAndroid Build Coastguard Worker             ] + _aar_common_args
4212*6777b538SAndroid Build Coastguard Worker      inputs = [ invoker.aar_path ]
4213*6777b538SAndroid Build Coastguard Worker      outputs = [ "${_output_path}/AndroidManifest.xml" ]
4214*6777b538SAndroid Build Coastguard Worker      outputs +=
4215*6777b538SAndroid Build Coastguard Worker          get_path_info(rebase_path(_scanned_files.resources, "", _output_path),
4216*6777b538SAndroid Build Coastguard Worker                        "abspath")
4217*6777b538SAndroid Build Coastguard Worker      if (_scanned_files.has_r_text_file) {
4218*6777b538SAndroid Build Coastguard Worker        # Certain packages, in particular Play Services have no R.txt even
4219*6777b538SAndroid Build Coastguard Worker        # though its presence is mandated by AAR spec. Such packages cause
4220*6777b538SAndroid Build Coastguard Worker        # spurious rebuilds if this output is specified unconditionally.
4221*6777b538SAndroid Build Coastguard Worker        outputs += [ "${_output_path}/R.txt" ]
4222*6777b538SAndroid Build Coastguard Worker      }
4223*6777b538SAndroid Build Coastguard Worker
4224*6777b538SAndroid Build Coastguard Worker      if (_scanned_files.has_classes_jar) {
4225*6777b538SAndroid Build Coastguard Worker        outputs += [ "${_output_path}/classes.jar" ]
4226*6777b538SAndroid Build Coastguard Worker      }
4227*6777b538SAndroid Build Coastguard Worker      outputs +=
4228*6777b538SAndroid Build Coastguard Worker          get_path_info(rebase_path(_scanned_files.subjars, "", _output_path),
4229*6777b538SAndroid Build Coastguard Worker                        "abspath")
4230*6777b538SAndroid Build Coastguard Worker      if (!_ignore_proguard_configs) {
4231*6777b538SAndroid Build Coastguard Worker        if (_scanned_files.has_proguard_flags) {
4232*6777b538SAndroid Build Coastguard Worker          outputs += [ "${_output_path}/proguard.txt" ]
4233*6777b538SAndroid Build Coastguard Worker        }
4234*6777b538SAndroid Build Coastguard Worker      }
4235*6777b538SAndroid Build Coastguard Worker
4236*6777b538SAndroid Build Coastguard Worker      if (_extract_native_libraries && _scanned_files.has_native_libraries) {
4237*6777b538SAndroid Build Coastguard Worker        outputs += get_path_info(
4238*6777b538SAndroid Build Coastguard Worker                rebase_path(_scanned_files.native_libraries, "", _output_path),
4239*6777b538SAndroid Build Coastguard Worker                "abspath")
4240*6777b538SAndroid Build Coastguard Worker      }
4241*6777b538SAndroid Build Coastguard Worker      if (_use_scanned_assets) {
4242*6777b538SAndroid Build Coastguard Worker        outputs +=
4243*6777b538SAndroid Build Coastguard Worker            get_path_info(rebase_path(_scanned_files.assets, "", _output_path),
4244*6777b538SAndroid Build Coastguard Worker                          "abspath")
4245*6777b538SAndroid Build Coastguard Worker      }
4246*6777b538SAndroid Build Coastguard Worker    }
4247*6777b538SAndroid Build Coastguard Worker
4248*6777b538SAndroid Build Coastguard Worker    _should_process_manifest =
4249*6777b538SAndroid Build Coastguard Worker        !_ignore_manifest && !_scanned_files.is_manifest_empty
4250*6777b538SAndroid Build Coastguard Worker
4251*6777b538SAndroid Build Coastguard Worker    # Create the android_resources target for resources.
4252*6777b538SAndroid Build Coastguard Worker    if (_has_resources || _should_process_manifest) {
4253*6777b538SAndroid Build Coastguard Worker      _res_target_name = "${target_name}__resources"
4254*6777b538SAndroid Build Coastguard Worker      android_resources(_res_target_name) {
4255*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker,
4256*6777b538SAndroid Build Coastguard Worker                               [
4257*6777b538SAndroid Build Coastguard Worker                                 "custom_package",
4258*6777b538SAndroid Build Coastguard Worker                                 "resource_overlay",
4259*6777b538SAndroid Build Coastguard Worker                                 "testonly",
4260*6777b538SAndroid Build Coastguard Worker                                 "strip_drawables",
4261*6777b538SAndroid Build Coastguard Worker                               ])
4262*6777b538SAndroid Build Coastguard Worker        deps = _common_deps
4263*6777b538SAndroid Build Coastguard Worker        if (_should_process_manifest) {
4264*6777b538SAndroid Build Coastguard Worker          android_manifest_dep = ":$_unpack_target_name"
4265*6777b538SAndroid Build Coastguard Worker          android_manifest = "${_output_path}/AndroidManifest.xml"
4266*6777b538SAndroid Build Coastguard Worker        } else if (defined(_scanned_files.manifest_package) &&
4267*6777b538SAndroid Build Coastguard Worker                   !defined(custom_package)) {
4268*6777b538SAndroid Build Coastguard Worker          custom_package = _scanned_files.manifest_package
4269*6777b538SAndroid Build Coastguard Worker        }
4270*6777b538SAndroid Build Coastguard Worker
4271*6777b538SAndroid Build Coastguard Worker        sources = rebase_path(_scanned_files.resources, "", _output_path)
4272*6777b538SAndroid Build Coastguard Worker        if (_scanned_files.has_r_text_file) {
4273*6777b538SAndroid Build Coastguard Worker          r_text_file = "${_output_path}/R.txt"
4274*6777b538SAndroid Build Coastguard Worker        }
4275*6777b538SAndroid Build Coastguard Worker      }
4276*6777b538SAndroid Build Coastguard Worker    } else if (defined(invoker.strip_drawables)) {
4277*6777b538SAndroid Build Coastguard Worker      not_needed(invoker, [ "strip_drawables" ])
4278*6777b538SAndroid Build Coastguard Worker    }
4279*6777b538SAndroid Build Coastguard Worker
4280*6777b538SAndroid Build Coastguard Worker    if (_ignore_manifest) {
4281*6777b538SAndroid Build Coastguard Worker      # Having this available can be useful for DFMs that depend on AARs. It
4282*6777b538SAndroid Build Coastguard Worker      # provides a way to have manifest entries go into the base split while
4283*6777b538SAndroid Build Coastguard Worker      # the code goes into a DFM.
4284*6777b538SAndroid Build Coastguard Worker      java_group("${target_name}__ignored_manifest") {
4285*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
4286*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_unpack_target_name" ]
4287*6777b538SAndroid Build Coastguard Worker        mergeable_android_manifests = [ "${_output_path}/AndroidManifest.xml" ]
4288*6777b538SAndroid Build Coastguard Worker      }
4289*6777b538SAndroid Build Coastguard Worker    }
4290*6777b538SAndroid Build Coastguard Worker
4291*6777b538SAndroid Build Coastguard Worker    # Create the android_assets target for assets
4292*6777b538SAndroid Build Coastguard Worker    if (_use_scanned_assets) {
4293*6777b538SAndroid Build Coastguard Worker      _assets_target_name = "${target_name}__assets"
4294*6777b538SAndroid Build Coastguard Worker      android_assets(_assets_target_name) {
4295*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
4296*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_unpack_target_name" ]
4297*6777b538SAndroid Build Coastguard Worker        renaming_sources = []
4298*6777b538SAndroid Build Coastguard Worker        renaming_destinations = []
4299*6777b538SAndroid Build Coastguard Worker        foreach(_asset_file, _scanned_files.assets) {
4300*6777b538SAndroid Build Coastguard Worker          _original_path =
4301*6777b538SAndroid Build Coastguard Worker              get_path_info(rebase_path(_asset_file, "", _output_path),
4302*6777b538SAndroid Build Coastguard Worker                            "abspath")
4303*6777b538SAndroid Build Coastguard Worker          _updated_path = string_replace(_asset_file, "assets/", "", 1)
4304*6777b538SAndroid Build Coastguard Worker          renaming_sources += [ _original_path ]
4305*6777b538SAndroid Build Coastguard Worker          renaming_destinations += [ _updated_path ]
4306*6777b538SAndroid Build Coastguard Worker        }
4307*6777b538SAndroid Build Coastguard Worker      }
4308*6777b538SAndroid Build Coastguard Worker    }
4309*6777b538SAndroid Build Coastguard Worker
4310*6777b538SAndroid Build Coastguard Worker    _target_label = get_label_info(":$target_name", "label_no_toolchain")
4311*6777b538SAndroid Build Coastguard Worker
4312*6777b538SAndroid Build Coastguard Worker    # Create android_java_prebuilt target for classes.jar.
4313*6777b538SAndroid Build Coastguard Worker    if (_scanned_files.has_classes_jar) {
4314*6777b538SAndroid Build Coastguard Worker      _java_library_vars = [
4315*6777b538SAndroid Build Coastguard Worker        "alternative_android_sdk_dep",
4316*6777b538SAndroid Build Coastguard Worker        "bytecode_rewriter_target",
4317*6777b538SAndroid Build Coastguard Worker        "enable_bytecode_checks",
4318*6777b538SAndroid Build Coastguard Worker        "jar_excluded_patterns",
4319*6777b538SAndroid Build Coastguard Worker        "jar_included_patterns",
4320*6777b538SAndroid Build Coastguard Worker        "missing_classes_allowlist",
4321*6777b538SAndroid Build Coastguard Worker        "requires_android",
4322*6777b538SAndroid Build Coastguard Worker        "testonly",
4323*6777b538SAndroid Build Coastguard Worker      ]
4324*6777b538SAndroid Build Coastguard Worker
4325*6777b538SAndroid Build Coastguard Worker      # Create android_java_prebuilt target for extra jars within jars/.
4326*6777b538SAndroid Build Coastguard Worker      _subjar_targets = []
4327*6777b538SAndroid Build Coastguard Worker      foreach(_tuple, _scanned_files.subjar_tuples) {
4328*6777b538SAndroid Build Coastguard Worker        _current_target = "${target_name}__subjar_${_tuple[0]}"
4329*6777b538SAndroid Build Coastguard Worker        _subjar_targets += [ ":$_current_target" ]
4330*6777b538SAndroid Build Coastguard Worker        java_prebuilt(_current_target) {
4331*6777b538SAndroid Build Coastguard Worker          forward_variables_from(invoker, _java_library_vars)
4332*6777b538SAndroid Build Coastguard Worker          deps = _common_deps
4333*6777b538SAndroid Build Coastguard Worker          if (!defined(requires_android)) {
4334*6777b538SAndroid Build Coastguard Worker            requires_android = true
4335*6777b538SAndroid Build Coastguard Worker          }
4336*6777b538SAndroid Build Coastguard Worker          supports_android = true
4337*6777b538SAndroid Build Coastguard Worker          jar_path = "$_output_path/${_tuple[1]}"
4338*6777b538SAndroid Build Coastguard Worker          _base_output_name = get_path_info(jar_path, "name")
4339*6777b538SAndroid Build Coastguard Worker          output_name = "${invoker.target_name}-$_base_output_name"
4340*6777b538SAndroid Build Coastguard Worker          public_target_label = _target_label
4341*6777b538SAndroid Build Coastguard Worker        }
4342*6777b538SAndroid Build Coastguard Worker      }
4343*6777b538SAndroid Build Coastguard Worker
4344*6777b538SAndroid Build Coastguard Worker      _jar_target_name = "${target_name}__classes"
4345*6777b538SAndroid Build Coastguard Worker      java_prebuilt(_jar_target_name) {
4346*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker, _java_library_vars)
4347*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker,
4348*6777b538SAndroid Build Coastguard Worker                               [
4349*6777b538SAndroid Build Coastguard Worker                                 "input_jars_paths",
4350*6777b538SAndroid Build Coastguard Worker                                 "mergeable_android_manifests",
4351*6777b538SAndroid Build Coastguard Worker                                 "proguard_configs",
4352*6777b538SAndroid Build Coastguard Worker                               ])
4353*6777b538SAndroid Build Coastguard Worker        deps = _common_deps + _subjar_targets
4354*6777b538SAndroid Build Coastguard Worker        if (defined(_res_target_name)) {
4355*6777b538SAndroid Build Coastguard Worker          deps += [ ":$_res_target_name" ]
4356*6777b538SAndroid Build Coastguard Worker        }
4357*6777b538SAndroid Build Coastguard Worker        if (!defined(requires_android)) {
4358*6777b538SAndroid Build Coastguard Worker          requires_android = true
4359*6777b538SAndroid Build Coastguard Worker        }
4360*6777b538SAndroid Build Coastguard Worker        include_java_resources = !defined(invoker.include_java_resources) ||
4361*6777b538SAndroid Build Coastguard Worker                                 invoker.include_java_resources
4362*6777b538SAndroid Build Coastguard Worker        supports_android = true
4363*6777b538SAndroid Build Coastguard Worker        jar_path = "$_output_path/classes.jar"
4364*6777b538SAndroid Build Coastguard Worker        aar_path = invoker.aar_path
4365*6777b538SAndroid Build Coastguard Worker        output_name = invoker.target_name
4366*6777b538SAndroid Build Coastguard Worker
4367*6777b538SAndroid Build Coastguard Worker        if (!_ignore_proguard_configs) {
4368*6777b538SAndroid Build Coastguard Worker          if (!defined(proguard_configs)) {
4369*6777b538SAndroid Build Coastguard Worker            proguard_configs = []
4370*6777b538SAndroid Build Coastguard Worker          }
4371*6777b538SAndroid Build Coastguard Worker          if (_scanned_files.has_proguard_flags) {
4372*6777b538SAndroid Build Coastguard Worker            proguard_configs += [ "$_output_path/proguard.txt" ]
4373*6777b538SAndroid Build Coastguard Worker          }
4374*6777b538SAndroid Build Coastguard Worker        }
4375*6777b538SAndroid Build Coastguard Worker        public_target_label = _target_label
4376*6777b538SAndroid Build Coastguard Worker      }
4377*6777b538SAndroid Build Coastguard Worker    }
4378*6777b538SAndroid Build Coastguard Worker
4379*6777b538SAndroid Build Coastguard Worker    java_group(target_name) {
4380*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
4381*6777b538SAndroid Build Coastguard Worker      public_deps = [ ":$_unpack_target_name" ]
4382*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.public_deps)) {
4383*6777b538SAndroid Build Coastguard Worker        public_deps += invoker.public_deps
4384*6777b538SAndroid Build Coastguard Worker      }
4385*6777b538SAndroid Build Coastguard Worker      deps = []
4386*6777b538SAndroid Build Coastguard Worker      if (defined(_jar_target_name)) {
4387*6777b538SAndroid Build Coastguard Worker        deps += [ ":$_jar_target_name" ]
4388*6777b538SAndroid Build Coastguard Worker
4389*6777b538SAndroid Build Coastguard Worker        # Although subjars are meant to be private, we add them as deps here
4390*6777b538SAndroid Build Coastguard Worker        # because in practice they seem to contain classes required to be in the
4391*6777b538SAndroid Build Coastguard Worker        # classpath.
4392*6777b538SAndroid Build Coastguard Worker        deps += _subjar_targets
4393*6777b538SAndroid Build Coastguard Worker      }
4394*6777b538SAndroid Build Coastguard Worker      if (defined(_res_target_name)) {
4395*6777b538SAndroid Build Coastguard Worker        deps += [ ":$_res_target_name" ]
4396*6777b538SAndroid Build Coastguard Worker      }
4397*6777b538SAndroid Build Coastguard Worker      if (defined(_assets_target_name)) {
4398*6777b538SAndroid Build Coastguard Worker        deps += [ ":$_assets_target_name" ]
4399*6777b538SAndroid Build Coastguard Worker      }
4400*6777b538SAndroid Build Coastguard Worker    }
4401*6777b538SAndroid Build Coastguard Worker  }
4402*6777b538SAndroid Build Coastguard Worker
4403*6777b538SAndroid Build Coastguard Worker  # Create an Android application bundle from one base android_apk target,
4404*6777b538SAndroid Build Coastguard Worker  # and zero or more associated android_apk.
4405*6777b538SAndroid Build Coastguard Worker  #
4406*6777b538SAndroid Build Coastguard Worker  # Variables:
4407*6777b538SAndroid Build Coastguard Worker  #    base_module_target: Name of the android_app_bundle_module target
4408*6777b538SAndroid Build Coastguard Worker  #      corresponding to the base module for this application bundle. The
4409*6777b538SAndroid Build Coastguard Worker  #      bundle file will include the same content in its base module, though in
4410*6777b538SAndroid Build Coastguard Worker  #      a slightly different format.
4411*6777b538SAndroid Build Coastguard Worker  #
4412*6777b538SAndroid Build Coastguard Worker  #    bundle_base_path: Optional. If set, the bundle will be output to this
4413*6777b538SAndroid Build Coastguard Worker  #      directory. Defaults to "$root_build_dir/apks".
4414*6777b538SAndroid Build Coastguard Worker  #
4415*6777b538SAndroid Build Coastguard Worker  #    bundle_name: Optional. If set, the bundle will be output to the
4416*6777b538SAndroid Build Coastguard Worker  #      filename "${bundle_name}.aab".
4417*6777b538SAndroid Build Coastguard Worker  #
4418*6777b538SAndroid Build Coastguard Worker  #    extra_modules: Optional list of scopes, one per extra module used by
4419*6777b538SAndroid Build Coastguard Worker  #      this bundle. Each scope must have a 'name' field that specifies the
4420*6777b538SAndroid Build Coastguard Worker  #      module name (which cannot be 'base', since this is reserved for the
4421*6777b538SAndroid Build Coastguard Worker  #      base module), and an 'apk_target' field that specified the
4422*6777b538SAndroid Build Coastguard Worker  #      corresponding android_apk target name the module is modeled on.
4423*6777b538SAndroid Build Coastguard Worker  #
4424*6777b538SAndroid Build Coastguard Worker  #    enable_language_splits: Optional. If true, enable APK splits based
4425*6777b538SAndroid Build Coastguard Worker  #      on languages.
4426*6777b538SAndroid Build Coastguard Worker  #
4427*6777b538SAndroid Build Coastguard Worker  #    keystore_path: optional keystore path, used only when generating APKs.
4428*6777b538SAndroid Build Coastguard Worker  #    keystore_name: optional keystore name, used only when generating APKs.
4429*6777b538SAndroid Build Coastguard Worker  #    keystore_password: optional keystore password, used only when
4430*6777b538SAndroid Build Coastguard Worker  #      generating APKs.
4431*6777b538SAndroid Build Coastguard Worker  #    rotation_config: optional .textproto to enable key rotation.
4432*6777b538SAndroid Build Coastguard Worker  #
4433*6777b538SAndroid Build Coastguard Worker  #    command_line_flags_file: Optional. If provided, named of the on-device
4434*6777b538SAndroid Build Coastguard Worker  #      file that will be used to store command-line arguments. The default
4435*6777b538SAndroid Build Coastguard Worker  #      is 'command_line_flags_file', but this is typically redefined to
4436*6777b538SAndroid Build Coastguard Worker  #      something more specific for certain bundles (e.g. the Chromium based
4437*6777b538SAndroid Build Coastguard Worker  #      APKs use 'chrome-command-line', the WebView one uses
4438*6777b538SAndroid Build Coastguard Worker  #      'webview-command-line').
4439*6777b538SAndroid Build Coastguard Worker  #
4440*6777b538SAndroid Build Coastguard Worker  #    proguard_enabled: Optional. True if proguarding is enabled for this
4441*6777b538SAndroid Build Coastguard Worker  #      bundle. Default is to enable this only for release builds. Note that
4442*6777b538SAndroid Build Coastguard Worker  #      this will always perform synchronized proguarding.
4443*6777b538SAndroid Build Coastguard Worker  #
4444*6777b538SAndroid Build Coastguard Worker  #    proguard_enable_obfuscation: Whether to enable obfuscation (default=true)
4445*6777b538SAndroid Build Coastguard Worker  #
4446*6777b538SAndroid Build Coastguard Worker  #    proguard_android_sdk_dep: Optional. android_system_java_prebuilt() target
4447*6777b538SAndroid Build Coastguard Worker  #      used as a library jar for synchronized proguarding.
4448*6777b538SAndroid Build Coastguard Worker  #
4449*6777b538SAndroid Build Coastguard Worker  #    system_image_locale_allowlist: List of locales that should be included
4450*6777b538SAndroid Build Coastguard Worker  #      on system APKs generated from this bundle.
4451*6777b538SAndroid Build Coastguard Worker  #
4452*6777b538SAndroid Build Coastguard Worker  #    static_library_provider: Specifies a single target that this target will
4453*6777b538SAndroid Build Coastguard Worker  #      use as a static library APK.
4454*6777b538SAndroid Build Coastguard Worker  #
4455*6777b538SAndroid Build Coastguard Worker  #    expected_libs_and_assets: Verify the list of included native libraries
4456*6777b538SAndroid Build Coastguard Worker  #      and assets is consistent with the given expectation file.
4457*6777b538SAndroid Build Coastguard Worker  #    expected_libs_and_assets_base: Treat expected_libs_and_assets as a diff
4458*6777b538SAndroid Build Coastguard Worker  #      with this file as the base.
4459*6777b538SAndroid Build Coastguard Worker  #    expected_proguard_config: Checks that the merged set of proguard flags
4460*6777b538SAndroid Build Coastguard Worker  #      matches the given config.
4461*6777b538SAndroid Build Coastguard Worker  #    expected_proguard_config_base: Treat expected_proguard_config as a diff
4462*6777b538SAndroid Build Coastguard Worker  #      with this file as the base.
4463*6777b538SAndroid Build Coastguard Worker  #
4464*6777b538SAndroid Build Coastguard Worker  #    version_code: Optional. Version code of the target.
4465*6777b538SAndroid Build Coastguard Worker  #
4466*6777b538SAndroid Build Coastguard Worker  #    is_multi_abi: If true will add a library placeholder for the missing ABI
4467*6777b538SAndroid Build Coastguard Worker  #      if either the primary or the secondary ABI has no native libraries set.
4468*6777b538SAndroid Build Coastguard Worker  #
4469*6777b538SAndroid Build Coastguard Worker  #    default_modules_for_testing: (optional): A list of DFM that the wrapper
4470*6777b538SAndroid Build Coastguard Worker  #      script should install. This is for local testing only, and does not
4471*6777b538SAndroid Build Coastguard Worker  #      affect the actual DFM in production.
4472*6777b538SAndroid Build Coastguard Worker  #
4473*6777b538SAndroid Build Coastguard Worker  #    add_view_trace_events: (optional): If true will add an additional step to
4474*6777b538SAndroid Build Coastguard Worker  #      add trace events to all Android views contained in the bundle. It also
4475*6777b538SAndroid Build Coastguard Worker  #      requires build argument enable_trace_event_bytecode_rewriting = true.
4476*6777b538SAndroid Build Coastguard Worker  #
4477*6777b538SAndroid Build Coastguard Worker  # Example:
4478*6777b538SAndroid Build Coastguard Worker  #   android_app_bundle("chrome_public_bundle") {
4479*6777b538SAndroid Build Coastguard Worker  #      base_module_target = "//chrome/android:chrome_public_apk"
4480*6777b538SAndroid Build Coastguard Worker  #      extra_modules = [
4481*6777b538SAndroid Build Coastguard Worker  #        { # NOTE: Scopes require one field per line, and no comma separators.
4482*6777b538SAndroid Build Coastguard Worker  #          name = "my_module"
4483*6777b538SAndroid Build Coastguard Worker  #          module_target = ":my_module"
4484*6777b538SAndroid Build Coastguard Worker  #        },
4485*6777b538SAndroid Build Coastguard Worker  #      ]
4486*6777b538SAndroid Build Coastguard Worker  #   }
4487*6777b538SAndroid Build Coastguard Worker  #
4488*6777b538SAndroid Build Coastguard Worker  template("android_app_bundle") {
4489*6777b538SAndroid Build Coastguard Worker    _target_name = target_name
4490*6777b538SAndroid Build Coastguard Worker    _uses_static_library = defined(invoker.static_library_provider)
4491*6777b538SAndroid Build Coastguard Worker    _proguard_enabled =
4492*6777b538SAndroid Build Coastguard Worker        defined(invoker.proguard_enabled) && invoker.proguard_enabled
4493*6777b538SAndroid Build Coastguard Worker
4494*6777b538SAndroid Build Coastguard Worker    _min_sdk_version = default_min_sdk_version
4495*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.min_sdk_version)) {
4496*6777b538SAndroid Build Coastguard Worker      _min_sdk_version = invoker.min_sdk_version
4497*6777b538SAndroid Build Coastguard Worker    }
4498*6777b538SAndroid Build Coastguard Worker
4499*6777b538SAndroid Build Coastguard Worker    _bundle_base_path = "$root_build_dir/apks"
4500*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.bundle_base_path)) {
4501*6777b538SAndroid Build Coastguard Worker      _bundle_base_path = invoker.bundle_base_path
4502*6777b538SAndroid Build Coastguard Worker    }
4503*6777b538SAndroid Build Coastguard Worker
4504*6777b538SAndroid Build Coastguard Worker    _bundle_name = _target_name
4505*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.bundle_name)) {
4506*6777b538SAndroid Build Coastguard Worker      _bundle_name = invoker.bundle_name
4507*6777b538SAndroid Build Coastguard Worker    }
4508*6777b538SAndroid Build Coastguard Worker    _bundle_path = "$_bundle_base_path/${_bundle_name}.aab"
4509*6777b538SAndroid Build Coastguard Worker    _rebased_bundle_path = rebase_path(_bundle_path, root_build_dir)
4510*6777b538SAndroid Build Coastguard Worker
4511*6777b538SAndroid Build Coastguard Worker    _base_target_name = get_label_info(invoker.base_module_target, "name")
4512*6777b538SAndroid Build Coastguard Worker    _base_target_gen_dir =
4513*6777b538SAndroid Build Coastguard Worker        get_label_info(invoker.base_module_target, "target_gen_dir")
4514*6777b538SAndroid Build Coastguard Worker    _base_module_build_config =
4515*6777b538SAndroid Build Coastguard Worker        "$_base_target_gen_dir/${_base_target_name}.build_config.json"
4516*6777b538SAndroid Build Coastguard Worker    _base_module_build_config_target =
4517*6777b538SAndroid Build Coastguard Worker        "${invoker.base_module_target}$build_config_target_suffix"
4518*6777b538SAndroid Build Coastguard Worker    _rebased_base_module_build_config =
4519*6777b538SAndroid Build Coastguard Worker        rebase_path(_base_module_build_config, root_build_dir)
4520*6777b538SAndroid Build Coastguard Worker
4521*6777b538SAndroid Build Coastguard Worker    _modules = [
4522*6777b538SAndroid Build Coastguard Worker      {
4523*6777b538SAndroid Build Coastguard Worker        name = "base"
4524*6777b538SAndroid Build Coastguard Worker        module_target = invoker.base_module_target
4525*6777b538SAndroid Build Coastguard Worker        build_config = _base_module_build_config
4526*6777b538SAndroid Build Coastguard Worker        build_config_target = _base_module_build_config_target
4527*6777b538SAndroid Build Coastguard Worker        if (_uses_static_library) {
4528*6777b538SAndroid Build Coastguard Worker          parent = "lib"
4529*6777b538SAndroid Build Coastguard Worker        }
4530*6777b538SAndroid Build Coastguard Worker      },
4531*6777b538SAndroid Build Coastguard Worker    ]
4532*6777b538SAndroid Build Coastguard Worker
4533*6777b538SAndroid Build Coastguard Worker    if (_proguard_enabled) {
4534*6777b538SAndroid Build Coastguard Worker      _dex_target = "${_target_name}__dex"
4535*6777b538SAndroid Build Coastguard Worker      _proguard_mapping_path = "${_bundle_path}.mapping"
4536*6777b538SAndroid Build Coastguard Worker    }
4537*6777b538SAndroid Build Coastguard Worker
4538*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.extra_modules)) {
4539*6777b538SAndroid Build Coastguard Worker      _module_count = 0
4540*6777b538SAndroid Build Coastguard Worker      not_needed([ "_module_count" ])
4541*6777b538SAndroid Build Coastguard Worker
4542*6777b538SAndroid Build Coastguard Worker      foreach(_module, invoker.extra_modules) {
4543*6777b538SAndroid Build Coastguard Worker        _module_count += 1
4544*6777b538SAndroid Build Coastguard Worker        assert(defined(_module.name),
4545*6777b538SAndroid Build Coastguard Worker               "Missing 'name' field for extra module #${_module_count}.")
4546*6777b538SAndroid Build Coastguard Worker        assert(_module.name != "base",
4547*6777b538SAndroid Build Coastguard Worker               "Module name 'base' is reserved for the main bundle module")
4548*6777b538SAndroid Build Coastguard Worker        assert(
4549*6777b538SAndroid Build Coastguard Worker            defined(_module.module_target),
4550*6777b538SAndroid Build Coastguard Worker            "Missing 'module_target' field for extra module ${_module.name}.")
4551*6777b538SAndroid Build Coastguard Worker        _module_target = _module.module_target
4552*6777b538SAndroid Build Coastguard Worker        _module_target_name = get_label_info(_module_target, "name")
4553*6777b538SAndroid Build Coastguard Worker        _module_target_gen_dir =
4554*6777b538SAndroid Build Coastguard Worker            get_label_info(_module_target, "target_gen_dir")
4555*6777b538SAndroid Build Coastguard Worker        _module.build_config =
4556*6777b538SAndroid Build Coastguard Worker            "$_module_target_gen_dir/${_module_target_name}.build_config.json"
4557*6777b538SAndroid Build Coastguard Worker        _module.build_config_target =
4558*6777b538SAndroid Build Coastguard Worker            "$_module_target$build_config_target_suffix"
4559*6777b538SAndroid Build Coastguard Worker        _module.parent = "base"
4560*6777b538SAndroid Build Coastguard Worker        _modules += [ _module ]
4561*6777b538SAndroid Build Coastguard Worker      }
4562*6777b538SAndroid Build Coastguard Worker    }
4563*6777b538SAndroid Build Coastguard Worker
4564*6777b538SAndroid Build Coastguard Worker    # Make build config, which is required for synchronized proguarding.
4565*6777b538SAndroid Build Coastguard Worker    _module_java_targets = []
4566*6777b538SAndroid Build Coastguard Worker    _module_build_configs = []
4567*6777b538SAndroid Build Coastguard Worker    _module_targets = []
4568*6777b538SAndroid Build Coastguard Worker    foreach(_module, _modules) {
4569*6777b538SAndroid Build Coastguard Worker      _module_targets += [ _module.module_target ]
4570*6777b538SAndroid Build Coastguard Worker      _module_java_targets += [ "${_module.module_target}__java" ]
4571*6777b538SAndroid Build Coastguard Worker      _module_build_configs += [ _module.build_config ]
4572*6777b538SAndroid Build Coastguard Worker    }
4573*6777b538SAndroid Build Coastguard Worker
4574*6777b538SAndroid Build Coastguard Worker    # Used to expose the module Java targets of the bundle.
4575*6777b538SAndroid Build Coastguard Worker    group("${_target_name}__java") {
4576*6777b538SAndroid Build Coastguard Worker      deps = _module_java_targets
4577*6777b538SAndroid Build Coastguard Worker    }
4578*6777b538SAndroid Build Coastguard Worker    group("${_target_name}__compile_resources") {
4579*6777b538SAndroid Build Coastguard Worker      deps = [ "${invoker.base_module_target}__compile_resources" ]
4580*6777b538SAndroid Build Coastguard Worker    }
4581*6777b538SAndroid Build Coastguard Worker
4582*6777b538SAndroid Build Coastguard Worker    _build_config = "$target_gen_dir/${_target_name}.build_config.json"
4583*6777b538SAndroid Build Coastguard Worker    _rebased_build_config = rebase_path(_build_config, root_build_dir)
4584*6777b538SAndroid Build Coastguard Worker    _build_config_target = "$_target_name$build_config_target_suffix"
4585*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.proguard_android_sdk_dep)) {
4586*6777b538SAndroid Build Coastguard Worker      _android_sdk_dep = invoker.proguard_android_sdk_dep
4587*6777b538SAndroid Build Coastguard Worker    } else {
4588*6777b538SAndroid Build Coastguard Worker      _android_sdk_dep = default_android_sdk_dep
4589*6777b538SAndroid Build Coastguard Worker    }
4590*6777b538SAndroid Build Coastguard Worker
4591*6777b538SAndroid Build Coastguard Worker    if (_proguard_enabled) {
4592*6777b538SAndroid Build Coastguard Worker      _proguard_mapping_path = "${_bundle_path}.mapping"
4593*6777b538SAndroid Build Coastguard Worker      _add_view_trace_events =
4594*6777b538SAndroid Build Coastguard Worker          defined(invoker.add_view_trace_events) &&
4595*6777b538SAndroid Build Coastguard Worker          invoker.add_view_trace_events && enable_trace_event_bytecode_rewriting
4596*6777b538SAndroid Build Coastguard Worker    } else {
4597*6777b538SAndroid Build Coastguard Worker      not_needed(invoker, [ "add_view_trace_events" ])
4598*6777b538SAndroid Build Coastguard Worker    }
4599*6777b538SAndroid Build Coastguard Worker
4600*6777b538SAndroid Build Coastguard Worker    write_build_config(_build_config_target) {
4601*6777b538SAndroid Build Coastguard Worker      type = "android_app_bundle"
4602*6777b538SAndroid Build Coastguard Worker      possible_config_deps = _module_targets + [ _android_sdk_dep ]
4603*6777b538SAndroid Build Coastguard Worker      build_config = _build_config
4604*6777b538SAndroid Build Coastguard Worker      proguard_enabled = _proguard_enabled
4605*6777b538SAndroid Build Coastguard Worker      module_build_configs = _module_build_configs
4606*6777b538SAndroid Build Coastguard Worker      modules = _modules
4607*6777b538SAndroid Build Coastguard Worker
4608*6777b538SAndroid Build Coastguard Worker      if (_proguard_enabled) {
4609*6777b538SAndroid Build Coastguard Worker        add_view_trace_events = _add_view_trace_events
4610*6777b538SAndroid Build Coastguard Worker        proguard_mapping_path = _proguard_mapping_path
4611*6777b538SAndroid Build Coastguard Worker      }
4612*6777b538SAndroid Build Coastguard Worker    }
4613*6777b538SAndroid Build Coastguard Worker
4614*6777b538SAndroid Build Coastguard Worker    # Old name for variable, mark as not_needed while it is being renamed
4615*6777b538SAndroid Build Coastguard Worker    # downstream. Remove after all references to baseline_profile_path have been
4616*6777b538SAndroid Build Coastguard Worker    # changed.
4617*6777b538SAndroid Build Coastguard Worker    not_needed(invoker, [ "baseline_profile_path" ])
4618*6777b538SAndroid Build Coastguard Worker
4619*6777b538SAndroid Build Coastguard Worker    _enable_art_profile_optimizations =
4620*6777b538SAndroid Build Coastguard Worker        defined(invoker.art_profile_path) && _proguard_enabled
4621*6777b538SAndroid Build Coastguard Worker
4622*6777b538SAndroid Build Coastguard Worker    if (_enable_art_profile_optimizations) {
4623*6777b538SAndroid Build Coastguard Worker      _include_baseline_profile = enable_baseline_profiles
4624*6777b538SAndroid Build Coastguard Worker      _enable_startup_profile = enable_startup_profiles
4625*6777b538SAndroid Build Coastguard Worker      if (_include_baseline_profile) {
4626*6777b538SAndroid Build Coastguard Worker        _obfuscated_art_profile =
4627*6777b538SAndroid Build Coastguard Worker            "$target_out_dir/${target_name}.obfuscated.hrf"
4628*6777b538SAndroid Build Coastguard Worker      }
4629*6777b538SAndroid Build Coastguard Worker    } else {
4630*6777b538SAndroid Build Coastguard Worker      not_needed(invoker, [ "art_profile_path" ])
4631*6777b538SAndroid Build Coastguard Worker    }
4632*6777b538SAndroid Build Coastguard Worker
4633*6777b538SAndroid Build Coastguard Worker    if (_proguard_enabled) {
4634*6777b538SAndroid Build Coastguard Worker      if (_add_view_trace_events) {
4635*6777b538SAndroid Build Coastguard Worker        _trace_event_rewriter_target =
4636*6777b538SAndroid Build Coastguard Worker            "//build/android/bytecode:trace_event_adder"
4637*6777b538SAndroid Build Coastguard Worker        _rewritten_jar_target_name = "${target_name}__trace_event_rewritten"
4638*6777b538SAndroid Build Coastguard Worker        _rewriter_path = root_build_dir + "/bin/helper/trace_event_adder"
4639*6777b538SAndroid Build Coastguard Worker        _stamp = "${target_out_dir}/${target_name}.trace_event_rewrite.stamp"
4640*6777b538SAndroid Build Coastguard Worker        action_with_pydeps(_rewritten_jar_target_name) {
4641*6777b538SAndroid Build Coastguard Worker          script = "//build/android/gyp/trace_event_bytecode_rewriter.py"
4642*6777b538SAndroid Build Coastguard Worker          inputs = java_paths_for_inputs + [
4643*6777b538SAndroid Build Coastguard Worker                     _rewriter_path,
4644*6777b538SAndroid Build Coastguard Worker                     _build_config,
4645*6777b538SAndroid Build Coastguard Worker                   ]
4646*6777b538SAndroid Build Coastguard Worker          outputs = [ _stamp ]
4647*6777b538SAndroid Build Coastguard Worker          depfile = "$target_gen_dir/$_rewritten_jar_target_name.d"
4648*6777b538SAndroid Build Coastguard Worker          args = [
4649*6777b538SAndroid Build Coastguard Worker            "--stamp",
4650*6777b538SAndroid Build Coastguard Worker            rebase_path(_stamp, root_build_dir),
4651*6777b538SAndroid Build Coastguard Worker            "--depfile",
4652*6777b538SAndroid Build Coastguard Worker            rebase_path(depfile, root_build_dir),
4653*6777b538SAndroid Build Coastguard Worker            "--script",
4654*6777b538SAndroid Build Coastguard Worker            rebase_path(_rewriter_path, root_build_dir),
4655*6777b538SAndroid Build Coastguard Worker            "--classpath",
4656*6777b538SAndroid Build Coastguard Worker            "@FileArg($_rebased_build_config:android:sdk_jars)",
4657*6777b538SAndroid Build Coastguard Worker            "--input-jars",
4658*6777b538SAndroid Build Coastguard Worker            "@FileArg($_rebased_build_config:deps_info:device_classpath)",
4659*6777b538SAndroid Build Coastguard Worker            "--output-jars",
4660*6777b538SAndroid Build Coastguard Worker            "@FileArg($_rebased_build_config:deps_info:trace_event_rewritten_device_classpath)",
4661*6777b538SAndroid Build Coastguard Worker          ]
4662*6777b538SAndroid Build Coastguard Worker          deps = [
4663*6777b538SAndroid Build Coastguard Worker                   ":$_build_config_target",
4664*6777b538SAndroid Build Coastguard Worker                   _trace_event_rewriter_target,
4665*6777b538SAndroid Build Coastguard Worker                 ] + _module_java_targets
4666*6777b538SAndroid Build Coastguard Worker        }
4667*6777b538SAndroid Build Coastguard Worker      }
4668*6777b538SAndroid Build Coastguard Worker
4669*6777b538SAndroid Build Coastguard Worker      dex(_dex_target) {
4670*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker,
4671*6777b538SAndroid Build Coastguard Worker                               [
4672*6777b538SAndroid Build Coastguard Worker                                 "custom_assertion_handler",
4673*6777b538SAndroid Build Coastguard Worker                                 "expected_proguard_config",
4674*6777b538SAndroid Build Coastguard Worker                                 "expected_proguard_config_base",
4675*6777b538SAndroid Build Coastguard Worker                                 "proguard_enable_obfuscation",
4676*6777b538SAndroid Build Coastguard Worker                                 "repackage_classes",
4677*6777b538SAndroid Build Coastguard Worker                               ])
4678*6777b538SAndroid Build Coastguard Worker        if (defined(expected_proguard_config)) {
4679*6777b538SAndroid Build Coastguard Worker          top_target_name = _target_name
4680*6777b538SAndroid Build Coastguard Worker        }
4681*6777b538SAndroid Build Coastguard Worker        min_sdk_version = _min_sdk_version
4682*6777b538SAndroid Build Coastguard Worker        add_view_trace_events = _add_view_trace_events
4683*6777b538SAndroid Build Coastguard Worker        proguard_enabled = true
4684*6777b538SAndroid Build Coastguard Worker        proguard_mapping_path = _proguard_mapping_path
4685*6777b538SAndroid Build Coastguard Worker        build_config = _build_config
4686*6777b538SAndroid Build Coastguard Worker        if (_enable_art_profile_optimizations) {
4687*6777b538SAndroid Build Coastguard Worker          input_art_profile = invoker.art_profile_path
4688*6777b538SAndroid Build Coastguard Worker          if (_include_baseline_profile) {
4689*6777b538SAndroid Build Coastguard Worker            output_art_profile = _obfuscated_art_profile
4690*6777b538SAndroid Build Coastguard Worker          }
4691*6777b538SAndroid Build Coastguard Worker          enable_startup_profile = _enable_startup_profile
4692*6777b538SAndroid Build Coastguard Worker        }
4693*6777b538SAndroid Build Coastguard Worker
4694*6777b538SAndroid Build Coastguard Worker        deps = _module_java_targets + [ ":$_build_config_target" ]
4695*6777b538SAndroid Build Coastguard Worker        if (_add_view_trace_events) {
4696*6777b538SAndroid Build Coastguard Worker          deps += [ ":${_rewritten_jar_target_name}" ]
4697*6777b538SAndroid Build Coastguard Worker        }
4698*6777b538SAndroid Build Coastguard Worker        modules = _modules
4699*6777b538SAndroid Build Coastguard Worker
4700*6777b538SAndroid Build Coastguard Worker        # Must not be set via write_build_config, because that will cause it
4701*6777b538SAndroid Build Coastguard Worker        # to be picked up by test apks that use apk_under_test.
4702*6777b538SAndroid Build Coastguard Worker        _assertions_implicitly_enabled =
4703*6777b538SAndroid Build Coastguard Worker            defined(invoker.custom_assertion_handler)
4704*6777b538SAndroid Build Coastguard Worker        if (!_assertions_implicitly_enabled && !enable_java_asserts &&
4705*6777b538SAndroid Build Coastguard Worker            (!defined(testonly) || !testonly) &&
4706*6777b538SAndroid Build Coastguard Worker            # Injected JaCoCo code causes -checkdiscards to fail.
4707*6777b538SAndroid Build Coastguard Worker            !use_jacoco_coverage) {
4708*6777b538SAndroid Build Coastguard Worker          proguard_configs = [
4709*6777b538SAndroid Build Coastguard Worker            "//build/android/dcheck_is_off.flags",
4710*6777b538SAndroid Build Coastguard Worker            "//third_party/jni_zero/checkdiscard_proguard.flags",
4711*6777b538SAndroid Build Coastguard Worker          ]
4712*6777b538SAndroid Build Coastguard Worker        }
4713*6777b538SAndroid Build Coastguard Worker      }
4714*6777b538SAndroid Build Coastguard Worker    }
4715*6777b538SAndroid Build Coastguard Worker
4716*6777b538SAndroid Build Coastguard Worker    _all_create_module_targets = []
4717*6777b538SAndroid Build Coastguard Worker    _all_module_zip_paths = []
4718*6777b538SAndroid Build Coastguard Worker    _all_module_build_configs = []
4719*6777b538SAndroid Build Coastguard Worker    _all_module_unused_resources_deps = []
4720*6777b538SAndroid Build Coastguard Worker    foreach(_module, _modules) {
4721*6777b538SAndroid Build Coastguard Worker      _module_target = _module.module_target
4722*6777b538SAndroid Build Coastguard Worker      _module_build_config = _module.build_config
4723*6777b538SAndroid Build Coastguard Worker      _module_build_config_target = _module.build_config_target
4724*6777b538SAndroid Build Coastguard Worker
4725*6777b538SAndroid Build Coastguard Worker      if (!_proguard_enabled) {
4726*6777b538SAndroid Build Coastguard Worker        _module_target_name = get_label_info(_module_target, "name")
4727*6777b538SAndroid Build Coastguard Worker        _dex_target = "${_module_target_name}__final_dex"
4728*6777b538SAndroid Build Coastguard Worker        _dex_path = "$target_out_dir/$_module_target_name/$_module_target_name.mergeddex.jar"
4729*6777b538SAndroid Build Coastguard Worker        dex(_dex_target) {
4730*6777b538SAndroid Build Coastguard Worker          forward_variables_from(invoker, [ "custom_assertion_handler" ])
4731*6777b538SAndroid Build Coastguard Worker          min_sdk_version = _min_sdk_version
4732*6777b538SAndroid Build Coastguard Worker          output = _dex_path
4733*6777b538SAndroid Build Coastguard Worker          build_config = _build_config
4734*6777b538SAndroid Build Coastguard Worker
4735*6777b538SAndroid Build Coastguard Worker          # This will be a pure dex-merge.
4736*6777b538SAndroid Build Coastguard Worker          input_dex_filearg = "@FileArg($_rebased_build_config:modules:${_module.name}:all_dex_files)"
4737*6777b538SAndroid Build Coastguard Worker          enable_desugar = false
4738*6777b538SAndroid Build Coastguard Worker
4739*6777b538SAndroid Build Coastguard Worker          deps = [
4740*6777b538SAndroid Build Coastguard Worker            ":$_build_config_target",
4741*6777b538SAndroid Build Coastguard Worker            ":${_module_target_name}__java",
4742*6777b538SAndroid Build Coastguard Worker          ]
4743*6777b538SAndroid Build Coastguard Worker        }
4744*6777b538SAndroid Build Coastguard Worker      }
4745*6777b538SAndroid Build Coastguard Worker      _dex_target_for_module = ":$_dex_target"
4746*6777b538SAndroid Build Coastguard Worker
4747*6777b538SAndroid Build Coastguard Worker      if (_enable_art_profile_optimizations && _include_baseline_profile) {
4748*6777b538SAndroid Build Coastguard Worker        _module_target_name = get_label_info(_module_target, "name")
4749*6777b538SAndroid Build Coastguard Worker        _binary_profile_target =
4750*6777b538SAndroid Build Coastguard Worker            "${_module_target_name}__binary_baseline_profile"
4751*6777b538SAndroid Build Coastguard Worker        _binary_baseline_profile_path = "$target_out_dir/$_module_target_name/$_module_target_name.baseline.prof"
4752*6777b538SAndroid Build Coastguard Worker        _binary_baseline_profile_metadata_path =
4753*6777b538SAndroid Build Coastguard Worker            _binary_baseline_profile_path + "m"
4754*6777b538SAndroid Build Coastguard Worker        create_binary_profile(_binary_profile_target) {
4755*6777b538SAndroid Build Coastguard Worker          forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
4756*6777b538SAndroid Build Coastguard Worker          binary_baseline_profile_path = _binary_baseline_profile_path
4757*6777b538SAndroid Build Coastguard Worker          binary_baseline_profile_metadata_path =
4758*6777b538SAndroid Build Coastguard Worker              _binary_baseline_profile_metadata_path
4759*6777b538SAndroid Build Coastguard Worker          build_config = _module_build_config
4760*6777b538SAndroid Build Coastguard Worker          input_profile_path = _obfuscated_art_profile
4761*6777b538SAndroid Build Coastguard Worker          deps = [
4762*6777b538SAndroid Build Coastguard Worker            _dex_target_for_module,
4763*6777b538SAndroid Build Coastguard Worker            _module_build_config_target,
4764*6777b538SAndroid Build Coastguard Worker          ]
4765*6777b538SAndroid Build Coastguard Worker        }
4766*6777b538SAndroid Build Coastguard Worker      }
4767*6777b538SAndroid Build Coastguard Worker
4768*6777b538SAndroid Build Coastguard Worker      # Generate one module .zip file per bundle module.
4769*6777b538SAndroid Build Coastguard Worker      #
4770*6777b538SAndroid Build Coastguard Worker      # Important: the bundle tool uses the module's zip filename as
4771*6777b538SAndroid Build Coastguard Worker      # the internal module name inside the final bundle, in other words,
4772*6777b538SAndroid Build Coastguard Worker      # this file *must* be named ${_module.name}.zip
4773*6777b538SAndroid Build Coastguard Worker      _create_module_target = "${_target_name}__${_module.name}__create"
4774*6777b538SAndroid Build Coastguard Worker      _module_zip_path = "$target_out_dir/$target_name/${_module.name}.zip"
4775*6777b538SAndroid Build Coastguard Worker      create_android_app_bundle_module(_create_module_target) {
4776*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker,
4777*6777b538SAndroid Build Coastguard Worker                               [
4778*6777b538SAndroid Build Coastguard Worker                                 "is_multi_abi",
4779*6777b538SAndroid Build Coastguard Worker                                 "uncompress_dex",
4780*6777b538SAndroid Build Coastguard Worker                               ])
4781*6777b538SAndroid Build Coastguard Worker        module_name = _module.name
4782*6777b538SAndroid Build Coastguard Worker        min_sdk_version = _min_sdk_version
4783*6777b538SAndroid Build Coastguard Worker        build_config = _module_build_config
4784*6777b538SAndroid Build Coastguard Worker        module_zip_path = _module_zip_path
4785*6777b538SAndroid Build Coastguard Worker        if (!_proguard_enabled) {
4786*6777b538SAndroid Build Coastguard Worker          dex_path = _dex_path
4787*6777b538SAndroid Build Coastguard Worker          # dex_path is read from the build_config in the proguard case.
4788*6777b538SAndroid Build Coastguard Worker        }
4789*6777b538SAndroid Build Coastguard Worker
4790*6777b538SAndroid Build Coastguard Worker        if (module_name == "base" &&
4791*6777b538SAndroid Build Coastguard Worker            defined(invoker.expected_libs_and_assets)) {
4792*6777b538SAndroid Build Coastguard Worker          forward_variables_from(invoker,
4793*6777b538SAndroid Build Coastguard Worker                                 [
4794*6777b538SAndroid Build Coastguard Worker                                   "expected_libs_and_assets",
4795*6777b538SAndroid Build Coastguard Worker                                   "expected_libs_and_assets_base",
4796*6777b538SAndroid Build Coastguard Worker                                 ])
4797*6777b538SAndroid Build Coastguard Worker          top_target_name = _target_name
4798*6777b538SAndroid Build Coastguard Worker          build_config_target = _module_build_config_target
4799*6777b538SAndroid Build Coastguard Worker        }
4800*6777b538SAndroid Build Coastguard Worker
4801*6777b538SAndroid Build Coastguard Worker        deps = [
4802*6777b538SAndroid Build Coastguard Worker          _dex_target_for_module,
4803*6777b538SAndroid Build Coastguard Worker          _module_build_config_target,
4804*6777b538SAndroid Build Coastguard Worker          _module_target,
4805*6777b538SAndroid Build Coastguard Worker        ]
4806*6777b538SAndroid Build Coastguard Worker
4807*6777b538SAndroid Build Coastguard Worker        if (_enable_art_profile_optimizations && _include_baseline_profile) {
4808*6777b538SAndroid Build Coastguard Worker          # extra_assets is a list of ["{src_path}:{dst_path}"]
4809*6777b538SAndroid Build Coastguard Worker          extra_assets = [
4810*6777b538SAndroid Build Coastguard Worker            rebase_path(_binary_baseline_profile_path, root_build_dir) +
4811*6777b538SAndroid Build Coastguard Worker                ":dexopt/baseline.prof",
4812*6777b538SAndroid Build Coastguard Worker            rebase_path(_binary_baseline_profile_metadata_path,
4813*6777b538SAndroid Build Coastguard Worker                        root_build_dir) + ":dexopt/baseline.profm",
4814*6777b538SAndroid Build Coastguard Worker          ]
4815*6777b538SAndroid Build Coastguard Worker          deps += [ ":$_binary_profile_target" ]
4816*6777b538SAndroid Build Coastguard Worker        }
4817*6777b538SAndroid Build Coastguard Worker      }
4818*6777b538SAndroid Build Coastguard Worker
4819*6777b538SAndroid Build Coastguard Worker      _all_create_module_targets += [
4820*6777b538SAndroid Build Coastguard Worker        ":$_create_module_target",
4821*6777b538SAndroid Build Coastguard Worker        _module_build_config_target,
4822*6777b538SAndroid Build Coastguard Worker        "${_module_target}__compile_resources",
4823*6777b538SAndroid Build Coastguard Worker      ]
4824*6777b538SAndroid Build Coastguard Worker      _all_module_zip_paths += [ _module_zip_path ]
4825*6777b538SAndroid Build Coastguard Worker      _all_module_build_configs += [ _module_build_config ]
4826*6777b538SAndroid Build Coastguard Worker      _all_module_unused_resources_deps += [
4827*6777b538SAndroid Build Coastguard Worker        "${_module_target}__compile_resources",
4828*6777b538SAndroid Build Coastguard Worker        _dex_target_for_module,
4829*6777b538SAndroid Build Coastguard Worker        _module_build_config_target,
4830*6777b538SAndroid Build Coastguard Worker      ]
4831*6777b538SAndroid Build Coastguard Worker    }
4832*6777b538SAndroid Build Coastguard Worker    _strip_unused_resources = defined(invoker.strip_unused_resources) &&
4833*6777b538SAndroid Build Coastguard Worker                              invoker.strip_unused_resources
4834*6777b538SAndroid Build Coastguard Worker    if (_strip_unused_resources) {
4835*6777b538SAndroid Build Coastguard Worker      # Resources only live in the base module so we define the unused resources
4836*6777b538SAndroid Build Coastguard Worker      # target only on the base module target.
4837*6777b538SAndroid Build Coastguard Worker      _unused_resources_target = "${_base_target_name}__unused_resources"
4838*6777b538SAndroid Build Coastguard Worker      _unused_resources_config =
4839*6777b538SAndroid Build Coastguard Worker          "${_base_target_gen_dir}/${_base_target_name}_unused_resources.config"
4840*6777b538SAndroid Build Coastguard Worker      _unused_resources_r_txt_out =
4841*6777b538SAndroid Build Coastguard Worker          "${_base_target_gen_dir}/${_base_target_name}_unused_resources.R.txt"
4842*6777b538SAndroid Build Coastguard Worker      unused_resources(_unused_resources_target) {
4843*6777b538SAndroid Build Coastguard Worker        deps = _all_module_unused_resources_deps
4844*6777b538SAndroid Build Coastguard Worker        all_module_build_configs = _all_module_build_configs
4845*6777b538SAndroid Build Coastguard Worker        build_config = _base_module_build_config
4846*6777b538SAndroid Build Coastguard Worker        if (_proguard_enabled) {
4847*6777b538SAndroid Build Coastguard Worker          proguard_mapping_path = _proguard_mapping_path
4848*6777b538SAndroid Build Coastguard Worker        }
4849*6777b538SAndroid Build Coastguard Worker        output_config = _unused_resources_config
4850*6777b538SAndroid Build Coastguard Worker        output_r_txt = _unused_resources_r_txt_out
4851*6777b538SAndroid Build Coastguard Worker      }
4852*6777b538SAndroid Build Coastguard Worker      _unused_resources_final_path = "${_bundle_path}.unused_resources"
4853*6777b538SAndroid Build Coastguard Worker      _copy_unused_resources_target =
4854*6777b538SAndroid Build Coastguard Worker          "${_base_target_name}__copy_unused_resources"
4855*6777b538SAndroid Build Coastguard Worker      copy(_copy_unused_resources_target) {
4856*6777b538SAndroid Build Coastguard Worker        deps = [ ":$_unused_resources_target" ]
4857*6777b538SAndroid Build Coastguard Worker        sources = [ _unused_resources_config ]
4858*6777b538SAndroid Build Coastguard Worker        outputs = [ _unused_resources_final_path ]
4859*6777b538SAndroid Build Coastguard Worker      }
4860*6777b538SAndroid Build Coastguard Worker    }
4861*6777b538SAndroid Build Coastguard Worker
4862*6777b538SAndroid Build Coastguard Worker    _all_rebased_module_zip_paths =
4863*6777b538SAndroid Build Coastguard Worker        rebase_path(_all_module_zip_paths, root_build_dir)
4864*6777b538SAndroid Build Coastguard Worker
4865*6777b538SAndroid Build Coastguard Worker    _enable_language_splits = defined(invoker.enable_language_splits) &&
4866*6777b538SAndroid Build Coastguard Worker                              invoker.enable_language_splits
4867*6777b538SAndroid Build Coastguard Worker
4868*6777b538SAndroid Build Coastguard Worker    _split_dimensions = []
4869*6777b538SAndroid Build Coastguard Worker    if (_enable_language_splits) {
4870*6777b538SAndroid Build Coastguard Worker      _split_dimensions += [ "language" ]
4871*6777b538SAndroid Build Coastguard Worker    }
4872*6777b538SAndroid Build Coastguard Worker
4873*6777b538SAndroid Build Coastguard Worker    _keystore_path = android_keystore_path
4874*6777b538SAndroid Build Coastguard Worker    _keystore_password = android_keystore_password
4875*6777b538SAndroid Build Coastguard Worker    _keystore_name = android_keystore_name
4876*6777b538SAndroid Build Coastguard Worker
4877*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.keystore_path)) {
4878*6777b538SAndroid Build Coastguard Worker      _keystore_path = invoker.keystore_path
4879*6777b538SAndroid Build Coastguard Worker      _keystore_password = invoker.keystore_password
4880*6777b538SAndroid Build Coastguard Worker      _keystore_name = invoker.keystore_name
4881*6777b538SAndroid Build Coastguard Worker    }
4882*6777b538SAndroid Build Coastguard Worker
4883*6777b538SAndroid Build Coastguard Worker    _rebased_keystore_path = rebase_path(_keystore_path, root_build_dir)
4884*6777b538SAndroid Build Coastguard Worker
4885*6777b538SAndroid Build Coastguard Worker    _bundle_target_name = "${_target_name}__bundle"
4886*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(_bundle_target_name) {
4887*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/create_app_bundle.py"
4888*6777b538SAndroid Build Coastguard Worker      inputs = _all_module_zip_paths + _all_module_build_configs +
4889*6777b538SAndroid Build Coastguard Worker               [ _BUNDLETOOL_JAR_PATH ] + java_paths_for_inputs
4890*6777b538SAndroid Build Coastguard Worker      outputs = [ _bundle_path ]
4891*6777b538SAndroid Build Coastguard Worker      deps = _all_create_module_targets + [ ":$_build_config_target" ]
4892*6777b538SAndroid Build Coastguard Worker      args = [
4893*6777b538SAndroid Build Coastguard Worker        "--out-bundle=$_rebased_bundle_path",
4894*6777b538SAndroid Build Coastguard Worker        "--rtxt-out-path=$_rebased_bundle_path.R.txt",
4895*6777b538SAndroid Build Coastguard Worker        "--pathmap-out-path=$_rebased_bundle_path.pathmap.txt",
4896*6777b538SAndroid Build Coastguard Worker        "--module-zips=$_all_rebased_module_zip_paths",
4897*6777b538SAndroid Build Coastguard Worker      ]
4898*6777b538SAndroid Build Coastguard Worker      if (_split_dimensions != []) {
4899*6777b538SAndroid Build Coastguard Worker        args += [ "--split-dimensions=$_split_dimensions" ]
4900*6777b538SAndroid Build Coastguard Worker      }
4901*6777b538SAndroid Build Coastguard Worker
4902*6777b538SAndroid Build Coastguard Worker      # Android P+ support loading from stored dex.
4903*6777b538SAndroid Build Coastguard Worker      if (_min_sdk_version < 27) {
4904*6777b538SAndroid Build Coastguard Worker        args += [ "--compress-dex" ]
4905*6777b538SAndroid Build Coastguard Worker      }
4906*6777b538SAndroid Build Coastguard Worker
4907*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.rotation_config)) {
4908*6777b538SAndroid Build Coastguard Worker        args += [
4909*6777b538SAndroid Build Coastguard Worker          "--rotation-config",
4910*6777b538SAndroid Build Coastguard Worker          rebase_path(invoker.rotation_config, root_build_dir),
4911*6777b538SAndroid Build Coastguard Worker        ]
4912*6777b538SAndroid Build Coastguard Worker      }
4913*6777b538SAndroid Build Coastguard Worker
4914*6777b538SAndroid Build Coastguard Worker      if (treat_warnings_as_errors) {
4915*6777b538SAndroid Build Coastguard Worker        args += [ "--warnings-as-errors" ]
4916*6777b538SAndroid Build Coastguard Worker      }
4917*6777b538SAndroid Build Coastguard Worker
4918*6777b538SAndroid Build Coastguard Worker      if (_enable_language_splits) {
4919*6777b538SAndroid Build Coastguard Worker        args += [ "--base-allowlist-rtxt-path=@FileArg($_rebased_base_module_build_config:deps_info:base_allowlist_rtxt_path)" ]
4920*6777b538SAndroid Build Coastguard Worker        if (_strip_unused_resources) {
4921*6777b538SAndroid Build Coastguard Worker          # Use the stripped out rtxt file to set resources that are pinned to
4922*6777b538SAndroid Build Coastguard Worker          # the default language split.
4923*6777b538SAndroid Build Coastguard Worker          _rebased_unused_resources_r_txt_out =
4924*6777b538SAndroid Build Coastguard Worker              rebase_path(_unused_resources_r_txt_out, root_build_dir)
4925*6777b538SAndroid Build Coastguard Worker          inputs += [ _unused_resources_r_txt_out ]
4926*6777b538SAndroid Build Coastguard Worker          deps += [ ":$_unused_resources_target" ]
4927*6777b538SAndroid Build Coastguard Worker          args +=
4928*6777b538SAndroid Build Coastguard Worker              [ "--base-module-rtxt-path=$_rebased_unused_resources_r_txt_out" ]
4929*6777b538SAndroid Build Coastguard Worker        } else {
4930*6777b538SAndroid Build Coastguard Worker          args += [ "--base-module-rtxt-path=@FileArg($_rebased_base_module_build_config:deps_info:r_text_path)" ]
4931*6777b538SAndroid Build Coastguard Worker        }
4932*6777b538SAndroid Build Coastguard Worker      }
4933*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.validate_services) && invoker.validate_services) {
4934*6777b538SAndroid Build Coastguard Worker        args += [ "--validate-services" ]
4935*6777b538SAndroid Build Coastguard Worker      }
4936*6777b538SAndroid Build Coastguard Worker
4937*6777b538SAndroid Build Coastguard Worker      foreach(_module, _modules) {
4938*6777b538SAndroid Build Coastguard Worker        _rebased_build_config =
4939*6777b538SAndroid Build Coastguard Worker            rebase_path(_module.build_config, root_build_dir)
4940*6777b538SAndroid Build Coastguard Worker        args += [
4941*6777b538SAndroid Build Coastguard Worker          "--uncompressed-assets=@FileArg(" +
4942*6777b538SAndroid Build Coastguard Worker              "$_rebased_build_config:uncompressed_assets)",
4943*6777b538SAndroid Build Coastguard Worker          "--rtxt-in-paths=@FileArg(" +
4944*6777b538SAndroid Build Coastguard Worker              "$_rebased_build_config:deps_info:r_text_path)",
4945*6777b538SAndroid Build Coastguard Worker          "--pathmap-in-paths=@FileArg(" +
4946*6777b538SAndroid Build Coastguard Worker              "$_rebased_build_config:deps_info:module_pathmap_path)",
4947*6777b538SAndroid Build Coastguard Worker          "--module-name=" + _module.name,
4948*6777b538SAndroid Build Coastguard Worker        ]
4949*6777b538SAndroid Build Coastguard Worker      }
4950*6777b538SAndroid Build Coastguard Worker
4951*6777b538SAndroid Build Coastguard Worker      # http://crbug.com/725224. Fix for bots running out of memory.
4952*6777b538SAndroid Build Coastguard Worker      if (defined(java_cmd_pool_size)) {
4953*6777b538SAndroid Build Coastguard Worker        pool = "//build/config/android:java_cmd_pool($default_toolchain)"
4954*6777b538SAndroid Build Coastguard Worker      } else {
4955*6777b538SAndroid Build Coastguard Worker        pool = "//build/toolchain:link_pool($default_toolchain)"
4956*6777b538SAndroid Build Coastguard Worker      }
4957*6777b538SAndroid Build Coastguard Worker    }
4958*6777b538SAndroid Build Coastguard Worker
4959*6777b538SAndroid Build Coastguard Worker    # Create size info files for targets that care about size
4960*6777b538SAndroid Build Coastguard Worker    # (have proguard enabled).
4961*6777b538SAndroid Build Coastguard Worker    if (_proguard_enabled) {
4962*6777b538SAndroid Build Coastguard Worker      # Merge all module targets to obtain size info files for all targets.
4963*6777b538SAndroid Build Coastguard Worker      _all_module_targets = _module_targets
4964*6777b538SAndroid Build Coastguard Worker
4965*6777b538SAndroid Build Coastguard Worker      _size_info_target = "${_target_name}__size_info"
4966*6777b538SAndroid Build Coastguard Worker      create_size_info_files(_size_info_target) {
4967*6777b538SAndroid Build Coastguard Worker        name = "$_bundle_name.aab"
4968*6777b538SAndroid Build Coastguard Worker        deps = _all_module_targets + [ ":$_build_config_target" ]
4969*6777b538SAndroid Build Coastguard Worker        module_build_configs = _all_module_build_configs
4970*6777b538SAndroid Build Coastguard Worker      }
4971*6777b538SAndroid Build Coastguard Worker    }
4972*6777b538SAndroid Build Coastguard Worker
4973*6777b538SAndroid Build Coastguard Worker    if (_uses_static_library) {
4974*6777b538SAndroid Build Coastguard Worker      _install_artifacts_target = "${target_name}__install_artifacts"
4975*6777b538SAndroid Build Coastguard Worker      _install_artifacts_json =
4976*6777b538SAndroid Build Coastguard Worker          "${target_gen_dir}/${target_name}.install_artifacts"
4977*6777b538SAndroid Build Coastguard Worker      generated_file(_install_artifacts_target) {
4978*6777b538SAndroid Build Coastguard Worker        output_conversion = "json"
4979*6777b538SAndroid Build Coastguard Worker        deps = [ invoker.static_library_provider ]
4980*6777b538SAndroid Build Coastguard Worker        outputs = [ _install_artifacts_json ]
4981*6777b538SAndroid Build Coastguard Worker        data_keys = [ "install_artifacts" ]
4982*6777b538SAndroid Build Coastguard Worker        rebase = root_build_dir
4983*6777b538SAndroid Build Coastguard Worker      }
4984*6777b538SAndroid Build Coastguard Worker    }
4985*6777b538SAndroid Build Coastguard Worker
4986*6777b538SAndroid Build Coastguard Worker    # Generate a wrapper script for the bundle.
4987*6777b538SAndroid Build Coastguard Worker    _android_aapt2_path = android_sdk_tools_bundle_aapt2
4988*6777b538SAndroid Build Coastguard Worker
4989*6777b538SAndroid Build Coastguard Worker    _bundle_apks_path = "$_bundle_base_path/$_bundle_name.apks"
4990*6777b538SAndroid Build Coastguard Worker    _bundle_wrapper_script_dir = "$root_build_dir/bin"
4991*6777b538SAndroid Build Coastguard Worker    _bundle_wrapper_script_path = "$_bundle_wrapper_script_dir/$_target_name"
4992*6777b538SAndroid Build Coastguard Worker
4993*6777b538SAndroid Build Coastguard Worker    action_with_pydeps("${_target_name}__wrapper_script") {
4994*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/create_bundle_wrapper_script.py"
4995*6777b538SAndroid Build Coastguard Worker      inputs = [ _base_module_build_config ]
4996*6777b538SAndroid Build Coastguard Worker      outputs = [ _bundle_wrapper_script_path ]
4997*6777b538SAndroid Build Coastguard Worker
4998*6777b538SAndroid Build Coastguard Worker      # Telemetry for bundles uses the wrapper script for installation.
4999*6777b538SAndroid Build Coastguard Worker      data = [
5000*6777b538SAndroid Build Coastguard Worker        _bundle_wrapper_script_path,
5001*6777b538SAndroid Build Coastguard Worker        _android_aapt2_path,
5002*6777b538SAndroid Build Coastguard Worker        _keystore_path,
5003*6777b538SAndroid Build Coastguard Worker        _bundle_path,
5004*6777b538SAndroid Build Coastguard Worker      ]
5005*6777b538SAndroid Build Coastguard Worker      data_deps = [
5006*6777b538SAndroid Build Coastguard Worker        "//build/android:apk_operations_py",
5007*6777b538SAndroid Build Coastguard Worker        "//build/android:stack_tools",
5008*6777b538SAndroid Build Coastguard Worker      ]
5009*6777b538SAndroid Build Coastguard Worker
5010*6777b538SAndroid Build Coastguard Worker      deps = [ _base_module_build_config_target ]
5011*6777b538SAndroid Build Coastguard Worker      args = [
5012*6777b538SAndroid Build Coastguard Worker        "--script-output-path",
5013*6777b538SAndroid Build Coastguard Worker        rebase_path(_bundle_wrapper_script_path, root_build_dir),
5014*6777b538SAndroid Build Coastguard Worker        "--package-name=@FileArg($_rebased_base_module_build_config:deps_info:package_name)",
5015*6777b538SAndroid Build Coastguard Worker        "--aapt2",
5016*6777b538SAndroid Build Coastguard Worker        rebase_path(_android_aapt2_path, root_build_dir),
5017*6777b538SAndroid Build Coastguard Worker        "--bundle-path",
5018*6777b538SAndroid Build Coastguard Worker        _rebased_bundle_path,
5019*6777b538SAndroid Build Coastguard Worker        "--bundle-apks-path",
5020*6777b538SAndroid Build Coastguard Worker        rebase_path(_bundle_apks_path, root_build_dir),
5021*6777b538SAndroid Build Coastguard Worker        "--target-cpu=$target_cpu",
5022*6777b538SAndroid Build Coastguard Worker        "--keystore-path",
5023*6777b538SAndroid Build Coastguard Worker        _rebased_keystore_path,
5024*6777b538SAndroid Build Coastguard Worker        "--keystore-password",
5025*6777b538SAndroid Build Coastguard Worker        _keystore_password,
5026*6777b538SAndroid Build Coastguard Worker        "--key-name",
5027*6777b538SAndroid Build Coastguard Worker        _keystore_name,
5028*6777b538SAndroid Build Coastguard Worker      ]
5029*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.default_modules_for_testing)) {
5030*6777b538SAndroid Build Coastguard Worker        args += [ "--default-modules" ] + invoker.default_modules_for_testing
5031*6777b538SAndroid Build Coastguard Worker      }
5032*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.system_image_locale_allowlist)) {
5033*6777b538SAndroid Build Coastguard Worker        args += [
5034*6777b538SAndroid Build Coastguard Worker          "--system-image-locales=${invoker.system_image_locale_allowlist}",
5035*6777b538SAndroid Build Coastguard Worker        ]
5036*6777b538SAndroid Build Coastguard Worker      }
5037*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.command_line_flags_file)) {
5038*6777b538SAndroid Build Coastguard Worker        args += [
5039*6777b538SAndroid Build Coastguard Worker          "--command-line-flags-file",
5040*6777b538SAndroid Build Coastguard Worker          invoker.command_line_flags_file,
5041*6777b538SAndroid Build Coastguard Worker        ]
5042*6777b538SAndroid Build Coastguard Worker      }
5043*6777b538SAndroid Build Coastguard Worker      if (_uses_static_library) {
5044*6777b538SAndroid Build Coastguard Worker        deps += [ ":$_install_artifacts_target" ]
5045*6777b538SAndroid Build Coastguard Worker        _rebased_install_artifacts_json =
5046*6777b538SAndroid Build Coastguard Worker            rebase_path(_install_artifacts_json, root_build_dir)
5047*6777b538SAndroid Build Coastguard Worker        _static_library_apk_path =
5048*6777b538SAndroid Build Coastguard Worker            "@FileArg($_rebased_install_artifacts_json[])"
5049*6777b538SAndroid Build Coastguard Worker        args += [
5050*6777b538SAndroid Build Coastguard Worker          "--additional-apk",
5051*6777b538SAndroid Build Coastguard Worker          _static_library_apk_path,
5052*6777b538SAndroid Build Coastguard Worker        ]
5053*6777b538SAndroid Build Coastguard Worker      }
5054*6777b538SAndroid Build Coastguard Worker
5055*6777b538SAndroid Build Coastguard Worker      if (_proguard_enabled) {
5056*6777b538SAndroid Build Coastguard Worker        args += [
5057*6777b538SAndroid Build Coastguard Worker          "--proguard-mapping-path",
5058*6777b538SAndroid Build Coastguard Worker          rebase_path(_proguard_mapping_path, root_build_dir),
5059*6777b538SAndroid Build Coastguard Worker        ]
5060*6777b538SAndroid Build Coastguard Worker
5061*6777b538SAndroid Build Coastguard Worker        # Required by logcat command.
5062*6777b538SAndroid Build Coastguard Worker        data_deps += [ "//build/android/stacktrace:java_deobfuscate" ]
5063*6777b538SAndroid Build Coastguard Worker        data += [ _proguard_mapping_path ]
5064*6777b538SAndroid Build Coastguard Worker      }
5065*6777b538SAndroid Build Coastguard Worker    }
5066*6777b538SAndroid Build Coastguard Worker
5067*6777b538SAndroid Build Coastguard Worker    _enable_lint = defined(invoker.enable_lint) && invoker.enable_lint &&
5068*6777b538SAndroid Build Coastguard Worker                   !disable_android_lint
5069*6777b538SAndroid Build Coastguard Worker    if (_enable_lint) {
5070*6777b538SAndroid Build Coastguard Worker      android_lint("${target_name}__lint") {
5071*6777b538SAndroid Build Coastguard Worker        forward_variables_from(invoker,
5072*6777b538SAndroid Build Coastguard Worker                               [
5073*6777b538SAndroid Build Coastguard Worker                                 "lint_baseline_file",
5074*6777b538SAndroid Build Coastguard Worker                                 "lint_gen_dir",
5075*6777b538SAndroid Build Coastguard Worker                                 "lint_jar_path",
5076*6777b538SAndroid Build Coastguard Worker                                 "lint_suppressions_file",
5077*6777b538SAndroid Build Coastguard Worker                               ])
5078*6777b538SAndroid Build Coastguard Worker        build_config = _build_config
5079*6777b538SAndroid Build Coastguard Worker        build_config_dep = ":$_build_config_target"
5080*6777b538SAndroid Build Coastguard Worker        deps = _module_java_targets
5081*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.lint_suppressions_dep)) {
5082*6777b538SAndroid Build Coastguard Worker          deps += [ invoker.lint_suppressions_dep ]
5083*6777b538SAndroid Build Coastguard Worker        }
5084*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.lint_min_sdk_version)) {
5085*6777b538SAndroid Build Coastguard Worker          min_sdk_version = invoker.lint_min_sdk_version
5086*6777b538SAndroid Build Coastguard Worker        } else {
5087*6777b538SAndroid Build Coastguard Worker          min_sdk_version = _min_sdk_version
5088*6777b538SAndroid Build Coastguard Worker        }
5089*6777b538SAndroid Build Coastguard Worker      }
5090*6777b538SAndroid Build Coastguard Worker    } else {
5091*6777b538SAndroid Build Coastguard Worker      not_needed(invoker,
5092*6777b538SAndroid Build Coastguard Worker                 [
5093*6777b538SAndroid Build Coastguard Worker                   "lint_baseline_file",
5094*6777b538SAndroid Build Coastguard Worker                   "lint_gen_dir",
5095*6777b538SAndroid Build Coastguard Worker                   "lint_jar_path",
5096*6777b538SAndroid Build Coastguard Worker                   "lint_min_sdk_version",
5097*6777b538SAndroid Build Coastguard Worker                   "lint_suppressions_dep",
5098*6777b538SAndroid Build Coastguard Worker                   "lint_suppressions_file",
5099*6777b538SAndroid Build Coastguard Worker                 ])
5100*6777b538SAndroid Build Coastguard Worker    }
5101*6777b538SAndroid Build Coastguard Worker
5102*6777b538SAndroid Build Coastguard Worker    group(_target_name) {
5103*6777b538SAndroid Build Coastguard Worker      public_deps = [
5104*6777b538SAndroid Build Coastguard Worker        ":$_bundle_target_name",
5105*6777b538SAndroid Build Coastguard Worker        ":${_target_name}__wrapper_script",
5106*6777b538SAndroid Build Coastguard Worker      ]
5107*6777b538SAndroid Build Coastguard Worker      if (defined(_size_info_target)) {
5108*6777b538SAndroid Build Coastguard Worker        public_deps += [ ":$_size_info_target" ]
5109*6777b538SAndroid Build Coastguard Worker      }
5110*6777b538SAndroid Build Coastguard Worker      if (_enable_lint) {
5111*6777b538SAndroid Build Coastguard Worker        if (!defined(data_deps)) {
5112*6777b538SAndroid Build Coastguard Worker          data_deps = []
5113*6777b538SAndroid Build Coastguard Worker        }
5114*6777b538SAndroid Build Coastguard Worker        data_deps += [ ":${target_name}__lint" ]
5115*6777b538SAndroid Build Coastguard Worker      }
5116*6777b538SAndroid Build Coastguard Worker    }
5117*6777b538SAndroid Build Coastguard Worker
5118*6777b538SAndroid Build Coastguard Worker    _apks_path = "$root_build_dir/apks/$_bundle_name.apks"
5119*6777b538SAndroid Build Coastguard Worker    action_with_pydeps("${_target_name}_apks") {
5120*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/create_app_bundle_apks.py"
5121*6777b538SAndroid Build Coastguard Worker      inputs = java_paths_for_inputs + [
5122*6777b538SAndroid Build Coastguard Worker                 _bundle_path,
5123*6777b538SAndroid Build Coastguard Worker                 _BUNDLETOOL_JAR_PATH,
5124*6777b538SAndroid Build Coastguard Worker               ]
5125*6777b538SAndroid Build Coastguard Worker      outputs = [ _apks_path ]
5126*6777b538SAndroid Build Coastguard Worker      data = [ _apks_path ]
5127*6777b538SAndroid Build Coastguard Worker      args = [
5128*6777b538SAndroid Build Coastguard Worker        "--bundle",
5129*6777b538SAndroid Build Coastguard Worker        _rebased_bundle_path,
5130*6777b538SAndroid Build Coastguard Worker        "--output",
5131*6777b538SAndroid Build Coastguard Worker        rebase_path(_apks_path, root_build_dir),
5132*6777b538SAndroid Build Coastguard Worker        "--aapt2-path",
5133*6777b538SAndroid Build Coastguard Worker        rebase_path(android_sdk_tools_bundle_aapt2, root_build_dir),
5134*6777b538SAndroid Build Coastguard Worker        "--keystore-path",
5135*6777b538SAndroid Build Coastguard Worker        rebase_path(android_keystore_path, root_build_dir),
5136*6777b538SAndroid Build Coastguard Worker        "--keystore-name",
5137*6777b538SAndroid Build Coastguard Worker        android_keystore_name,
5138*6777b538SAndroid Build Coastguard Worker        "--keystore-password",
5139*6777b538SAndroid Build Coastguard Worker        android_keystore_password,
5140*6777b538SAndroid Build Coastguard Worker      ]
5141*6777b538SAndroid Build Coastguard Worker      if (debuggable_apks) {
5142*6777b538SAndroid Build Coastguard Worker        args += [ "--local-testing" ]
5143*6777b538SAndroid Build Coastguard Worker      }
5144*6777b538SAndroid Build Coastguard Worker      deps = [ ":$_bundle_target_name" ]
5145*6777b538SAndroid Build Coastguard Worker      metadata = {
5146*6777b538SAndroid Build Coastguard Worker        install_artifacts = [ _apks_path ]
5147*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.static_library_provider)) {
5148*6777b538SAndroid Build Coastguard Worker          install_artifacts_barrier = []
5149*6777b538SAndroid Build Coastguard Worker        }
5150*6777b538SAndroid Build Coastguard Worker      }
5151*6777b538SAndroid Build Coastguard Worker
5152*6777b538SAndroid Build Coastguard Worker      # http://crbug.com/725224. Fix for bots running out of memory.
5153*6777b538SAndroid Build Coastguard Worker      if (defined(java_cmd_pool_size)) {
5154*6777b538SAndroid Build Coastguard Worker        pool = "//build/config/android:java_cmd_pool($default_toolchain)"
5155*6777b538SAndroid Build Coastguard Worker      } else {
5156*6777b538SAndroid Build Coastguard Worker        pool = "//build/toolchain:link_pool($default_toolchain)"
5157*6777b538SAndroid Build Coastguard Worker      }
5158*6777b538SAndroid Build Coastguard Worker    }
5159*6777b538SAndroid Build Coastguard Worker  }
5160*6777b538SAndroid Build Coastguard Worker
5161*6777b538SAndroid Build Coastguard Worker  # Create an .apks file from an .aab file. The .apks file will contain the
5162*6777b538SAndroid Build Coastguard Worker  # minimal set of .apk files needed for tracking binary size.
5163*6777b538SAndroid Build Coastguard Worker  # The file will be created at "$bundle_path_without_extension.minimal.apks".
5164*6777b538SAndroid Build Coastguard Worker  #
5165*6777b538SAndroid Build Coastguard Worker  # Variables:
5166*6777b538SAndroid Build Coastguard Worker  #   bundle_path: Path to the input .aab file.
5167*6777b538SAndroid Build Coastguard Worker  #
5168*6777b538SAndroid Build Coastguard Worker  # Example:
5169*6777b538SAndroid Build Coastguard Worker  #   create_app_bundle_minimal_apks("minimal_apks") {
5170*6777b538SAndroid Build Coastguard Worker  #     deps = [
5171*6777b538SAndroid Build Coastguard Worker  #       ":bundle_target",
5172*6777b538SAndroid Build Coastguard Worker  #     ]
5173*6777b538SAndroid Build Coastguard Worker  #     bundle_path = "$root_build_dir/apks/Bundle.aab"
5174*6777b538SAndroid Build Coastguard Worker  #   }
5175*6777b538SAndroid Build Coastguard Worker  template("create_app_bundle_minimal_apks") {
5176*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(target_name) {
5177*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "deps" ])
5178*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/create_app_bundle_apks.py"
5179*6777b538SAndroid Build Coastguard Worker      _dir = get_path_info(invoker.bundle_path, "dir")
5180*6777b538SAndroid Build Coastguard Worker      _name = get_path_info(invoker.bundle_path, "name")
5181*6777b538SAndroid Build Coastguard Worker      _output_path = "$_dir/$_name.minimal.apks"
5182*6777b538SAndroid Build Coastguard Worker      outputs = [ _output_path ]
5183*6777b538SAndroid Build Coastguard Worker      inputs = [ invoker.bundle_path ] + java_paths_for_inputs
5184*6777b538SAndroid Build Coastguard Worker      args = [
5185*6777b538SAndroid Build Coastguard Worker        "--bundle",
5186*6777b538SAndroid Build Coastguard Worker        rebase_path(invoker.bundle_path, root_build_dir),
5187*6777b538SAndroid Build Coastguard Worker        "--output",
5188*6777b538SAndroid Build Coastguard Worker        rebase_path(_output_path, root_build_dir),
5189*6777b538SAndroid Build Coastguard Worker        "--aapt2-path",
5190*6777b538SAndroid Build Coastguard Worker        rebase_path(android_sdk_tools_bundle_aapt2, root_build_dir),
5191*6777b538SAndroid Build Coastguard Worker        "--keystore-path",
5192*6777b538SAndroid Build Coastguard Worker        rebase_path(android_keystore_path, root_build_dir),
5193*6777b538SAndroid Build Coastguard Worker        "--keystore-name",
5194*6777b538SAndroid Build Coastguard Worker        android_keystore_name,
5195*6777b538SAndroid Build Coastguard Worker        "--keystore-password",
5196*6777b538SAndroid Build Coastguard Worker        android_keystore_password,
5197*6777b538SAndroid Build Coastguard Worker        "--minimal",
5198*6777b538SAndroid Build Coastguard Worker      ]
5199*6777b538SAndroid Build Coastguard Worker    }
5200*6777b538SAndroid Build Coastguard Worker  }
5201*6777b538SAndroid Build Coastguard Worker
5202*6777b538SAndroid Build Coastguard Worker  template("alias_with_wrapper_script") {
5203*6777b538SAndroid Build Coastguard Worker    copy(target_name) {
5204*6777b538SAndroid Build Coastguard Worker      _aliased_wrapper_script_name =
5205*6777b538SAndroid Build Coastguard Worker          get_label_info(invoker.alias_target, "name")
5206*6777b538SAndroid Build Coastguard Worker      _aliased_wrapper_script =
5207*6777b538SAndroid Build Coastguard Worker          "$root_build_dir/bin/$_aliased_wrapper_script_name"
5208*6777b538SAndroid Build Coastguard Worker      sources = [ _aliased_wrapper_script ]
5209*6777b538SAndroid Build Coastguard Worker      deps = [ invoker.alias_target ]
5210*6777b538SAndroid Build Coastguard Worker
5211*6777b538SAndroid Build Coastguard Worker      _output_path = "$root_build_dir/bin/$target_name"
5212*6777b538SAndroid Build Coastguard Worker      outputs = [ _output_path ]
5213*6777b538SAndroid Build Coastguard Worker    }
5214*6777b538SAndroid Build Coastguard Worker  }
5215*6777b538SAndroid Build Coastguard Worker
5216*6777b538SAndroid Build Coastguard Worker  # Generate an Android resources target that contains localized strings
5217*6777b538SAndroid Build Coastguard Worker  # describing the current locale used by the Android framework to display
5218*6777b538SAndroid Build Coastguard Worker  # UI strings. These are used by
5219*6777b538SAndroid Build Coastguard Worker  # org.chromium.chrome.browser.ChromeLocalizationUtils.
5220*6777b538SAndroid Build Coastguard Worker  #
5221*6777b538SAndroid Build Coastguard Worker  # Variables:
5222*6777b538SAndroid Build Coastguard Worker  #    ui_locales: List of Chromium locale names to generate resources for.
5223*6777b538SAndroid Build Coastguard Worker  #
5224*6777b538SAndroid Build Coastguard Worker  template("generate_ui_locale_resources") {
5225*6777b538SAndroid Build Coastguard Worker    _generating_target_name = "${target_name}__generate"
5226*6777b538SAndroid Build Coastguard Worker    _rebased_output_zip_path = rebase_path(target_gen_dir, root_gen_dir)
5227*6777b538SAndroid Build Coastguard Worker    _output_zip = "${root_out_dir}/resource_zips/${_rebased_output_zip_path}/" +
5228*6777b538SAndroid Build Coastguard Worker                  "${target_name}.zip"
5229*6777b538SAndroid Build Coastguard Worker
5230*6777b538SAndroid Build Coastguard Worker    action_with_pydeps(_generating_target_name) {
5231*6777b538SAndroid Build Coastguard Worker      script = "//build/android/gyp/create_ui_locale_resources.py"
5232*6777b538SAndroid Build Coastguard Worker      outputs = [ _output_zip ]
5233*6777b538SAndroid Build Coastguard Worker      args = [
5234*6777b538SAndroid Build Coastguard Worker        "--locale-list=${invoker.ui_locales}",
5235*6777b538SAndroid Build Coastguard Worker        "--output-zip",
5236*6777b538SAndroid Build Coastguard Worker        rebase_path(_output_zip, root_build_dir),
5237*6777b538SAndroid Build Coastguard Worker      ]
5238*6777b538SAndroid Build Coastguard Worker    }
5239*6777b538SAndroid Build Coastguard Worker
5240*6777b538SAndroid Build Coastguard Worker    android_generated_resources(target_name) {
5241*6777b538SAndroid Build Coastguard Worker      generating_target = ":$_generating_target_name"
5242*6777b538SAndroid Build Coastguard Worker      generated_resources_zip = _output_zip
5243*6777b538SAndroid Build Coastguard Worker    }
5244*6777b538SAndroid Build Coastguard Worker  }
5245*6777b538SAndroid Build Coastguard Worker}
5246