diff --git a/rules/aar_import/attrs.bzl b/rules/aar_import/attrs.bzl index c8b265943..111b91a92 100644 --- a/rules/aar_import/attrs.bzl +++ b/rules/aar_import/attrs.bzl @@ -53,7 +53,7 @@ ATTRS = _attrs.add( "This needs to be the same value as the manifest's package.", ), srcjar = attr.label( - allow_single_file = [".srcjar"], + allow_single_file = ["sources.jar", ".srcjar"], doc = "A srcjar file that contains the source code for the JVM " + "artifacts stored within the AAR.", ), diff --git a/rules/aar_import/impl.bzl b/rules/aar_import/impl.bzl index c80d6182d..76426ba3e 100644 --- a/rules/aar_import/impl.bzl +++ b/rules/aar_import/impl.bzl @@ -28,6 +28,7 @@ load( _java = "java", ) load("//rules:providers.bzl", "AndroidLintRulesInfo") +load("//rules/flags:flags.bzl", _flags = "flags") load( "//rules:resources.bzl", _resources = "resources", @@ -154,7 +155,10 @@ def _process_resources( deps = ctx.attr.deps, exports = ctx.attr.exports, exports_manifest = getattr(ctx.attr, "exports_manifest", True), - propagate_resources = _acls.in_aar_propagate_resources(str(ctx.label)), + propagate_resources = True, + namespaced_r_class = False, + output_library_merged_assets = _flags.get(ctx).output_library_merged_assets, + merge_manifest_permissions = _flags.get(ctx).merge_manifest_permissions, # Tool and Processing related inputs aapt = _get_android_toolchain(ctx).aapt2.files_to_run, @@ -165,6 +169,7 @@ def _process_resources( host_javabase = _common.get_host_javabase(ctx), instrument_xslt = _utils.only(_get_android_toolchain(ctx).add_g3itr_xslt.files.to_list()), xsltproc = _get_android_toolchain(ctx).xsltproc_tool.files_to_run, + link_library_resources = True, ) native_android_manifest = manifest @@ -176,7 +181,6 @@ def _process_resources( """ % package) - return struct(**resources_ctx) def _extract_jars( @@ -350,7 +354,7 @@ def _process_jars( ), source_jar = source_jar, neverlink = False, - deps = r_java_info + java_infos, # TODO(djwhang): Exports are not deps. + deps = java_infos, # TODO(djwhang): Exports are not deps. exports = (r_java_info if _acls.in_aar_import_exports_r_java(str(ctx.label)) else []) + java_infos, # TODO(djwhang): Deps are not exports. @@ -501,8 +505,7 @@ def impl(ctx): r_java = resources_ctx.r_java, exports = _utils.collect_providers(JavaInfo, ctx.attr.exports), enable_desugar_java8 = ctx.fragments.android.desugar_java8, - enable_imports_deps_check = - _acls.in_aar_import_deps_checker(str(ctx.label)), + enable_imports_deps_check = False, aar_embedded_jars_extractor_tool = _get_android_toolchain(ctx).aar_embedded_jars_extractor.files_to_run, bootclasspath = @@ -559,14 +562,6 @@ def impl(ctx): ) providers.extend(lint_providers) - validation_outputs.append(_validate_rule( - ctx, - aar = aar, - package = package, - manifest = manifest_ctx.processed_manifest, - checks = _get_android_toolchain(ctx).aar_import_checks.files_to_run, - )) - providers.append( intellij.make_android_ide_info( ctx, diff --git a/rules/aar_import/rule.bzl b/rules/aar_import/rule.bzl index df5c6ebcd..5e6302412 100644 --- a/rules/aar_import/rule.bzl +++ b/rules/aar_import/rule.bzl @@ -16,6 +16,10 @@ load(":attrs.bzl", _ATTRS = "ATTRS") load(":impl.bzl", _impl = "impl") +load( + "//rules:providers.bzl", + "StarlarkAndroidResourcesInfo", +) RULE_DOC = """ #### Examples @@ -49,6 +53,7 @@ aar_import = rule( AndroidLibraryResourceClassJarProvider, AndroidNativeLibsInfo, JavaInfo, + StarlarkAndroidResourcesInfo, ], toolchains = [ "//toolchains/android:toolchain_type", diff --git a/rules/acls/min_sdk_floors.bzl b/rules/acls/min_sdk_floors.bzl index 4dfe04412..27962f92b 100644 --- a/rules/acls/min_sdk_floors.bzl +++ b/rules/acls/min_sdk_floors.bzl @@ -20,9 +20,7 @@ cover the entire depot. MIN_SDK_FLOORS = { 19: [ - "//:__subpackages__", ], 14: [ - "//:__subpackages__", ], } diff --git a/rules/android_application/android_application_rule.bzl b/rules/android_application/android_application_rule.bzl index d7c15c2dd..d9b4dd4bb 100644 --- a/rules/android_application/android_application_rule.bzl +++ b/rules/android_application/android_application_rule.bzl @@ -164,7 +164,6 @@ def _create_feature_manifest( args.add(java_package) args.add(info.feature_name) args.add(info.title_id) - args.add(info.fused) args.add(aapt2.executable) ctx.actions.run( @@ -369,7 +368,6 @@ def android_application_macro(_android_binary, **attrs): # Create an android_binary base split, plus an android_application to produce the aab name = attrs.pop("name") - base_split_name = "%s_base" % name # default to [] if feature_modules = None is passed feature_modules = attrs.pop("feature_modules", []) or [] @@ -387,13 +385,13 @@ def android_application_macro(_android_binary, **attrs): attrs["deps"].append(str(module_targets.title_lib)) _android_binary( - name = base_split_name, + name = name, **attrs ) android_application( - name = name, - base_module = ":%s" % base_split_name, + name = "%s_aab" % name, + base_module = ":%s" % name, bundle_config_file = bundle_config_file, app_integrity_config = app_integrity_config, rotation_config = rotation_config, diff --git a/rules/android_application/android_feature_module_rule.bzl b/rules/android_application/android_feature_module_rule.bzl index 439548bce..9b702bb10 100644 --- a/rules/android_application/android_feature_module_rule.bzl +++ b/rules/android_application/android_feature_module_rule.bzl @@ -65,7 +65,6 @@ def _impl(ctx): title_id = ctx.attr.title_id, title_lib = ctx.attr.title_lib, feature_name = ctx.attr.feature_name, - fused = ctx.attr.fused, manifest = ctx.file.manifest, ), OutputGroupInfo(_validation = depset([validation])), @@ -115,9 +114,6 @@ def android_feature_module_macro(_android_binary, _android_library, **attrs): if not getattr(attrs, attr, None): fail("%s missing required attr <%s>" % (fqn, attr)) - if hasattr(attrs, "fused") and hasattr(attrs, "manifest"): - fail("%s cannot specify and . Prefer ") - targets = get_feature_module_paths(fqn) tags = getattr(attrs, "tags", []) @@ -193,7 +189,6 @@ EOF title_id = title_id, title_lib = str(targets.title_lib), feature_name = getattr(attrs, "feature_name", attrs.name), - fused = getattr(attrs, "fused", True), manifest = getattr(attrs, "manifest", None), tags = tags, transitive_configs = transitive_configs, diff --git a/rules/android_application/attrs.bzl b/rules/android_application/attrs.bzl index 55864c2a4..bf886e07e 100644 --- a/rules/android_application/attrs.bzl +++ b/rules/android_application/attrs.bzl @@ -48,7 +48,7 @@ ANDROID_APPLICATION_ATTRS = _attrs.add( ), _bundle_keystore_properties = attr.label( allow_single_file = True, - default = "//rules:bundle_keystore_properties.tmpl", + default = None, ), _feature_manifest_script = attr.label( allow_single_file = True, diff --git a/rules/android_application/gen_android_feature_manifest.sh b/rules/android_application/gen_android_feature_manifest.sh index 5b5552e0e..23ac14739 100644 --- a/rules/android_application/gen_android_feature_manifest.sh +++ b/rules/android_application/gen_android_feature_manifest.sh @@ -18,7 +18,6 @@ base_apk="${2}" package="${3}" split="${4}" title_id="${5}" -fused="${6}" aapt="${7}" aapt_cmd="$aapt dump xmltree $base_apk --file AndroidManifest.xml" @@ -41,7 +40,6 @@ cat >$out_manifest < - diff --git a/rules/android_binary_internal/impl.bzl b/rules/android_binary_internal/impl.bzl index 2a005d8b5..c9274aa12 100644 --- a/rules/android_binary_internal/impl.bzl +++ b/rules/android_binary_internal/impl.bzl @@ -792,5 +792,5 @@ def impl(ctx): Returns: A list of providers. """ - java_package = java.resolve_package_from_label(ctx.label, ctx.attr.custom_package) + java_package = ctx.attr.custom_package if ctx.attr.custom_package else None return processing_pipeline.run(ctx, java_package, _PROCESSING_PIPELINE) diff --git a/rules/android_binary_internal/r8.bzl b/rules/android_binary_internal/r8.bzl index 0ace5492c..a94580b07 100644 --- a/rules/android_binary_internal/r8.bzl +++ b/rules/android_binary_internal/r8.bzl @@ -74,11 +74,13 @@ def process_r8(ctx, jvm_ctx, packaged_resources_ctx, build_info_ctx, **_unused_c android_jar = get_android_sdk(ctx).android_jar proguard_specs = proguard.get_proguard_specs(ctx, packaged_resources_ctx.resource_proguard_config) min_sdk_version = getattr(ctx.attr, "min_sdk_version", None) + proguard_mappings_file = ctx.actions.declare_file(ctx.label.name + "_proguard.map") args = ctx.actions.args() args.add("--release") if min_sdk_version: args.add("--min-api", min_sdk_version) + args.add("--pg-map-output", proguard_mappings_file) args.add("--output", dexes_zip) args.add_all(proguard_specs, before_each = "--pg-conf") args.add("--lib", android_jar) @@ -90,9 +92,9 @@ def process_r8(ctx, jvm_ctx, packaged_resources_ctx, build_info_ctx, **_unused_c executable = get_android_toolchain(ctx).r8.files_to_run, arguments = [args], inputs = [android_jar, deploy_jar] + proguard_specs, - outputs = [dexes_zip], + outputs = [dexes_zip, proguard_mappings_file], mnemonic = "AndroidR8", - jvm_flags = ["-Xmx8G"], + jvm_flags = ["-Xmx10G", "-XX:ThreadStackSize=2048"], progress_message = "R8 Optimizing, Desugaring, and Dexing %{label}", ) @@ -108,6 +110,7 @@ def process_r8(ctx, jvm_ctx, packaged_resources_ctx, build_info_ctx, **_unused_c name = "r8_ctx", value = struct( final_classes_dex_zip = dexes_zip, + proguard_mappings_file = proguard_mappings_file, providers = [android_dex_info], ), ) diff --git a/rules/android_binary_internal/rule.bzl b/rules/android_binary_internal/rule.bzl index 39f498c38..767a6efd0 100644 --- a/rules/android_binary_internal/rule.bzl +++ b/rules/android_binary_internal/rule.bzl @@ -29,7 +29,8 @@ def make_rule( attrs = ATTRS, implementation = impl, provides = _DEFAULT_PROVIDES, - additional_toolchains = []): + additional_toolchains = [], + additional_providers = []): """Makes the rule. Args: @@ -37,6 +38,7 @@ def make_rule( implementation: A function. The rule's implementation method. provides: A list. The providers that the rule must provide. additional_toolchains: A list. Additional toolchains passed to pass to rule(toolchains). + additional_providers: A list. Additional providers passed to pass to rule(providers). Returns: A rule. @@ -44,7 +46,7 @@ def make_rule( return rule( attrs = attrs, implementation = implementation, - provides = provides, + provides = provides + additional_providers, toolchains = [ "//toolchains/android:toolchain_type", "//toolchains/android_sdk:toolchain_type", diff --git a/rules/android_library/impl.bzl b/rules/android_library/impl.bzl index 6ccc5a5dd..7ce8402ab 100644 --- a/rules/android_library/impl.bzl +++ b/rules/android_library/impl.bzl @@ -175,8 +175,11 @@ def _process_resources(ctx, java_package, manifest_ctx, **unused_ctxs): enable_res_v3 = _flags.get(ctx).android_enable_res_v3, # TODO(b/144163743): remove fix_resource_transitivity, which was only added to emulate # misbehavior on the Java side. - fix_resource_transitivity = bool(ctx.attr.srcs), + fix_resource_transitivity = True, fix_export_exporting = acls.in_fix_export_exporting_rollout(str(ctx.label)), + namespaced_r_class = _flags.get(ctx).namespaced_r_class, + output_library_merged_assets = _flags.get(ctx).output_library_merged_assets, + merge_manifest_permissions = _flags.get(ctx).merge_manifest_permissions, # Tool and Processing related inputs aapt = get_android_toolchain(ctx).aapt2.files_to_run, @@ -194,6 +197,7 @@ def _process_resources(ctx, java_package, manifest_ctx, **unused_ctxs): ), xsltproc = get_android_toolchain(ctx).xsltproc_tool.files_to_run, zip_tool = get_android_toolchain(ctx).zip_tool.files_to_run, + link_library_resources = _flags.get(ctx).link_library_resources, ) # TODO(b/139305816): Remove the ability for android_library to be added in @@ -584,5 +588,5 @@ def impl(ctx): Returns: A legacy struct provider. """ - java_package = _java.resolve_package_from_label(ctx.label, ctx.attr.custom_package) + java_package = ctx.attr.custom_package if ctx.attr.custom_package else None return processing_pipeline.run(ctx, java_package, _PROCESSING_PIPELINE) diff --git a/rules/android_library/rule.bzl b/rules/android_library/rule.bzl index e36bdd3b0..789015a70 100644 --- a/rules/android_library/rule.bzl +++ b/rules/android_library/rule.bzl @@ -128,7 +128,6 @@ def _outputs(name, _package_name, _defined_local_resources): path_prefix = "" outputs.update( dict( - resources_src_jar = path_prefix + "%{name}.srcjar", resources_txt = path_prefix + "%{name}_symbols/R.txt", resources_jar = path_prefix + "%{name}_resources.jar", ), @@ -140,7 +139,8 @@ def make_rule( attrs = _ATTRS, implementation = _impl, outputs = _outputs, - additional_toolchains = []): + additional_toolchains = [], + additional_providers = []): """Makes the rule. Args: @@ -148,6 +148,7 @@ def make_rule( implementation: A function. The rule's implementation method. outputs: A dict, function, or None. The rule's outputs. additional_toolchains: A list. Additional toolchains passed to pass to rule(toolchains). + additional_providers: A list. Additional providers passed to pass to rule(providers). Returns: A rule. @@ -167,7 +168,7 @@ def make_rule( AndroidLibraryResourceClassJarProvider, AndroidNativeLibsInfo, JavaInfo, - ], + ] + additional_providers, outputs = outputs, toolchains = [ "//toolchains/android:toolchain_type", diff --git a/rules/android_local_test.bzl b/rules/android_local_test/android_local_test.bzl similarity index 100% rename from rules/android_local_test.bzl rename to rules/android_local_test/android_local_test.bzl diff --git a/rules/android_local_test/resources.bzl b/rules/android_local_test/resources.bzl new file mode 100644 index 000000000..e36f0d2d7 --- /dev/null +++ b/rules/android_local_test/resources.bzl @@ -0,0 +1,81 @@ +# Copyright 2020 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Implementation.""" + +load("//rules:acls.bzl", "acls") +load( + "//rules:processing_pipeline.bzl", + "ProviderInfo", + "processing_pipeline", +) +load("//rules:resources.bzl", _resources = "resources") +load("//rules:utils.bzl", "compilation_mode", "get_android_toolchain", "utils") +load("//rules:attrs.bzl", _attrs = "attrs") + +def _process_manifest(ctx, **unused_ctxs): + manifest_ctx = _resources.bump_min_sdk( + ctx, + manifest = ctx.file.manifest, + floor = _resources.DEPOT_MIN_SDK_FLOOR if (_is_test_binary(ctx) and acls.in_enforce_min_sdk_floor_rollout(str(ctx.label))) else 0, + enforce_min_sdk_floor_tool = get_android_toolchain(ctx).enforce_min_sdk_floor_tool.files_to_run, + ) + + return ProviderInfo( + name = "manifest_ctx", + value = manifest_ctx, + ) + +def _process_resources_for_android_local_test(ctx, manifest_ctx, java_package, **unused_ctx): + packaged_resources_ctx = _resources.package( + ctx, + resource_files = ctx.files.resource_files, + assets = ctx.files.assets, + assets_dir = ctx.attr.assets_dir, + resource_configs = ctx.attr.resource_configuration_filters, + densities = ctx.attr.densities, + nocompress_extensions = ctx.attr.nocompress_extensions, + compilation_mode = compilation_mode.get(ctx), + shrink_resources = _attrs.tristate.no, + manifest = manifest_ctx.processed_manifest, + manifest_values = utils.expand_make_vars(ctx, ctx.attr.manifest_values), + java_package = java_package, + use_legacy_manifest_merger = False, + should_throw_on_conflict = not acls.in_allow_resource_conflicts(str(ctx.label)), + deps = ctx.attr.deps + ctx.attr.associates, + aapt = get_android_toolchain(ctx).aapt2.files_to_run, + android_jar = ctx.attr._android_sdk[AndroidSdkInfo].android_jar, + busybox = get_android_toolchain(ctx).android_resources_busybox.files_to_run, + host_javabase = ctx.attr._host_javabase, + ) + return ProviderInfo( + name = "packaged_resources_ctx", + value = packaged_resources_ctx, + ) + +def _is_test_binary(ctx): + """Whether this android_binary target is a test binary. + + Args: + ctx: The context. + + Returns: + Boolean indicating whether the target is a test target. + """ + return ctx.attr.testonly or ctx.attr.instruments or str(ctx.label).find("/javatests/") >= 0 + +PROCESSORS = dict( + ManifestProcessor = _process_manifest, + ResourceProcessor = _process_resources_for_android_local_test, +) diff --git a/rules/busybox.bzl b/rules/busybox.bzl index bcbb88053..a7c8e1c0a 100644 --- a/rules/busybox.bzl +++ b/rules/busybox.bzl @@ -118,6 +118,10 @@ def _make_resources_flag( ], ) +def _disable_warnings(args): + # Disable warnings - this are output to stdin/stderr which breaks worker mode + args.add("--logWarnings=false") + def _path(f): return f.path @@ -283,7 +287,8 @@ def _package( transitive_input_files = [] args = ctx.actions.args() - args.use_param_file("@%s") + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "AAPT2_PACKAGE") args.add("--") args.add("--aapt2", aapt.executable) @@ -390,6 +395,8 @@ def _package( if java_package: args.add("--packageForR", java_package) + _disable_warnings(args) + args.add_joined( "--resourceApks", resource_apks, @@ -401,12 +408,14 @@ def _package( ctx = ctx, host_javabase = host_javabase, executable = busybox, - tools = [aapt], + tools = [aapt, busybox], arguments = [args], inputs = depset(input_files, transitive = transitive_input_files), outputs = output_files, mnemonic = "PackageAndroidResources", progress_message = "Packaging Android Resources in %s" % ctx.label, + supports_workers = True, + supports_multiplex_workers = True, ) def _parse( @@ -427,7 +436,8 @@ def _parse( host_javabase: Target. The host javabase. """ args = ctx.actions.args() - args.use_param_file("@%s") + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "PARSE") args.add("--") args.add( @@ -439,6 +449,8 @@ def _parse( ) args.add("--output", out_symbols) + _disable_warnings(args) + _java.run( ctx = ctx, host_javabase = host_javabase, @@ -448,6 +460,8 @@ def _parse( outputs = [out_symbols], mnemonic = "ParseAndroidResources", progress_message = "Parsing Android Resources in %s" % out_symbols.short_path, + supports_workers = True, + supports_multiplex_workers = True, ) def _make_merge_assets_flags(resources_node): @@ -493,7 +507,8 @@ def _merge_assets( host_javabase: Target. The host javabase. """ args = ctx.actions.args() - args.use_param_file("@%s") + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "MERGE_ASSETS") args.add("--") args.add("--assetsOutput", out_assets_zip) @@ -519,10 +534,13 @@ def _merge_assets( join_with = "&", ) + _disable_warnings(args) + _java.run( ctx = ctx, host_javabase = host_javabase, executable = busybox, + tools = [busybox], arguments = [args], inputs = depset( assets + [symbols], @@ -532,6 +550,8 @@ def _merge_assets( mnemonic = "MergeAndroidAssets", progress_message = "Merging Android Assets in %s" % out_assets_zip.short_path, + supports_workers = True, + supports_multiplex_workers = True, ) def _validate_and_link( @@ -573,7 +593,8 @@ def _validate_and_link( # Retrieves the list of files at runtime when a directory is passed. args = ctx.actions.args() - args.use_param_file("@%s") + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "LINK_STATIC_LIBRARY") args.add("--") args.add("--aapt2", aapt.executable) @@ -604,6 +625,8 @@ def _validate_and_link( ) input_files.extend(resource_apks) + _disable_warnings(args) + _java.run( ctx = ctx, host_javabase = host_javabase, @@ -615,16 +638,22 @@ def _validate_and_link( mnemonic = "LinkAndroidResources", progress_message = "Linking Android Resources in " + out_file.short_path, + supports_workers = True, + supports_multiplex_workers = True, ) def _compile( ctx, out_file = None, + out_class_jar = None, + out_r_txt = None, + manifest = None, assets = [], assets_dir = None, resource_files = [], busybox = None, aapt = None, + android_jar = None, host_javabase = None): """Compile and store resources in a single archive. @@ -644,7 +673,8 @@ def _compile( # Retrieves the list of files at runtime when a directory is passed. args = ctx.actions.args() - args.use_param_file("@%s") + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "COMPILE_LIBRARY_RESOURCES") args.add("--") args.add("--aapt2", aapt.executable) @@ -658,16 +688,37 @@ def _compile( ) args.add("--output", out_file) + optional_outputs = [] + if out_class_jar: + args.add("--classJarOutput", out_class_jar) + optional_outputs.append(out_class_jar) + if out_r_txt: + args.add("--rTxtOut", out_r_txt) + optional_outputs.append(out_r_txt) + + args.add("--targetLabel", ctx.label) + optional_inputs = [] + if manifest: + args.add("--manifest", manifest) + optional_inputs = [manifest] + if android_jar: + args.add("--androidJar", android_jar) + optional_inputs.append(android_jar) + + _disable_warnings(args) + _java.run( ctx = ctx, host_javabase = host_javabase, executable = busybox, tools = [aapt], arguments = [args], - inputs = resource_files + assets, - outputs = [out_file], + inputs = resource_files + assets + optional_inputs, + outputs = [out_file] + optional_outputs, mnemonic = "CompileAndroidResources", progress_message = "Compiling Android Resources in %s" % out_file.short_path, + supports_workers = True, + supports_multiplex_workers = True, ) def _make_merge_compiled_flags(resources_node_info): @@ -720,7 +771,8 @@ def _merge_compiled( transitive_input_files = [] args = ctx.actions.args() - args.use_param_file("@%s") + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "MERGE_COMPILED") args.add("--") args.add("--classJarOutput", out_class_jar) @@ -759,16 +811,21 @@ def _merge_compiled( ) transitive_input_files.append(transitive_compiled_resources) + _disable_warnings(args) + _java.run( ctx = ctx, host_javabase = host_javabase, executable = busybox, + tools = [busybox], arguments = [args], inputs = depset(input_files, transitive = transitive_input_files), outputs = output_files, mnemonic = "StarlarkMergeCompiledAndroidResources", progress_message = "Merging compiled Android Resources in " + out_class_jar.short_path, + supports_workers = True, + supports_multiplex_workers = True, ) def _escape_mv(s): @@ -799,6 +856,7 @@ def _merge_manifests( out_file = None, out_log_file = None, merge_type = "APPLICATION", + merge_manifest_permissions = False, manifest = None, mergee_manifests = depset(), manifest_values = None, @@ -812,6 +870,8 @@ def _merge_manifests( out_file: A File. The output merged manifest. out_log_file: A File. The output log from the merge tool. merge_type: A string, either APPLICATION or LIBRARY. Type of merging. + merge_manifest_permissions: A boolean, Determines of the manifest merger should + merge manifest permissions. manifest: A File. The primary AndroidManifest.xml. mergee_manifests: A depset of Files. All transitive manifests to be merged. manifest_values: A dictionary. Manifest values to substitute. @@ -829,10 +889,12 @@ def _merge_manifests( # Args for busybox args = ctx.actions.args() args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "MERGE_MANIFEST") args.add("--") if manifest: args.add("--manifest", manifest) + args.add("--mergeManifestPermissions") args.add_all( "--mergeeManifests", [mergee_manifests], @@ -850,16 +912,23 @@ def _merge_manifests( if out_log_file: args.add("--log", out_log_file) outputs.append(out_log_file) + if merge_manifest_permissions: + args.add("--mergeManifestPermissions") + + _disable_warnings(args) _java.run( ctx = ctx, host_javabase = host_javabase, executable = busybox, + tools = [busybox], arguments = [args], inputs = depset(directs, transitive = transitives), outputs = outputs, mnemonic = "MergeManifests", progress_message = "Merging Android Manifests in %s" % out_file.short_path, + supports_workers = True, + supports_multiplex_workers = True, ) def _process_databinding( @@ -894,6 +963,8 @@ def _process_databinding( res_dirs = _get_unique_res_dirs(resource_files) args = ctx.actions.args() + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "PROCESS_DATABINDING") args.add("--") args.add("--output_resource_directory", databinding_resources_dirname) @@ -901,6 +972,8 @@ def _process_databinding( args.add("--dataBindingInfoOut", out_databinding_info) args.add("--appId", java_package) + _disable_warnings(args) + _java.run( ctx = ctx, host_javabase = host_javabase, @@ -910,6 +983,8 @@ def _process_databinding( outputs = [out_databinding_info] + out_databinding_processed_resources, mnemonic = "StarlarkProcessDatabinding", progress_message = "Processing data binding", + supports_workers = True, + supports_multiplex_workers = True, ) def _make_generate_binay_r_flags(resources_node): @@ -948,6 +1023,8 @@ def _generate_binary_r( host_javabase: A Target. The host javabase. """ args = ctx.actions.args() + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "GENERATE_BINARY_R") args.add("--") args.add("--primaryRTxt", r_txt) @@ -967,17 +1044,21 @@ def _generate_binary_r( # TODO(b/154003916): support transitive "--library transitive_r_txt_path,transitive_manifest_path" flags args.add("--classJarOutput", out_class_jar) args.add("--targetLabel", str(ctx.label)) - args.use_param_file("@%s") + + _disable_warnings(args) _java.run( ctx = ctx, host_javabase = host_javabase, executable = busybox, + tools = [busybox], arguments = [args], inputs = depset([r_txt, manifest], transitive = transitive_r_txts + transitive_manifests), outputs = [out_class_jar], mnemonic = "StarlarkRClassGenerator", progress_message = "Generating R classes", + supports_workers = True, + supports_multiplex_workers = True, ) def _make_aar( @@ -1012,6 +1093,8 @@ def _make_aar( when a resource conflict occurs. """ args = ctx.actions.args() + args.use_param_file("@%s", use_always = True) + args.set_param_file_format("multiline") args.add("--tool", "GENERATE_AAR") args.add("--") args.add( @@ -1031,10 +1114,13 @@ def _make_aar( if should_throw_on_conflict: args.add("--throwOnResourceConflict") + _disable_warnings(args) + _java.run( ctx = ctx, host_javabase = host_javabase, executable = busybox, + tools = [busybox], arguments = [args], inputs = ( resource_files + @@ -1045,6 +1131,8 @@ def _make_aar( outputs = [out_aar], mnemonic = "StarlarkAARGenerator", progress_message = "Generating AAR package for %s" % ctx.label, + supports_workers = True, + supports_multiplex_workers = True, ) def _shrink( @@ -1198,6 +1286,7 @@ busybox = struct( make_aar = _make_aar, shrink = _shrink, optimize = _optimize, + ANDROID_RESOURCES_STRICT_DEPS = _ANDROID_RESOURCES_STRICT_DEPS, # Exposed for testing mergee_manifests_flag = _mergee_manifests_flag, diff --git a/rules/flags/flag_defs.bzl b/rules/flags/flag_defs.bzl index 61f2cf7f0..14386b1e2 100644 --- a/rules/flags/flag_defs.bzl +++ b/rules/flags/flag_defs.bzl @@ -86,7 +86,6 @@ def define_flags(): description = "", ) - flags.EXPOSE_native_bool( name = "stamp", description = "Accesses the native --stamp CLI flag", @@ -97,3 +96,27 @@ def define_flags(): default = True, description = "Use Studio Deployer to install apks", ) + + flags.DEFINE_bool( + name = "namespaced_r_class", + default = False, + description = "Enables namespaced R class generation", + ) + + flags.DEFINE_bool( + name = "output_library_merged_assets", + default = True, + description = "If disabled, does not produce merged asset.zip outputs for library targets", + ) + + flags.DEFINE_bool( + name = "merge_manifest_permissions", + default = False, + description = "If disabled, does not merge manifest permissions.", + ) + + flags.DEFINE_bool( + name = "link_library_resources", + default = True, + description = "If disabled, resource linking will be skipped on android libraries", + ) diff --git a/rules/java.bzl b/rules/java.bzl index 5eb74b0c1..64137c4d3 100644 --- a/rules/java.bzl +++ b/rules/java.bzl @@ -453,7 +453,17 @@ def _run( args["arguments"] = jvm_flags + [jar_args] + args.get("arguments", default = []) - ctx.actions.run(**args) + mnemonic = args.get("mnemonic") + supports_workers = args.pop("supports_workers", False) + supports_multiplex_workers = args.pop("supports_multiplex_workers", False) + execution_requirements = args.pop("execution_requirements", dict()) + if supports_workers: + execution_requirements["worker-key-mnemonic"] = mnemonic + execution_requirements["supports-workers"] = "1" + if supports_multiplex_workers: + execution_requirements["supports-multiplex-workers"] = "1" + + ctx.actions.run(execution_requirements = execution_requirements, **args) def _create_deploy_jar( ctx, diff --git a/rules/resources.bzl b/rules/resources.bzl index a92d69635..f5026a0a2 100644 --- a/rules/resources.bzl +++ b/rules/resources.bzl @@ -494,6 +494,7 @@ def _package( enable_manifest_merging = True, should_compile_java_srcs = True, minsdk_proguard_config = None, + merge_manifest_permissions = False, aapt = None, has_local_proguard_specs = False, android_jar = None, @@ -553,6 +554,8 @@ def _package( should_compile_java_srcs: boolean. If native android_binary should perform java compilation. minsdk_proguard_config: Optional file. Proguard config for the minSdkVersion to include in the returned resource context. + merge_manifest_permissions: Whether to merge permissions when merging the + Android manifests. aapt: FilesToRunProvider. The aapt executable or FilesToRunProvider. has_local_proguard_specs: If the target has proguard specs. android_jar: File. The Android jar. @@ -579,18 +582,6 @@ def _package( g3itr_manifest = manifest - if xsltproc or instrument_xslt: - g3itr_manifest = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + "add_g3itr/AndroidManifest.xml", - ) - _add_g3itr( - ctx, - out_manifest = g3itr_manifest, - manifest = manifest, - xsltproc = xsltproc, - instrument_xslt = instrument_xslt, - ) - direct_resources_nodes = [] transitive_resources_nodes = [] transitive_assets = [] @@ -668,6 +659,7 @@ def _package( mergee_manifests = mergee_manifests, manifest_values = manifest_values, merge_type = "APPLICATION", + merge_manifest_permissions = merge_manifest_permissions, java_package = java_package, busybox = busybox, host_javabase = host_javabase, @@ -1261,7 +1253,8 @@ def _process_starlark( neverlink = False, enable_data_binding = False, propagate_resources = True, - fix_resource_transitivity = False, + fix_resource_transitivity = True, + merge_manifest_permissions = False, aapt = None, android_jar = None, android_kit = None, @@ -1270,7 +1263,10 @@ def _process_starlark( host_javabase = None, instrument_xslt = None, xsltproc = None, - zip_tool = None): + zip_tool = None, + namespaced_r_class = False, + output_library_merged_assets = True, + link_library_resources = True): """Processes Android Resources. Args: @@ -1313,6 +1309,8 @@ def _process_starlark( continue to propagate others (AndroidLibraryResourceClassJarProvider). fix_resource_transitivity: Whether to ensure that transitive resources are correctly marked as transitive. + merge_manifest_permissions: Whether to merge permissions when merging the + Android manifests. aapt: FilesToRunProvider. The aapt executable or FilesToRunProvider. android_jar: File. The android Jar. android_kit: FilesToRunProvider. The android_kit executable or @@ -1324,6 +1322,8 @@ def _process_starlark( instrument_xslt: File. The xslt transform to apply g3itr. xsltproc: FilesToRunProvider. The xsltproc executable or FilesToRunProvider. zip_tool: FilesToRunProvider. The zip tool executable or FilesToRunProvider. + link_library_resources: boolean. Whether to run or skip 'aapt link' on + android library resources. Returns: A dict containing _ResourcesProcessContextInfo provider fields. @@ -1341,8 +1341,7 @@ def _process_starlark( manifest or resource_files or defined_assets or - defined_assets_dir or - exports_manifest, + defined_assets_dir, ) # TODO(djwhang): Clean up the difference between neverlink the attribute used @@ -1505,28 +1504,17 @@ def _process_starlark( out_file = stamped_manifest, manifest = manifest, merge_type = "LIBRARY", + merge_manifest_permissions = merge_manifest_permissions, java_package = java_package, busybox = busybox, host_javabase = host_javabase, ) manifest = stamped_manifest - if instrument_xslt: - g3itr_manifest = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + "_g3itr_manifest/AndroidManifest.xml", - ) - _add_g3itr( - ctx, - out_manifest = g3itr_manifest, - manifest = manifest, - xsltproc = xsltproc, - instrument_xslt = instrument_xslt, - ) - manifest = g3itr_manifest - parsed_assets = ctx.actions.declare_file( "_migrated/" + ctx.label.name + "_symbols/assets.bin", ) + _busybox.parse( ctx, out_symbols = parsed_assets, @@ -1535,29 +1523,31 @@ def _process_starlark( busybox = busybox, host_javabase = host_javabase, ) - merged_assets = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + "_files/assets.zip", - ) - _busybox.merge_assets( - ctx, - out_assets_zip = merged_assets, - assets = assets, - assets_dir = assets_dir, - symbols = parsed_assets, - direct_resources_nodes = depset( - transitive = direct_resources_nodes, - order = "preorder", - ), - transitive_resources_nodes = depset( - transitive = transitive_resources_nodes, - order = "preorder", - ), - transitive_assets = transitive_assets, - transitive_assets_symbols = transitive_assets_symbols, - busybox = busybox, - host_javabase = host_javabase, - ) - resources_ctx[_VALIDATION_RESULTS].append(merged_assets) + + if output_library_merged_assets: + merged_assets = ctx.actions.declare_file( + "_migrated/" + ctx.label.name + "_files/assets.zip", + ) + _busybox.merge_assets( + ctx, + out_assets_zip = merged_assets, + assets = assets, + assets_dir = assets_dir, + symbols = parsed_assets, + direct_resources_nodes = depset( + transitive = direct_resources_nodes, + order = "preorder", + ), + transitive_resources_nodes = depset( + transitive = transitive_resources_nodes, + order = "preorder", + ), + transitive_assets = transitive_assets, + transitive_assets_symbols = transitive_assets_symbols, + busybox = busybox, + host_javabase = host_javabase, + ) + resources_ctx[_VALIDATION_RESULTS].append(merged_assets) if assets: compiled_assets = ctx.actions.declare_file( @@ -1595,14 +1585,38 @@ def _process_starlark( compiled_resources = ctx.actions.declare_file( "_migrated/" + ctx.label.name + "_symbols/symbols.zip", ) - _busybox.compile( - ctx, - out_file = compiled_resources, - resource_files = processed_resources, - aapt = aapt, - busybox = busybox, - host_javabase = host_javabase, + + out_class_jar = ctx.actions.declare_file( + "_migrated/" + ctx.label.name + "_resources.jar", ) + processed_manifest = None + + # when using namespaced r classes the compile action generated both + # R.txt and the resources.jar without merging with outputs produced + # by transitive deps. Doing this means less changes that invalidate + # the action cache which in turn improves performance significantly. + if namespaced_r_class: + out_aapt2_r_txt = ctx.actions.declare_file( + "_migrated/" + ctx.label.name + "_symbols/R.txt", + ) + _busybox.compile( + ctx, + out_file = compiled_resources, + out_class_jar = out_class_jar, + out_r_txt = out_aapt2_r_txt, + manifest = manifest, + android_jar = android_jar, + resource_files = processed_resources, + aapt = aapt, + busybox = busybox, + host_javabase = host_javabase, + ) + r_txt = out_aapt2_r_txt + java_info = JavaInfo( + output_jar = out_class_jar, + compile_jar = out_class_jar, + ) + processed_manifest = manifest # TODO(b/160907203): Remove this fix once the native resource processing pipeline is turned off. if enable_data_binding: @@ -1617,77 +1631,93 @@ def _process_starlark( ) compiled_resources = fixed_compiled_resources - out_class_jar = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + "_resources.jar", - ) - processed_manifest = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + "_processed_manifest/AndroidManifest.xml", - ) - out_aapt2_r_txt = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + "_symbols/R.aapt2.txt", - ) - _busybox.merge_compiled( - ctx, - out_class_jar = out_class_jar, - out_manifest = processed_manifest, - out_aapt2_r_txt = out_aapt2_r_txt, - java_package = java_package, - manifest = manifest, - compiled_resources = compiled_resources, - direct_resources_nodes = - depset(transitive = direct_resources_nodes, order = "preorder"), - transitive_resources_nodes = depset( - transitive = transitive_resources_nodes, - order = "preorder", - ), - direct_compiled_resources = depset( - transitive = direct_compiled_resources, - order = "preorder", - ), - transitive_compiled_resources = depset( - transitive = transitive_compiled_resources, - order = "preorder", - ), - android_jar = android_jar, - busybox = busybox, - host_javabase = host_javabase, - ) - resources_ctx[_MERGED_MANIFEST] = processed_manifest + if not namespaced_r_class: + processed_manifest = ctx.actions.declare_file( + "_migrated/" + ctx.label.name + "_processed_manifest/AndroidManifest.xml", + ) + r_txt_filename = "R.aapt2.txt" if link_library_resources else "R.txt" + out_aapt2_r_txt = ctx.actions.declare_file( + "_migrated/" + ctx.label.name + "_symbols/%s" % r_txt_filename, + ) - apk = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + "_files/library.ap_", - ) - r_java = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + ".srcjar", - ) - r_txt = ctx.actions.declare_file( - "_migrated/" + ctx.label.name + "_symbols/R.txt", - ) - _busybox.validate_and_link( - ctx, - out_r_src_jar = r_java, - out_r_txt = r_txt, - out_file = apk, - compiled_resources = compiled_resources, - transitive_compiled_resources = depset( - transitive = transitive_compiled_resources, - order = "preorder", - ), - java_package = java_package, - manifest = processed_manifest, - android_jar = android_jar, - aapt = aapt, - busybox = busybox, - host_javabase = host_javabase, - resource_apks = resource_apks, - ) - resources_ctx[_RESOURCES_APK] = apk + _busybox.compile( + ctx, + out_file = compiled_resources, + manifest = manifest, + android_jar = android_jar, + resource_files = processed_resources, + aapt = aapt, + busybox = busybox, + host_javabase = host_javabase, + ) - java_info = JavaInfo( - output_jar = out_class_jar, - compile_jar = out_class_jar, - source_jar = r_java, - ) + _busybox.merge_compiled( + ctx, + out_class_jar = out_class_jar, + out_manifest = processed_manifest, + out_aapt2_r_txt = out_aapt2_r_txt, + java_package = java_package, + manifest = manifest, + compiled_resources = compiled_resources, + direct_resources_nodes = + depset(transitive = direct_resources_nodes, order = "preorder"), + transitive_resources_nodes = depset( + transitive = transitive_resources_nodes, + order = "preorder", + ), + direct_compiled_resources = depset( + transitive = direct_compiled_resources, + order = "preorder", + ), + transitive_compiled_resources = depset( + transitive = transitive_compiled_resources, + order = "preorder", + ), + android_jar = android_jar, + busybox = busybox, + host_javabase = host_javabase, + ) + + if link_library_resources: + apk = ctx.actions.declare_file( + "_migrated/" + ctx.label.name + "_files/library.ap_", + ) + r_java = ctx.actions.declare_file( + "_migrated/" + ctx.label.name + ".srcjar", + ) + r_txt = ctx.actions.declare_file( + "_migrated/" + ctx.label.name + "_symbols/R.txt", + ) + _busybox.validate_and_link( + ctx, + out_r_src_jar = r_java, + out_r_txt = r_txt, + out_file = apk, + compiled_resources = compiled_resources, + transitive_compiled_resources = depset( + transitive = transitive_compiled_resources, + order = "preorder", + ), + java_package = java_package, + manifest = processed_manifest, + android_jar = android_jar, + aapt = aapt, + busybox = busybox, + host_javabase = host_javabase, + resource_apks = resource_apks, + ) + resources_ctx[_RESOURCES_APK] = apk + else: + r_txt = out_aapt2_r_txt + r_java = None + + java_info = JavaInfo( + output_jar = out_class_jar, + compile_jar = out_class_jar, + source_jar = r_java, + ) + + resources_ctx[_MERGED_MANIFEST] = processed_manifest packages_to_r_txts_depset.setdefault(java_package, []).append(depset([out_aapt2_r_txt])) @@ -1863,14 +1893,6 @@ def _process_starlark( AndroidLibraryResourceClassJarProvider( depset( (resources_ctx[_R_JAVA].runtime_output_jars if resources_ctx[_R_JAVA] else []), - transitive = [ - p.jars - for p in utils.collect_providers( - AndroidLibraryResourceClassJarProvider, - deps, - exports, - ) - ], order = "preorder", ), ), @@ -1878,7 +1900,6 @@ def _process_starlark( return resources_ctx - def _process( ctx, manifest = None, @@ -1906,10 +1927,14 @@ def _process( enable_res_v3 = False, res_v3_dummy_manifest = None, res_v3_dummy_r_txt = None, - fix_resource_transitivity = False, + fix_resource_transitivity = True, + merge_manifest_permissions = False, fix_export_exporting = False, propagate_resources = True, - zip_tool = None): + namespaced_r_class = False, + output_library_merged_assets = True, + zip_tool = None, + link_library_resources = True): out_ctx = _process_starlark( ctx, java_package = java_package, @@ -1930,6 +1955,7 @@ def _process( resource_files = depset(transitive = [target.files for target in resource_files]).to_list(), enable_data_binding = enable_data_binding, fix_resource_transitivity = fix_resource_transitivity, + merge_manifest_permissions = merge_manifest_permissions, neverlink = neverlink, propagate_resources = propagate_resources, android_jar = android_jar, @@ -1941,9 +1967,11 @@ def _process( java_toolchain = java_toolchain, host_javabase = host_javabase, zip_tool = zip_tool, + namespaced_r_class = namespaced_r_class, + output_library_merged_assets = output_library_merged_assets, + link_library_resources = link_library_resources, ) - if _VALIDATION_OUTPUTS not in out_ctx: out_ctx[_VALIDATION_OUTPUTS] = [] diff --git a/tools/jdk/BUILD b/tools/jdk/BUILD index 08b8c862a..b6e1e7aba 100644 --- a/tools/jdk/BUILD +++ b/tools/jdk/BUILD @@ -1,12 +1,6 @@ -load("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "default_java_toolchain") - -default_java_toolchain( +alias( name = "toolchain_android_only", - bootclasspath = [ - "//tools/android:android_jar", - # TODO(b/175805830): Add this only when desugaring is enabled. - "@bazel_tools//tools/android:desugar_java8_extra_bootclasspath", - ], + actual = "@//:lyft_default_java_toolchain", visibility = ["//visibility:public"], )