1# Copyright 2014 The Chromium Authors 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import("//build/config/android/build_vars.gni") 6import("//build/config/android/config.gni") 7import("//build/config/android/rules.gni") 8import("//build/config/clang/clang.gni") 9import("//build/config/coverage/coverage.gni") 10import("//build/config/gclient_args.gni") 11import("//build/config/python.gni") 12import("//build_overrides/build.gni") 13 14if (build_with_chromium) { 15 import("//base/allocator/partition_allocator/partition_alloc.gni") 16} 17 18if (enable_java_templates) { 19 # Create or update the API versions cache if necessary by running a 20 # functionally empty lint task. This prevents racy creation of the 21 # cache while linting java targets in android_lint. 22 android_lint("prepare_android_lint_cache") { 23 create_cache = true 24 } 25 26 generate_build_config_srcjar("placeholder_build_config_srcjar") { 27 } 28 29 generate_build_config_srcjar("build_config_for_robolectric_srcjar") { 30 testonly = true 31 } 32 33 write_native_libraries_java("native_libraries_gen") { 34 use_final_fields = false 35 } 36 37 java_library("build_java") { 38 supports_android = true 39 40 # Caused odd errors: https://crbug.com/404877460 41 jacoco_never_instrument = true 42 43 # Required to prevent circular dependency from //tools/android/errorprone_plugin. 44 enable_errorprone = false 45 srcjar_deps = [ 46 ":native_libraries_gen", 47 ":placeholder_build_config_srcjar", 48 ] 49 sources = [ 50 "java/src/org/chromium/build/NullUtil.java", 51 "java/src/org/chromium/build/annotations/AlwaysInline.java", 52 "java/src/org/chromium/build/annotations/CheckDiscard.java", 53 "java/src/org/chromium/build/annotations/Contract.java", 54 "java/src/org/chromium/build/annotations/DoNotClassMerge.java", 55 "java/src/org/chromium/build/annotations/DoNotInline.java", 56 "java/src/org/chromium/build/annotations/DoNotStripLogs.java", 57 "java/src/org/chromium/build/annotations/EnsuresNonNull.java", 58 "java/src/org/chromium/build/annotations/EnsuresNonNullIf.java", 59 "java/src/org/chromium/build/annotations/IdentifierNameString.java", 60 "java/src/org/chromium/build/annotations/Initializer.java", 61 "java/src/org/chromium/build/annotations/MockedInTests.java", 62 "java/src/org/chromium/build/annotations/MonotonicNonNull.java", 63 "java/src/org/chromium/build/annotations/NullMarked.java", 64 "java/src/org/chromium/build/annotations/NullUnmarked.java", 65 "java/src/org/chromium/build/annotations/Nullable.java", 66 "java/src/org/chromium/build/annotations/OptimizeAsNonNull.java", 67 "java/src/org/chromium/build/annotations/RequiresNonNull.java", 68 "java/src/org/chromium/build/annotations/ServiceImpl.java", 69 "java/src/org/chromium/build/annotations/UsedByReflection.java", 70 "java/src/org/chromium/build/annotations/UsedReflectively.java", 71 ] 72 73 jar_excluded_patterns = [ "*/build/BuildConfig.class" ] 74 75 # New version of NativeLibraries.java (with the actual correct values) will 76 # be created when creating an apk. 77 jar_excluded_patterns += [ "*/NativeLibraries.class" ] 78 79 proguard_configs = [ "chromium_annotations.flags" ] 80 } 81 82 # Not all //build embedders pull in junit_binary deps that live in //third_party. 83 if (build_with_chromium) { 84 android_assets("junit_test_assets") { 85 testonly = true 86 87 # We just need any file here, so use the test itself. 88 sources = [ "junit/src/org/chromium/build/AndroidAssetsTest.java" ] 89 } 90 android_resources("junit_test_resources") { 91 testonly = true 92 sources = [ "junit/res/values/strings.xml" ] 93 mergeable_android_manifests = [ "junit/AndroidManifest_mergetest.xml" ] 94 } 95 robolectric_binary("build_junit_tests") { 96 # Test has no JNI, so skip JNI Generator step. 97 resources_package = "org.chromium.build" 98 sources = [ 99 "junit/src/org/chromium/build/AndroidAssetsTest.java", 100 "junit/src/org/chromium/build/IncrementalJavacTest.java", 101 ] 102 deps = [ 103 ":junit_test_assets", 104 ":junit_test_resources", 105 "//build/android/test/incremental_javac_gn:no_signature_change_prebuilt_java", 106 "//third_party/junit", 107 ] 108 } 109 } 110} 111 112if (defined(sanitizer_arch)) { 113 action("generate_wrap_sh") { 114 script = "generate_wrap_sh.py" 115 outputs = [ "$target_gen_dir/$target_name/wrap.sh" ] 116 args = [ 117 "--arch=$sanitizer_arch", 118 "--output", 119 rebase_path(outputs[0], root_build_dir), 120 ] 121 if (is_hwasan) { 122 args += [ "--is_hwasan" ] 123 } 124 } 125} 126 127# TODO(go/turn-down-test-results): Remove once we turn down 128# test-results.appspot.com 129python_library("test_result_presentations_py") { 130 pydeps_file = "pylib/results/presentation/test_results_presentation.pydeps" 131 data = [ 132 "//build/android/pylib/results/presentation/template", 133 "//build/android/pylib/results/presentation/javascript/main_html.js", 134 "//third_party/catapult/third_party/gsutil/", 135 "//third_party/jinja2/debug.py", 136 "//third_party/six", 137 ] 138} 139 140python_library("devil_chromium_py") { 141 pydeps_file = "devil_chromium.pydeps" 142 data = [ 143 "devil_chromium.py", 144 "devil_chromium.json", 145 "//third_party/catapult/third_party/gsutil/", 146 "//third_party/catapult/devil/devil/devil_dependencies.json", 147 148 # Read by gn_helpers.BuildWithChromium() 149 "//build/config/gclient_args.gni", 150 ] 151} 152 153# Contains runtime deps for installing apks. 154# E.g. from test_runner.py or from apk_operations.py. 155group("apk_installer_data") { 156 # Other //build users let devil library fetch these from Google Storage. 157 if (build_with_chromium) { 158 if (!is_component_build) { 159 data_deps = [ 160 "//build/android/pylib/device/commands", 161 "//tools/android/devil_util", 162 ] 163 } 164 data = 165 [ "//third_party/android_build_tools/bundletool/cipd/bundletool.jar" ] 166 } 167} 168 169python_library("apk_operations_py") { 170 pydeps_file = "apk_operations.pydeps" 171 deps = [ ":apk_installer_data" ] 172} 173 174group("test_runner_py") { 175 testonly = true 176 deps = [ 177 ":test_runner_core_py", 178 ":test_runner_device_support", 179 ] 180} 181 182python_library("test_runner_core_py") { 183 testonly = true 184 pydeps_file = "test_runner.pydeps" 185 data = [ 186 "pylib/gtest/filter/", 187 "pylib/instrumentation/render_test.html.jinja", 188 "pylib/local/machine/local_machine_hostside_tradefed_config.xml", 189 "test_wrapper/logdog_wrapper.py", 190 "//third_party/requests/", 191 ] 192 data_deps = [ ":logdog_wrapper_py" ] 193 if (use_clang_coverage && checkout_clang_coverage_tools) { 194 # Test runner script may use `llvm-profdata` (if exists) to merge 195 # clang code coverage data after each instrumentation test to 196 # save space. The tool only exists when `checkout_clang_coverage_tools` 197 # gclient custom_var is true. 198 data += [ "${clang_base_path}/bin/llvm-profdata" ] 199 } 200} 201 202group("test_runner_device_support") { 203 testonly = true 204 205 # We hardcode using these tools from the public sdk in devil_chromium.json and 206 # in pylib's constants. 207 data = [ 208 "${public_android_sdk_build_tools}/aapt", 209 "${public_android_sdk_build_tools}/aapt2", 210 "${public_android_sdk_build_tools}/dexdump", 211 "${public_android_sdk_build_tools}/lib64/libc++.so", 212 "${public_android_sdk_build_tools}/split-select", 213 "${public_android_sdk_root}/platform-tools/adb", 214 ] 215 data_deps = [ 216 ":apk_installer_data", 217 ":devil_chromium_py", 218 ":stack_tools", 219 ] 220 221 # Other //build users let devil library fetch these from Google Storage. 222 if (build_with_chromium) { 223 if (!is_component_build) { 224 data_deps += [ "//tools/android/forwarder2" ] 225 } 226 data += [ "//tools/android/avd/proto/" ] 227 if (enable_chrome_android_internal) { 228 data += [ "//clank/tools/android/avd/proto/" ] 229 } 230 if (use_full_mte) { 231 data_deps += [ "//tools/android/mte:mte_device_setup" ] 232 } 233 } 234 235 # Proguard is needed only when using apks (rather than native executables). 236 if (enable_java_templates) { 237 data_deps += [ "//build/android/stacktrace:java_deobfuscate" ] 238 } 239} 240 241python_library("logdog_wrapper_py") { 242 pydeps_file = "test_wrapper/logdog_wrapper.pydeps" 243} 244 245python_library("resource_sizes_py") { 246 pydeps_file = "resource_sizes.pydeps" 247 data_deps = [ 248 ":devil_chromium_py", 249 "//third_party/catapult/tracing:convert_chart_json", 250 ] 251 252 data = [ 253 build_vars_file, 254 "//third_party/llvm-build/Release+Asserts/bin/llvm-readobj", 255 ] 256} 257 258# Tools necessary for symbolizing tombstones or stack traces that are output to 259# logcat. 260# Hidden behind build_with_chromium because some third party repos that use 261# //build don't pull in //third_party/android_platform. 262# TODO(crbug.com/40145789): Move stack script into //build/third_party 263# and enable unconditionally. 264group("stack_tools") { 265 if (build_with_chromium) { 266 data = [ 267 "tombstones.py", 268 "pylib/symbols/", 269 "stacktrace/", 270 ] 271 272 data_deps = 273 [ "//third_party/android_platform/development/scripts:stack_py" ] 274 } 275} 276 277# GN evaluates each .gn file once per toolchain, so restricting to default 278# toolchain will ensure write_file() is called only once. 279assert(current_toolchain == default_toolchain) 280 281# NOTE: If other platforms would benefit from exporting variables, we should 282# move this to a more top-level place. 283# It is currently here (instead of //BUILD.gn) to ensure that the file is 284# written even for non-chromium embedders of //build. 285_build_vars_json = { 286 # Underscore prefix so that it appears at the top. 287 _HEADER = "Generated during 'gn gen' by //build/android/BUILD.gn." 288 forward_variables_from(android_build_vars_json, "*") 289} 290 291write_file(build_vars_file, _build_vars_json, "json") 292