blob: 7c94586c567c767f2b92c7ccc5a31fe79b23062f [file] [log] [blame]
# Copyright 2015 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.
import("//android_webview/variables.gni")
import("//base/android/linker/config.gni")
import("//base/android/proguard/proguard.gni")
import("//build/config/android/extract_unwind_tables.gni")
import("//build/config/android/rules.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/locales.gni")
import("//build/util/version.gni")
import("//chrome/android/chrome_common_shared_library.gni")
import("//chrome/common/features.gni")
import("//device/vr/buildflags/buildflags.gni")
import("channel.gni")
declare_args() {
# Enable multidex in release builds.
multidex_in_release = false
# Experimental only. Causes .dex files to be store in the APK uncompressed.
# Only affects monochrome_public_apk and trichrome_chrome_apk.
use_uncompressed_dex = false
}
default_chrome_public_jinja_variables = [
"channel=$android_channel",
"enable_vr=$enable_vr",
"include_arcore_manifest_flag=false",
"notouch_build=$notouch_build",
]
# Enable stack unwinding only on official build with specific channels. It is
# not enabled on non-official builds to not affect build time for developers.
# The unwind file is ~2MB in apk, which is fine for Canary.
_add_unwind_tables_in_chrome_32bit_apk =
is_official_build && (target_cpu == "arm" || target_cpu == "arm64") &&
(android_channel == "default" || android_channel == "canary" ||
android_channel == "dev")
# A template used to declare any target that will implement a full Chromium
# or Chrome application, either as an APK, or an app bundle module.
#
# Variables:
# target_type: Either 'android_apk' or 'android_app_bundle_module'.
# apk_name: For APK target types, the final APK name without a suffix.
# module_name: For bundle module target types, the module's name without a
# suffix.
# is_base_module: For bundle module target types, true iff this is a base
# application module, instead of a feature module.
# android_manifest: Application manifest path.
# android_manifest_dep: Name of target generating the android_manifest.
# shared_libraries: List of native shared libraries targets to include in
# the final target (e.g. [ ":libchrome" ]).
# add_unwind_tables_in_apk: Optional. If true, add the unwind tables to the
# final APK or bundle.
# is_modern: If true, indicates this corresponds to a chrome_modern_XXX
# target that can only run on Android L-M.
# is_monochrome: Indicates that this target contains chrome and webview
# packaged together and can only run on Android N+.
# is_trichrome: Indicates this target relies on a trichrome static library
# target and can only run on Android P+.
# png_to_webp: Optional. If true, convert image resources to webp format.
# requires Android K+, since these were not supported by Android properly
# before 4.3.0.
# load_library_from_apk: Optional. If true, native libraries will be loaded
# directly from the APK (and stored zipaligned and uncompressed). This
# requires either the Chromium linker, or Android M+.
# version_name: Application version name (e.g. "Developer Build").
#
# Plus all other variables accepted by android_apk() or
# android_app_bundle_module(), depending on the target type.
#
template("chrome_public_common_apk_or_module_tmpl") {
assert(
invoker.target_type == "android_apk" ||
invoker.target_type == "android_app_bundle_module" ||
invoker.target_type == "instrumentation_test_apk",
"Invalid target_type definition, should be 'android_apk' or 'android_app_bundle_module'")
_is_modern = defined(invoker.is_modern) && invoker.is_modern
_is_monochrome = defined(invoker.is_monochrome) && invoker.is_monochrome
_is_trichrome = defined(invoker.is_trichrome) && invoker.is_trichrome
assert(_is_modern || !_is_modern) # Mark as used.
assert(!(_is_monochrome && _is_trichrome),
"Cannot be both trichrome and monochrome!")
# Adds unwind table asset to the chrome apk for the given library target. This
# is not part of generic apk assets target since it depends on the main shared
# library of the apk, to extract unwind tables.
if (defined(invoker.add_unwind_tables_in_apk)) {
_add_unwind_tables = invoker.add_unwind_tables_in_apk
} else {
_needs_32bit_lib =
target_cpu == "arm" ||
(_is_monochrome && target_cpu == "arm64" && build_apk_secondary_abi)
_add_unwind_tables =
_needs_32bit_lib && _add_unwind_tables_in_chrome_32bit_apk &&
defined(invoker.shared_libraries)
}
if (_add_unwind_tables) {
_unwind_asset_target = "${target_name}__unwind_assets"
unwind_table_asset(_unwind_asset_target) {
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
if (defined(invoker.shared_library_for_unwind_asset)) {
library_target = invoker.shared_library_for_unwind_asset
} else {
library_target = "chrome"
}
deps = invoker.shared_libraries
if (build_apk_secondary_abi && defined(android_secondary_abi_cpu)) {
deps += [ "//chrome/android:lib${library_target}($android_secondary_abi_toolchain)" ]
}
}
} else if (defined(invoker.shared_library_for_unwind_asset)) {
not_needed(invoker, [ "shared_library_for_unwind_asset" ])
}
if (!defined(invoker.target_type)) {
_target_type = "android_apk"
} else {
_target_type = invoker.target_type
}
if (defined(invoker.enable_multidex)) {
_enable_multidex = invoker.enable_multidex
} else {
_enable_multidex = is_java_debug || multidex_in_release
}
target(_target_type, target_name) {
forward_variables_from(invoker, "*")
if (_is_trichrome) {
# TODO(torne): make minsdk=Q once we no longer build hacky P version
min_sdk_version = android_sdk_version
} else if (_is_monochrome) {
min_sdk_version = 24
} else if (_is_modern) {
min_sdk_version = 21
} else {
min_sdk_version = 19
}
target_sdk_version = android_sdk_version
# Match drawables, but not mipmaps.
resource_blacklist_regex = "drawable[^/]*-xxxhdpi"
if (min_sdk_version >= 21) {
# Resources used by AndroidManifest.xml only for pre-21.
resource_blacklist_regex += "|app_single_page_icon"
}
# Exception rationale in https://crbug.com/691733.
resource_blacklist_exceptions = [
"*shadow*", # Combination of gradient & transparency cause pixelation.
"*.9.*", # Most nine-patches contain shadows.
"*ic_file_download_white*", # Bottom edge seems misaligned.
"*ic_lock.*", # Bottom edge seems misaligned.
"*ic_group_*", # Appear only in xxxhdpi.
]
if (!_is_monochrome) {
locale_config_java_packages = [ "org.chromium.chrome.browser" ]
}
# Use zh-TW strings for zh-HK (https://crbug.com/780847).
if (!defined(support_zh_hk)) {
support_zh_hk = true
}
strip_resource_names = !is_java_debug
# TODO(753402): enable once aapt2>=3.6.0 and bundletool>0.9.0 are rolled in.
short_resource_paths = false
if (defined(shared_libraries) && shared_libraries != []) {
_native_lib_file =
rebase_path("$root_gen_dir/CHROME_VERSION.json", root_out_dir)
native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
native_lib_version_rule = "//build/util:chrome_version_json"
}
if (!defined(aapt_locale_whitelist)) {
if (target_type == "android_apk") {
# For APKs, do not include the resource strings files from our
# omitted locale list in order to save size.
aapt_locale_whitelist = locales - android_chrome_omitted_locales
} else {
# For bundles, only include resource strings files from our full
# locale list, but nothing more.
aapt_locale_whitelist = locales
}
}
if (!_is_monochrome && !_is_trichrome) {
deps += [
"//chrome/android:chrome_public_v8_assets",
"//components/crash/content/app:chrome_crashpad_handler_named_as_so",
"//third_party/icu:icu_assets",
]
if (!defined(loadable_modules)) {
loadable_modules = []
}
loadable_modules += [ "$root_out_dir/libchrome_crashpad_handler.so" ]
}
if (_enable_multidex) {
enable_multidex = true
if (_target_type == "android_apk") {
if (!defined(negative_main_dex_globs)) {
negative_main_dex_globs = [
"*ApplicationStatus*", # Doesn't work in non-browser process.
"*ChromeActivity*", # Pulls in the world, so ensure it doesn't slip in.
"*GoogleApiAvailability*", # Play Services only in browser process.
"*R\$*", # Should not use resources from non-browser process.
]
}
# Allow targets to append to the default list.
if (defined(extra_negative_main_dex_globs)) {
negative_main_dex_globs += extra_negative_main_dex_globs
}
}
}
# Only bundles can install modules. Therefore, include stub implementation
# for all other targets to save some binary size.
if (_target_type == "android_app_bundle_module") {
deps +=
[ "//components/module_installer/android:module_installer_impl_java" ]
} else {
deps +=
[ "//components/module_installer/android:module_installer_stub_java" ]
}
if (!is_java_debug) {
proguard_enabled = true
if (!defined(proguard_configs)) {
proguard_configs = []
}
proguard_configs += [
"//chrome/android/java/proguard.flags",
"//base/android/proguard/chromium_apk.flags",
"//base/android/proguard/chromium_code.flags",
]
if (enable_proguard_obfuscation) {
proguard_configs +=
[ "//base/android/proguard/enable_obfuscation.flags" ]
} else {
proguard_configs +=
[ "//base/android/proguard/disable_all_obfuscation.flags" ]
}
}
if (!defined(use_chromium_linker)) {
use_chromium_linker = chromium_linker_supported
}
if (use_chromium_linker) {
if (!defined(load_library_from_apk)) {
# Whether native libraries should be loaded from within the apk.
# Only attempt loading the library from the APK for 64 bit devices
# until the number of 32 bit devices which don't support this
# approach falls to a minimal level - http://crbug.com/390618.
load_library_from_apk = chromium_linker_supported &&
(current_cpu == "arm64" || current_cpu == "x64")
}
}
if (_target_type == "android_apk") {
command_line_flags_file = "chrome-command-line"
} else {
deps += [ "//chrome/android:bundle_canary_java" ]
}
if (!_is_trichrome) {
product_version_resources_dep =
"//chrome/android:product_version_resources"
}
if (defined(_unwind_asset_target)) {
deps += [ ":$_unwind_asset_target" ]
}
deps += [ "//chrome/android:chrome_all_java" ]
if (!defined(version_code)) {
if (_is_trichrome) {
version_code = trichrome_version_code
} else if (_is_monochrome) {
version_code = monochrome_version_code
} else if (_is_modern) {
version_code = chrome_modern_version_code
} else {
# For chrome without the modern design, used on pre-L devices
version_code = chrome_version_code
}
}
}
}
# The equivalent of chrome_common_apk_or_module_tmpl for all builds of
# monochrome and trichrome chrome.
# Variables:
# use_trichrome_library: Specifies that this target depends on a trichrome
# static library target to provide certain shared library deps, and that
# this target should not package webview deps.
template("monochrome_public_common_apk_or_module_tmpl") {
if (defined(invoker.enable_multidex)) {
_enable_multidex = invoker.enable_multidex
} else {
_enable_multidex = is_java_debug || multidex_in_release
}
chrome_public_common_apk_or_module_tmpl(target_name) {
forward_variables_from(invoker,
[
"version_code",
"verify_manifest",
])
is_trichrome =
defined(invoker.use_trichrome_library) && invoker.use_trichrome_library
is_monochrome = !is_trichrome
loadable_modules = []
secondary_abi_loadable_modules = []
_deps = [
"//components/crash/android:handler_java",
"//chrome/android:chrome_public_non_pak_assets",
]
if (is_monochrome) {
locale_config_java_packages = [
"org.chromium.chrome.browser",
webview_locale_config_java_package,
]
if (android_64bit_target_cpu) {
# Build //android_webview:monochrome with the opposite bitness that
# Chrome runs in.
if (defined(invoker.is_64_bit_browser) && invoker.is_64_bit_browser) {
shared_libraries = [ "//chrome/android:libmonochrome_64" ]
if (build_apk_secondary_abi && invoker.include_32_bit_webview) {
secondary_abi_shared_libraries = [ "//android_webview:monochrome_64($android_secondary_abi_toolchain)" ]
}
} else {
shared_libraries = [ "//android_webview:monochrome" ]
if (build_apk_secondary_abi) {
secondary_abi_shared_libraries =
[ "//chrome/android:monochrome_secondary_abi_lib" ]
}
}
} else {
shared_libraries = [ "//chrome/android:libmonochrome" ]
}
shared_library_for_unwind_asset = "monochrome"
_deps += [
"//android_webview:monochrome_webview_assets",
"//android_webview/apk:apk_java",
"//android_webview/glue",
"//chrome/android:monochrome_java",
"//chrome/android/monochrome:monochrome_license_provider_java",
"//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline",
]
loadable_modules += [ "$root_out_dir/libcrashpad_handler_trampoline.so" ]
if (android_64bit_target_cpu && build_apk_secondary_abi &&
(!defined(invoker.is_64_bit_browser) || !invoker.is_64_bit_browser ||
invoker.include_32_bit_webview)) {
_trampoline = "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline($android_secondary_abi_toolchain)"
_deps += [ _trampoline ]
_secondary_out_dir = get_label_info(_trampoline, "root_out_dir")
secondary_abi_loadable_modules +=
[ "$_secondary_out_dir/libcrashpad_handler_trampoline.so" ]
}
alternative_android_sdk_dep = webview_framework_dep
app_as_shared_lib = true
_pak_prefix = "monochrome"
}
if (is_trichrome) {
if (!trichrome_shared_assets) {
_deps += [ "//android_webview:monochrome_webview_assets" ]
}
# Include placeholder libraries to make Chrome multiarch in the same way
# as Monochrome, even though Chrome only runs with one of the two
# bitnesses. This allows the "32-bit" and "64-bit" versions of Chrome to
# depend on their respective versions of the shared library APK even
# though they're functionally the same.
native_lib_placeholders = [ "libdummy.so" ]
if (android_64bit_target_cpu && build_apk_secondary_abi &&
(!defined(invoker.is_64_bit_browser) || !invoker.is_64_bit_browser ||
invoker.include_32_bit_webview)) {
secondary_native_lib_placeholders = [ "libdummy.so" ]
}
_pak_prefix = "trichrome_chrome"
}
use_chromium_linker = false
# Resources config for blocklisting resource names from obfuscation
resources_config_path = "//android_webview/aapt2.config"
if (!defined(invoker.target_type) || invoker.target_type == "android_apk") {
# Incremental install doesn't work for monochrome. See crbug.com/663492.
never_incremental = true
uncompress_dex = use_uncompressed_dex
}
# Strip xml namespaces for monochrome. This should only be done for apks
# targeting API > 21 which for chrome is only Monochrome. This is due to
# how android public and private resource ids are namespaced.
no_xml_namespaces = true
# Configrations to make android load shared library from APK.
uncompress_shared_libraries = true
forward_variables_from(invoker,
"*",
[
"include_32_bit_webview",
"is_64_bit_browser",
])
# Android N+ better supports multiple locales (https://crbug.com/780847).
support_zh_hk = false
_deps += [ "//chrome/android:${_pak_prefix}_apk_pak_assets" ]
if (_enable_multidex && invoker.target_type == "android_apk" &&
!defined(invoker.negative_main_dex_globs)) {
# WebView pulls play services into the main dex.
negative_main_dex_globs = [
# TODO(agrieve): Add ApplicationStatus to this list. It's currently
# included because of ActivityWindowAndroid, but is never used at
# runtime by webview.
"*ChromeActivity*", # Pulls in the world, so ensure it doesn't slip in.
]
}
if (!is_java_debug) {
if (!defined(proguard_configs)) {
proguard_configs = []
}
if (is_monochrome) {
proguard_configs += [ "//android_webview/apk/java/proguard.flags" ]
}
png_to_webp = true
}
if (!defined(deps)) {
deps = []
}
deps += _deps
}
}