diff --git a/rules/android_binary/impl.bzl b/rules/android_binary/impl.bzl index 5461f171f..a77397231 100644 --- a/rules/android_binary/impl.bzl +++ b/rules/android_binary/impl.bzl @@ -107,6 +107,7 @@ def _process_resources(ctx, manifest_ctx, java_package, **unused_ctxs): shrink_resources = ctx.attr.shrink_resources, use_android_resource_shrinking = ctx.fragments.android.use_android_resource_shrinking, use_android_resource_cycle_shrinking = ctx.fragments.android.use_android_resource_cycle_shrinking, + use_minimal_keep_rules = _flags.get(ctx).use_minimal_keep_rules, use_legacy_manifest_merger = use_legacy_manifest_merger(ctx), should_throw_on_conflict = not acls.in_allow_resource_conflicts(str(ctx.label)), enable_data_binding = ctx.attr.enable_data_binding, diff --git a/rules/busybox.bzl b/rules/busybox.bzl index 64f5c8a96..106e6e49d 100644 --- a/rules/busybox.bzl +++ b/rules/busybox.bzl @@ -234,6 +234,7 @@ def _package( nocompress_extensions = [], proto_format = False, shrink_resource_cycles = False, + use_minimal_keep_rules = False, version_name = None, version_code = None, feature_flags = "", @@ -293,6 +294,9 @@ def _package( proto_format: Boolean, whether to generate the resource table in proto format. shrink_resource_cycles: Boolean, flag that enables more shrinking of code and resources by instructing AAPT2 to emit conditional Proguard keep rules. + use_minimal_keep_rules: Boolean, flag that instructs AAPT2 to emit minimal Proguard + keep rules with precise member signatures instead of broad (...) rules, + matching Android Gradle Plugin behavior. version_name: A string. The version name to stamp the generated manifest with. Optional. version_code: A string. The version code to stamp the generated manifest with. Optional. crunch_png: A boolean. Determines whether `aapt2 compile` should crunch PNG files. @@ -414,6 +418,8 @@ def _package( args.add("--resourceTableAsProto") if shrink_resource_cycles: args.add("--conditionalKeepRules=yes") + if use_minimal_keep_rules: + args.add("--minimalKeepRules=yes") if version_name: args.add("--versionName", version_name) if version_code: diff --git a/rules/flags/flag_defs.bzl b/rules/flags/flag_defs.bzl index 5dde68d51..4c94c17e7 100644 --- a/rules/flags/flag_defs.bzl +++ b/rules/flags/flag_defs.bzl @@ -108,3 +108,12 @@ def define_flags(): description = "When enabled, aar_import extracts R8-targeted proguard rules from " + "META-INF/com.android.tools/ inside classes.jar in addition to proguard.txt.", ) + + flags.DEFINE_bool( + name = "use_minimal_keep_rules", + default = False, + description = "When enabled, aapt2 generates minimal proguard keep rules " + + "(--proguard-minimal-keep-rules) for resources: precise member " + + "signatures (e.g. constructor argument types) instead of broad " + + "(...) rules, matching Android Gradle Plugin behavior.", + ) diff --git a/rules/resources.bzl b/rules/resources.bzl index 98d824bed..322c88dac 100644 --- a/rules/resources.bzl +++ b/rules/resources.bzl @@ -487,6 +487,7 @@ def _package( shrink_resources = None, use_android_resource_shrinking = None, use_android_resource_cycle_shrinking = None, + use_minimal_keep_rules = False, use_legacy_manifest_merger = False, should_throw_on_conflict = True, enable_data_binding = False, @@ -547,6 +548,9 @@ def _package( shrink_resources if the tristate value is auto (-1). use_android_resource_cycle_shrinking: Bool. Flag that enables more shrinking of code and resources by instructing AAPT2 to emit conditional Proguard keep rules. + use_minimal_keep_rules: Bool. Flag that instructs AAPT2 to emit minimal Proguard + keep rules with precise member signatures instead of broad (...) rules, + matching Android Gradle Plugin behavior. use_legacy_manifest_merger: A boolean. Whether to use the legacy manifest merger instead of the android manifest merger. should_throw_on_conflict: A boolean. Determines whether an error should be thrown @@ -768,6 +772,7 @@ def _package( nocompress_extensions = nocompress_extensions, java_package = java_package, shrink_resource_cycles = shrink_resource_cycles, + use_minimal_keep_rules = use_minimal_keep_rules, version_name = manifest_values[_VERSION_NAME] if _VERSION_NAME in manifest_values else None, version_code = manifest_values[_VERSION_CODE] if _VERSION_CODE in manifest_values else None, feature_flags = feature_flags, diff --git a/src/tools/java/com/google/devtools/build/android/Aapt2ResourcePackagingAction.java b/src/tools/java/com/google/devtools/build/android/Aapt2ResourcePackagingAction.java index 95afbb42a..33470c27e 100644 --- a/src/tools/java/com/google/devtools/build/android/Aapt2ResourcePackagingAction.java +++ b/src/tools/java/com/google/devtools/build/android/Aapt2ResourcePackagingAction.java @@ -405,6 +405,7 @@ public static void main(String[] args) throws Exception { .withAssets(assetDirs) .buildVersion(aaptConfigOptions.buildToolsVersion) .conditionalKeepRules(aaptConfigOptions.conditionalKeepRules == TriState.YES) + .minimalKeepRules(aaptConfigOptions.minimalKeepRules == TriState.YES) .filterToDensity(options.densities) .storeUncompressed(aaptConfigOptions.uncompressedExtensions) .debug(aaptConfigOptions.debug) diff --git a/src/tools/java/com/google/devtools/build/android/aapt2/Aapt2ConfigOptions.java b/src/tools/java/com/google/devtools/build/android/aapt2/Aapt2ConfigOptions.java index 28b1e308b..a211c85a1 100644 --- a/src/tools/java/com/google/devtools/build/android/aapt2/Aapt2ConfigOptions.java +++ b/src/tools/java/com/google/devtools/build/android/aapt2/Aapt2ConfigOptions.java @@ -68,6 +68,14 @@ public class Aapt2ConfigOptions { description = "Have AAPT2 produce conditional keep rules.") public TriState conditionalKeepRules = TriState.AUTO; + @Parameter( + names = "--minimalKeepRules", + description = + "Have AAPT2 produce minimal proguard keep rules, emitting precise member " + + "signatures (e.g. constructor argument types) instead of broad (...) " + + "rules. Matches Android Gradle Plugin behavior.") + public TriState minimalKeepRules = TriState.AUTO; + @Parameter( names = "--uncompressedExtensions", description = "A list of file extensions not to compress.") diff --git a/src/tools/java/com/google/devtools/build/android/aapt2/ResourceLinker.java b/src/tools/java/com/google/devtools/build/android/aapt2/ResourceLinker.java index 4d8ed1310..19a1e0901 100644 --- a/src/tools/java/com/google/devtools/build/android/aapt2/ResourceLinker.java +++ b/src/tools/java/com/google/devtools/build/android/aapt2/ResourceLinker.java @@ -166,6 +166,7 @@ public static LinkError of(Throwable e) { private List include = ImmutableList.of(); private List assetDirs = ImmutableList.of(); private boolean conditionalKeepRules = false; + private boolean minimalKeepRules = false; private boolean includeProguardLocationReferences = false; private List resourceApks = ImmutableList.of(); private String featureFlags = ""; @@ -233,6 +234,12 @@ public ResourceLinker conditionalKeepRules(boolean conditionalKeepRules) { return this; } + @CanIgnoreReturnValue + public ResourceLinker minimalKeepRules(boolean minimalKeepRules) { + this.minimalKeepRules = minimalKeepRules; + return this; + } + @CanIgnoreReturnValue public ResourceLinker customPackage(String customPackage) { this.customPackage = customPackage; @@ -529,6 +536,8 @@ private ProtoApk linkProtoApk( .add("--no-proguard-location-reference") .when(conditionalKeepRules) .thenAdd("--proguard-conditional-keep-rules") + .when(minimalKeepRules) + .thenAdd("--proguard-minimal-keep-rules") .add("-o", linked) .add("--feature-flags", featureFlags) .execute(String.format("Linking %s", compiled.getManifest())));