summaryrefslogtreecommitdiffstats
path: root/chromium/build/config/android/config.gni
blob: c1bfc874669358dc8b1ba668e0120310096c7e18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This file contains common system config stuff for the Android build.

# NOTE: Because Chrome OS builds may depend on targets built with the Android
# toolchain, this GNI file may be read and processed from within Chrome OS
# toolchains. Checking |is_android| here would therefore be too restrictive.
if (is_android || is_chromeos) {
  import("//build/config/chromecast_build.gni")
  import("//build_overrides/build.gni")
  import("abi.gni")

  if (build_with_chromium) {
    # Some non-chromium projects (e.g. WebRTC) use our build configs
    # heavily but don't write gclient args files.

    import("//build/config/gclient_args.gni")
    if (defined(checkout_android_native_support)) {
      n = "$0x0A"  # Newline
      assert(checkout_android_native_support,
             "Missing native Android toolchain support. |target_os| in your " +
                 ".gclient configuration file (in the parent directory of " +
                 "src) must include \"android\" and/or \"chromeos\". For " +
                 "example:${n}${n}solutions = [${n}...${n}]${n}" +
                 "target_os=[\"chromeos\"]${n}${n}" +
                 "After adding |target_os| please re-run \"gclient sync\".${n}")
    }
  }

  has_chrome_android_internal =
      exec_script("//build/dir_exists.py",
                  [ rebase_path("//clank", root_build_dir) ],
                  "string") == "True"

  # We are using a separate declare_args block for only this argument so that
  # we can decide if we have to pull in definitions from the internal config
  # early.
  declare_args() {
    # Enables using the internal Chrome for Android repository. The default
    # value depends on whether the repository is available, and if it's not but
    # this argument is manually set to True, the generation will fail.
    # The main purpose of this argument is to avoid having to maintain 2
    # repositories to support both public only and internal builds.
    enable_chrome_android_internal = has_chrome_android_internal

    # Android API level for 32 bits platforms
    android32_ndk_api_level = 16

    # Android API level for 64 bits platforms
    android64_ndk_api_level = 21
  }

  if (enable_chrome_android_internal) {
    import("//clank/config.gni")
  } else {
    import("//build/config/android/sdk.gni")
    declare_args() {
      # Android SDK release. Currently, only "o_mr1" and "p" are publicly
      # supported.
      android_sdk_release = default_android_sdk_release
    }
  }

  if (!defined(default_android_ndk_root)) {
    default_android_ndk_root = "//third_party/android_ndk"
    default_android_ndk_version = "r20"
    default_android_ndk_major_version = 20
  } else {
    assert(defined(default_android_ndk_version))
    assert(defined(default_android_ndk_major_version))
  }

  if (android_sdk_release == "o_mr1") {
    default_android_sdk_root = "//third_party/android_sdk/public"
    default_android_sdk_version = 27
    default_android_sdk_build_tools_version = "29.0.2"
    default_android_sdk_tools_version_suffix = "-26.0.0-dev"
    public_android_sdk = true
  }

  if (android_sdk_release == "p") {
    default_android_sdk_root = "//third_party/android_sdk/public"
    default_android_sdk_version = 28
    default_android_sdk_build_tools_version = "29.0.2"
    default_android_sdk_tools_version_suffix = "-26.0.0-dev"
    public_android_sdk = true
  }

  if (!defined(default_lint_android_sdk_root)) {
    # Purposefully repeated so that downstream can change
    # default_android_sdk_root without changing lint version.
    default_lint_android_sdk_root = "//third_party/android_sdk/public"
    default_lint_android_sdk_version = 26
  }

  if (!defined(default_extras_android_sdk_root)) {
    # Purposefully repeated so that downstream can change
    # default_android_sdk_root without changing where we load the SDK extras
    # from. (Google Play services, etc.)
    default_extras_android_sdk_root = "//third_party/android_sdk/public"
  }

  if (!defined(default_android_keystore_path)) {
    default_android_keystore_path = "//build/android/chromium-debug.keystore"
    default_android_keystore_name = "chromiumdebugkey"
    default_android_keystore_password = "chromium"
  }

  # google_play_services_package contains the path where individual client
  # targets (e.g. google_play_services_base_java) are located.
  if (!defined(google_play_services_package)) {
    if (is_chromecast && chromecast_branding != "public") {
      google_play_services_package = "//chromecast/internal/android/prebuilt/google-play-services-first-party"
    } else {
      google_play_services_package = "//third_party/android_deps"
    }
  }

  if (!defined(system_webview_apk_target)) {
    system_webview_apk_target = "//android_webview:system_webview_apk"
  }

  webview_public_framework_dep =
      "//third_party/android_sdk:public_framework_system_java"
  if (!defined(webview_framework_dep)) {
    webview_framework_dep = webview_public_framework_dep
  }

  assert(defined(default_android_sdk_root),
         "SDK release " + android_sdk_release + " not recognized.")

  declare_args() {
    android_ndk_root = default_android_ndk_root
    android_ndk_version = default_android_ndk_version
    android_ndk_major_version = default_android_ndk_major_version

    android_sdk_root = default_android_sdk_root
    android_sdk_version = default_android_sdk_version
    android_sdk_build_tools_version = default_android_sdk_build_tools_version
    android_sdk_tools_version_suffix = default_android_sdk_tools_version_suffix

    lint_android_sdk_root = default_lint_android_sdk_root
    lint_android_sdk_version = default_lint_android_sdk_version

    # Libc++ library directory. Override to use a custom libc++ binary.
    android_libcpp_lib_dir = ""

    # Android versionCode for android_apk()s that don't explicitly set one.
    android_default_version_code = "1"

    # Android versionName for android_apk()s that don't explicitly set one.
    android_default_version_name = "Developer Build"

    # Forced Android versionCode
    android_override_version_code = ""

    # Forced Android versionName
    android_override_version_name = ""

    # The path to the keystore to use for signing builds.
    android_keystore_path = default_android_keystore_path

    # The name of the keystore to use for signing builds.
    android_keystore_name = default_android_keystore_name

    # The password for the keystore to use for signing builds.
    android_keystore_password = default_android_keystore_password

    # Java debug on Android. Having this on enables multidexing, and turning it
    # off will enable proguard.
    is_java_debug = is_debug

    # Report Java assert failure on Android. Turning it on will report Java
    # assert failure without crash.
    report_java_assert = false

    # Mark APKs as android:debuggable="true".
    debuggable_apks = !is_official_build

    # Set to false to disable the Errorprone compiler
    use_errorprone_java_compiler = true

    # Enables Jacoco Java code coverage. Instruments classes during build to
    # produce .exec files during runtime
    jacoco_coverage = false

    # Disables process isolation when building _incremental targets.
    # Required for Android M+ due to SELinux policies (stronger sandboxing).
    disable_incremental_isolated_processes = false

    # Build incremental targets whenever possible.
    # Ex. with this arg set to true, the chrome_public_apk target result in
    # chrome_public_apk_incremental being built.
    incremental_apk_by_default = false

    # When true, updates all android_aar_prebuilt() .info files during gn gen.
    # Refer to android_aar_prebuilt() for more details.
    update_android_aar_prebuilts = false

    # Turns off android lint. Useful for prototyping or for faster local builds.
    disable_android_lint = false

    # Location of aapt2 used for app bundles. For now, a more recent version
    # than the one distributed with the Android SDK is required.
    android_sdk_tools_bundle_aapt2_dir =
        "//third_party/android_build_tools/aapt2"

    # Checks that proguard flags have not changed (!is_java_debug only).
    check_android_configuration = false

    # Enable the chrome build for devices without touchscreens.
    notouch_build = false

    # Move Trichrome assets to the shared library APK. This will be removed
    # once P builds are no longer supported. https://crbug.com/943637
    trichrome_shared_assets = android_sdk_release == "q"
  }

  if (notouch_build && defined(extra_keymappings)) {
    keycode_conversion_data_android_path = extra_keymappings
  }

  assert(!(check_android_configuration && is_java_debug),
         "check_android_configuration only works when proguard is enabled")

  # We need a second declare_args block to make sure we are using the overridden
  # value of the arguments set above.
  declare_args() {
    if (defined(default_android_sdk_platform_version)) {
      android_sdk_platform_version = default_android_sdk_platform_version
    } else {
      android_sdk_platform_version = android_sdk_version
    }

    # Speed up dexing using dx --incremental.
    enable_incremental_dx = is_java_debug

    # Use hashed symbol names to reduce JNI symbol overhead.
    use_hashed_jni_names = !is_java_debug
  }

  # This should not be used for release builds since dx --incremental is known
  # to not produce byte-for-byte identical output.
  assert(!(enable_incremental_dx && !is_java_debug))

  # Path to where selected build variables are written to.
  android_build_vars = "$root_build_dir/build_vars.txt"

  # Host stuff -----------------------------------------------------------------

  # Defines the name the Android build gives to the current host CPU
  # architecture, which is different than the names GN uses.
  if (host_cpu == "x64") {
    android_host_arch = "x86_64"
  } else if (host_cpu == "x86") {
    android_host_arch = "x86"
  } else {
    assert(false, "Need Android toolchain support for your build CPU arch.")
  }

  # Defines the name the Android build gives to the current host CPU
  # architecture, which is different than the names GN uses.
  if (host_os == "linux") {
    android_host_os = "linux"
  } else if (host_os == "mac") {
    android_host_os = "darwin"
  } else {
    assert(false, "Need Android toolchain support for your build OS.")
  }

  # Directories and files ------------------------------------------------------
  #
  # We define may of the dirs strings here for each output architecture (rather
  # than just the current one) since these are needed by the Android toolchain
  # file to define toolchains for all possible targets in one pass.

  android_sdk =
      "${android_sdk_root}/platforms/android-${android_sdk_platform_version}"
  android_sdk_tools = "${android_sdk_root}/tools"
  android_sdk_build_tools =
      "${android_sdk_root}/build-tools/$android_sdk_build_tools_version"

  # Path to the SDK's android.jar
  android_sdk_jar = "$android_sdk/android.jar"

  # Location of libgcc. This is only needed for the current GN toolchain, so we
  # only need to define the current one, rather than one for every platform
  # like the toolchain roots.
  if (current_cpu == "x86") {
    android_prebuilt_arch = "android-x86"
    _binary_prefix = "i686-linux-android"
  } else if (current_cpu == "arm") {
    android_prebuilt_arch = "android-arm"
    _binary_prefix = "arm-linux-androideabi"
  } else if (current_cpu == "mipsel") {
    android_prebuilt_arch = "android-mips"
    _binary_prefix = "mipsel-linux-android"
  } else if (current_cpu == "x64") {
    android_prebuilt_arch = "android-x86_64"
    _binary_prefix = "x86_64-linux-android"
  } else if (current_cpu == "arm64") {
    android_prebuilt_arch = "android-arm64"
    _binary_prefix = "aarch64-linux-android"
  } else if (current_cpu == "mips64el") {
    android_prebuilt_arch = "android-mips64"
    _binary_prefix = "mips64el-linux-android"
  } else {
    assert(false, "Need android libgcc support for your target arch.")
  }

  android_toolchain_root = "$android_ndk_root/toolchains/llvm/prebuilt/${android_host_os}-${android_host_arch}"
  android_tool_prefix = "$android_toolchain_root/bin/$_binary_prefix-"
  android_readelf = "${android_tool_prefix}readelf"
  android_objcopy = "${android_tool_prefix}objcopy"
  android_gdbserver =
      "$android_ndk_root/prebuilt/$android_prebuilt_arch/gdbserver/gdbserver"

  android_sdk_tools_bundle_aapt2 = "${android_sdk_tools_bundle_aapt2_dir}/aapt2"
}