# Copyright 2015 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//android_webview/variables.gni")
import("//base/android/resource_exclusions.gni")
import("//build/config/android/abi.gni")
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
import("//build/config/chrome_build.gni")
import("//build/config/locales.gni")
import("//chrome/android/trichrome.gni")
import("//chrome/version.gni")
import("//components/crash/android/silent_java_assert_reporting.gni")
import("//device/vr/buildflags/buildflags.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
declare_args() {
# Android package name to use when compiling the system_webview_apk and
# trichrome_webview_apk targets. This should be used if the Android build
# on which you are going to install WebView is configured to load a
# different package name than the default used in AOSP.
system_webview_package_name = "com.android.webview"
}
template("system_webview_apk_or_module_tmpl") {
_is_trichrome = defined(invoker.is_trichrome) && invoker.is_trichrome
assert(_is_trichrome == defined(invoker.static_library_provider),
"If trichrome library is used, static_library_provider must be set " +
"so that a dep can be added on the library APK.")
_include_32_bit_webview =
!defined(invoker.include_32_bit_webview) || invoker.include_32_bit_webview
_include_64_bit_webview =
android_64bit_target_cpu && (!defined(invoker.include_64_bit_webview) ||
invoker.include_64_bit_webview)
if (_is_trichrome) {
_is_64_bit_browser = android_64bit_target_cpu && invoker.is_64_bit_browser
_version_code = TRICHROME_VERSION_MAP["${android_64bit_target_cpu}_${_is_64_bit_browser}_${_include_64_bit_webview}_${_include_32_bit_webview}"]
# Allow a custom version_code, but always use the default _trichrome_library_version_code
_trichrome_library_version_code = _version_code
} else {
_version_code = WEBVIEW_VERSION_MAP["${android_64bit_target_cpu}_${_include_64_bit_webview}_${_include_32_bit_webview}"]
}
if (defined(invoker.version_code)) {
_version_code = invoker.version_code
}
# Need to apply override explicitly to have it apply to library version.
if (android_override_version_code != "") {
_version_code = android_override_version_code
if (_is_trichrome) {
_trichrome_library_version_code = android_override_version_code
}
}
if (defined(invoker.manifest_package)) {
_manifest_package = invoker.manifest_package
} else {
_manifest_package = system_webview_package_name
}
_android_manifest = "$target_gen_dir/$target_name/AndroidManifest.xml"
_android_manifest_target_name = "${target_name}__android_manifest"
jinja_template(_android_manifest_target_name) {
input = "//android_webview/nonembedded/java/AndroidManifest.xml"
output = _android_manifest
_force_32_bit = _include_32_bit_webview && _include_64_bit_webview &&
(!_is_trichrome || !_is_64_bit_browser)
variables = [
"force_32_bit=$_force_32_bit",
"manifest_package=$_manifest_package",
]
if (_is_trichrome) {
variables += trichrome_jinja_variables +
[ "trichrome_version=$_trichrome_library_version_code" ]
if (_is_64_bit_browser) {
variables += [ "library=libmonochrome_64.so" ]
} else {
variables += [ "library=libmonochrome.so" ]
}
}
includes = []
if (defined(invoker.jinja_input)) {
includes += [ input ]
input = invoker.jinja_input
}
if (defined(invoker.jinja_extra_variables)) {
variables += invoker.jinja_extra_variables
}
if (defined(invoker.jinja_extra_includes)) {
includes += invoker.jinja_extra_includes
}
}
if (defined(invoker.target_type)) {
_target_type = invoker.target_type
} else {
_target_type = "android_apk"
}
target(_target_type, target_name) {
forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
# Do not forward variables used only by this template so that code below
# needs to use "invoker" to make it clear where variables are coming from.
forward_variables_from(invoker,
"*",
TESTONLY_AND_VISIBILITY + [
"is_64_bit_browser",
"is_trichrome",
"include_32_bit_webview",
"include_64_bit_webview",
"manifest_package",
"webview_framework_dep",
"webview_product_config_java_package",
"webview_devui_show_icon",
"use_stable_package_name_for_trichrome",
])
_is_bundle_module = _target_type == "android_app_bundle_module"
_omit_dex = defined(invoker.omit_dex) && invoker.omit_dex
if (!defined(min_sdk_version) && _is_trichrome) {
min_sdk_version = 29
}
if (defined(expected_android_manifest)) {
if (android_64bit_target_cpu) {
_version_code_offset = chrome_32_version_code
} else {
_version_code_offset = chrome_version_code
}
expected_android_manifest_version_code_offset = _version_code_offset
expected_android_manifest_library_version_offset = _version_code_offset
}
android_manifest = _android_manifest
android_manifest_dep = ":$_android_manifest_target_name"
manifest_package = _manifest_package
deps += [
"//android_webview:locale_pak_assets",
"//android_webview:pak_file_assets",
]
# Only the .build_config.json is used from this target, and it's fine if
# it contains more assets than we need (always use the 64_32 variant).
# https://crbug.com/357131361
suffix_apk_assets_used_by = system_webview_apk_target
deps += [ "//android_webview:android_webview_no_weblayer_java" ]
if (!_omit_dex) {
product_config_java_packages =
[ invoker.webview_product_config_java_package ]
}
if (!defined(alternative_android_sdk_dep)) {
alternative_android_sdk_dep = invoker.webview_framework_dep
}
# We can't include an icon for anything with the Stable channel package name
# because it confuses work profiles. We check
# use_stable_package_name_for_trichrome here instead of where
# webview_devui_show_icon is assigned to avoid a circular dependency
# between //android_webview/variables.gni and
# //chrome/android/trichrome.gni.
if (invoker.webview_devui_show_icon &&
!invoker.use_stable_package_name_for_trichrome) {
deps += [ "//android_webview/nonembedded:devui_launcher_icon_resources" ]
}
# Flag whether additional deps and libs should be included for each ABI.
_include_primary_support = false
_include_secondary_support = false
if (!_is_trichrome) {
shared_resources = true
if ((!android_64bit_target_cpu && _include_32_bit_webview) ||
(android_64bit_target_cpu && _include_64_bit_webview)) {
shared_libraries = [ "//android_webview:libwebviewchromium" ]
_include_primary_support = true
}
if (android_64bit_target_cpu && _include_32_bit_webview) {
secondary_abi_shared_libraries = [ "//android_webview:libwebviewchromium($android_secondary_abi_toolchain)" ]
_include_secondary_support = true
}
deps += [ "//third_party/icu:icu_assets" ]
} else {
app_as_shared_lib = true
# Include placeholder libraries to ensure we are treated as the desired
# architecture.
if (android_64bit_target_cpu) {
if (_is_64_bit_browser) {
native_lib_placeholders = [ "libplaceholder.so" ]
if (_include_32_bit_webview) {
secondary_abi_shared_libraries = [ "//android_webview:monochrome_64($android_secondary_abi_toolchain)" ]
_include_secondary_support = true
}
} else {
if (_include_64_bit_webview) {
shared_libraries = [ "//android_webview:monochrome" ]
_include_primary_support = true
}
secondary_native_lib_placeholders = [ "libplaceholder.so" ]
static_library_provider_use_secondary_abi = true
}
} else {
native_lib_placeholders = [ "libplaceholder.so" ]
}
}
if (defined(shared_libraries)) {
_jni_registrations = shared_libraries
} else if (defined(secondary_abi_shared_libraries)) {
_jni_registrations = secondary_abi_shared_libraries
} else if (_is_trichrome) {
# Here, the only native library present in trichrome is the one shared
# between Chrome and WebView, so we depend on it instead.
if (android_64bit_target_cpu) {
_jni_registrations = [ "//chrome/android:libmonochrome_64" ]
} else {
_jni_registrations = [ "//chrome/android:libmonochrome" ]
}
}
if (defined(_jni_registrations)) {
srcjar_deps = []
foreach(_lib, _jni_registrations) {
_label =
get_label_info(_lib, "label_no_toolchain") + "__jni_registration"
srcjar_deps += [ "$_label($default_toolchain)" ]
}
}
if (_include_primary_support) {
deps += [
"//android_webview:webview_primary_abi_assets",
"//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline",
]
loadable_modules = [ "$root_out_dir/libcrashpad_handler_trampoline.so" ]
}
if (_include_secondary_support) {
_trampoline = "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline($android_secondary_abi_toolchain)"
deps += [
"//android_webview:webview_secondary_abi_assets",
_trampoline,
]
_secondary_out_dir = get_label_info(_trampoline, "root_out_dir")
secondary_abi_loadable_modules =
[ "$_secondary_out_dir/libcrashpad_handler_trampoline.so" ]
}
aapt_locale_allowlist = platform_pak_locales
resource_exclusion_regex = common_resource_exclusion_regex
resource_exclusion_exceptions = common_resource_exclusion_exceptions
# We only optimize resources for bundles since APKs are not shipped.
# Resources only live in the base module atm as such we only need to set
# these on the base module
if (_is_bundle_module) {
# Removes metadata needed for Resources.getIdentifier("resource_name").
strip_resource_names = !is_java_debug
# Shortens resource file names in apk eg: res/drawable/button.xml -> res/a.xml
short_resource_paths = !is_java_debug
# Removes unused resources from the apk. Only enabled on official builds
# since it adds a slow step and serializes the build graph causing fewer
# expensive tasks (eg: proguarding, resource optimization) to be run in
# parallel by adding dependencies between them (adds around 10-20
# seconds on my machine).
strip_unused_resources = is_official_build
# An aapt2 config file to exempt some webview resources from resource
# optimizations.
resources_config_paths = [ "//android_webview/aapt2.config" ]
}
if (!_is_bundle_module) {
# Used as an additional apk in test scripts.
never_incremental = true
command_line_flags_file = "webview-command-line"
}
if (!is_java_debug && !_omit_dex) {
proguard_enabled = true
if (!_is_bundle_module) {
repackage_classes = "WV"
}
if (!defined(proguard_configs)) {
proguard_configs = []
}
proguard_configs +=
[ "//android_webview/nonembedded/java/proguard.flags" ]
png_to_webp = true
}
if (enable_silent_java_assert_reporting && !_omit_dex) {
custom_assertion_handler = crash_reporting_assertion_handler
}
version_name = chrome_version_name
version_code = _version_code
}
}