Skip to content

Commit 1dbb9e2

Browse files
author
Nikolay
committed
Add use_minimal_keep_rules flag for aapt2 minimal proguard keep rules
1 parent 00040bf commit 1dbb9e2

7 files changed

Lines changed: 39 additions & 0 deletions

File tree

rules/android_binary/impl.bzl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def _process_resources(ctx, manifest_ctx, java_package, **unused_ctxs):
107107
shrink_resources = ctx.attr.shrink_resources,
108108
use_android_resource_shrinking = ctx.fragments.android.use_android_resource_shrinking,
109109
use_android_resource_cycle_shrinking = ctx.fragments.android.use_android_resource_cycle_shrinking,
110+
use_minimal_keep_rules = _flags.get(ctx).use_minimal_keep_rules,
110111
use_legacy_manifest_merger = use_legacy_manifest_merger(ctx),
111112
should_throw_on_conflict = not acls.in_allow_resource_conflicts(str(ctx.label)),
112113
enable_data_binding = ctx.attr.enable_data_binding,

rules/busybox.bzl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ def _package(
234234
nocompress_extensions = [],
235235
proto_format = False,
236236
shrink_resource_cycles = False,
237+
use_minimal_keep_rules = False,
237238
version_name = None,
238239
version_code = None,
239240
feature_flags = "",
@@ -293,6 +294,9 @@ def _package(
293294
proto_format: Boolean, whether to generate the resource table in proto format.
294295
shrink_resource_cycles: Boolean, flag that enables more shrinking of
295296
code and resources by instructing AAPT2 to emit conditional Proguard keep rules.
297+
use_minimal_keep_rules: Boolean, flag that instructs AAPT2 to emit minimal Proguard
298+
keep rules with precise member signatures instead of broad <init>(...) rules,
299+
matching Android Gradle Plugin behavior.
296300
version_name: A string. The version name to stamp the generated manifest with. Optional.
297301
version_code: A string. The version code to stamp the generated manifest with. Optional.
298302
crunch_png: A boolean. Determines whether `aapt2 compile` should crunch PNG files.
@@ -414,6 +418,8 @@ def _package(
414418
args.add("--resourceTableAsProto")
415419
if shrink_resource_cycles:
416420
args.add("--conditionalKeepRules=yes")
421+
if use_minimal_keep_rules:
422+
args.add("--minimalKeepRules=yes")
417423
if version_name:
418424
args.add("--versionName", version_name)
419425
if version_code:

rules/flags/flag_defs.bzl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,12 @@ def define_flags():
108108
description = "When enabled, aar_import extracts R8-targeted proguard rules from " +
109109
"META-INF/com.android.tools/ inside classes.jar in addition to proguard.txt.",
110110
)
111+
112+
flags.DEFINE_bool(
113+
name = "use_minimal_keep_rules",
114+
default = False,
115+
description = "When enabled, aapt2 generates minimal proguard keep rules " +
116+
"(--proguard-minimal-keep-rules) for resources: precise member " +
117+
"signatures (e.g. constructor argument types) instead of broad " +
118+
"<init>(...) rules, matching Android Gradle Plugin behavior.",
119+
)

rules/resources.bzl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,7 @@ def _package(
487487
shrink_resources = None,
488488
use_android_resource_shrinking = None,
489489
use_android_resource_cycle_shrinking = None,
490+
use_minimal_keep_rules = False,
490491
use_legacy_manifest_merger = False,
491492
should_throw_on_conflict = True,
492493
enable_data_binding = False,
@@ -547,6 +548,9 @@ def _package(
547548
shrink_resources if the tristate value is auto (-1).
548549
use_android_resource_cycle_shrinking: Bool. Flag that enables more shrinking of
549550
code and resources by instructing AAPT2 to emit conditional Proguard keep rules.
551+
use_minimal_keep_rules: Bool. Flag that instructs AAPT2 to emit minimal Proguard
552+
keep rules with precise member signatures instead of broad <init>(...) rules,
553+
matching Android Gradle Plugin behavior.
550554
use_legacy_manifest_merger: A boolean. Whether to use the legacy manifest merger
551555
instead of the android manifest merger.
552556
should_throw_on_conflict: A boolean. Determines whether an error should be thrown
@@ -768,6 +772,7 @@ def _package(
768772
nocompress_extensions = nocompress_extensions,
769773
java_package = java_package,
770774
shrink_resource_cycles = shrink_resource_cycles,
775+
use_minimal_keep_rules = use_minimal_keep_rules,
771776
version_name = manifest_values[_VERSION_NAME] if _VERSION_NAME in manifest_values else None,
772777
version_code = manifest_values[_VERSION_CODE] if _VERSION_CODE in manifest_values else None,
773778
feature_flags = feature_flags,

src/tools/java/com/google/devtools/build/android/Aapt2ResourcePackagingAction.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ public static void main(String[] args) throws Exception {
405405
.withAssets(assetDirs)
406406
.buildVersion(aaptConfigOptions.buildToolsVersion)
407407
.conditionalKeepRules(aaptConfigOptions.conditionalKeepRules == TriState.YES)
408+
.minimalKeepRules(aaptConfigOptions.minimalKeepRules == TriState.YES)
408409
.filterToDensity(options.densities)
409410
.storeUncompressed(aaptConfigOptions.uncompressedExtensions)
410411
.debug(aaptConfigOptions.debug)

src/tools/java/com/google/devtools/build/android/aapt2/Aapt2ConfigOptions.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ public class Aapt2ConfigOptions {
6868
description = "Have AAPT2 produce conditional keep rules.")
6969
public TriState conditionalKeepRules = TriState.AUTO;
7070

71+
@Parameter(
72+
names = "--minimalKeepRules",
73+
description =
74+
"Have AAPT2 produce minimal proguard keep rules, emitting precise member "
75+
+ "signatures (e.g. constructor argument types) instead of broad <init>(...) "
76+
+ "rules. Matches Android Gradle Plugin behavior.")
77+
public TriState minimalKeepRules = TriState.AUTO;
78+
7179
@Parameter(
7280
names = "--uncompressedExtensions",
7381
description = "A list of file extensions not to compress.")

src/tools/java/com/google/devtools/build/android/aapt2/ResourceLinker.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ public static LinkError of(Throwable e) {
166166
private List<CompiledResources> include = ImmutableList.of();
167167
private List<Path> assetDirs = ImmutableList.of();
168168
private boolean conditionalKeepRules = false;
169+
private boolean minimalKeepRules = false;
169170
private boolean includeProguardLocationReferences = false;
170171
private List<StaticLibrary> resourceApks = ImmutableList.of();
171172
private String featureFlags = "";
@@ -233,6 +234,12 @@ public ResourceLinker conditionalKeepRules(boolean conditionalKeepRules) {
233234
return this;
234235
}
235236

237+
@CanIgnoreReturnValue
238+
public ResourceLinker minimalKeepRules(boolean minimalKeepRules) {
239+
this.minimalKeepRules = minimalKeepRules;
240+
return this;
241+
}
242+
236243
@CanIgnoreReturnValue
237244
public ResourceLinker customPackage(String customPackage) {
238245
this.customPackage = customPackage;
@@ -529,6 +536,8 @@ private ProtoApk linkProtoApk(
529536
.add("--no-proguard-location-reference")
530537
.when(conditionalKeepRules)
531538
.thenAdd("--proguard-conditional-keep-rules")
539+
.when(minimalKeepRules)
540+
.thenAdd("--proguard-minimal-keep-rules")
532541
.add("-o", linked)
533542
.add("--feature-flags", featureFlags)
534543
.execute(String.format("Linking %s", compiled.getManifest())));

0 commit comments

Comments
 (0)