@@ -63,6 +63,7 @@ public static final class ProguardOutput {
6363 @ Nullable private final Artifact constantStringObfuscatedMapping ;
6464 @ Nullable private final Artifact libraryJar ;
6565 private final Artifact config ;
66+ @ Nullable private final Artifact baselineProfileOut ;
6667
6768 public ProguardOutput (
6869 Artifact outputJar ,
@@ -72,7 +73,8 @@ public ProguardOutput(
7273 @ Nullable Artifact usage ,
7374 @ Nullable Artifact constantStringObfuscatedMapping ,
7475 @ Nullable Artifact libraryJar ,
75- Artifact config ) {
76+ Artifact config ,
77+ @ Nullable Artifact baselineProfileOut ) {
7678 this .outputJar = checkNotNull (outputJar );
7779 this .mapping = mapping ;
7880 this .protoMapping = protoMapping ;
@@ -81,10 +83,11 @@ public ProguardOutput(
8183 this .constantStringObfuscatedMapping = constantStringObfuscatedMapping ;
8284 this .libraryJar = libraryJar ;
8385 this .config = config ;
86+ this .baselineProfileOut = baselineProfileOut ;
8487 }
8588
8689 public static ProguardOutput createEmpty (Artifact outputJar ) {
87- return new ProguardOutput (outputJar , null , null , null , null , null , null , null );
90+ return new ProguardOutput (outputJar , null , null , null , null , null , null , null , null );
8891 }
8992
9093 public Artifact getOutputJar () {
@@ -129,6 +132,10 @@ public Artifact getConfig() {
129132 return config ;
130133 }
131134
135+ public Artifact getBaselineProfileOut () {
136+ return baselineProfileOut ;
137+ }
138+
132139 /** Adds the output artifacts to the given set builder. */
133140 public void addAllToSet (NestedSetBuilder <Artifact > filesBuilder ) {
134141 addAllToSet (filesBuilder , null );
@@ -256,7 +263,8 @@ public static ProguardOutput getProguardOutputs(
256263 RuleContext ruleContext ,
257264 JavaSemantics semantics ,
258265 @ Nullable Artifact proguardOutputMap ,
259- @ Nullable Artifact libraryJar )
266+ @ Nullable Artifact libraryJar ,
267+ @ Nullable Artifact baselineProfileOutput )
260268 throws InterruptedException {
261269 boolean mappingRequested = genProguardMapping (ruleContext .attributes ());
262270
@@ -284,7 +292,8 @@ public static ProguardOutput getProguardOutputs(
284292 proguardUsage ,
285293 proguardConstantStringMap ,
286294 libraryJar ,
287- proguardConfigOutput );
295+ proguardConfigOutput ,
296+ baselineProfileOutput );
288297 }
289298
290299 /**
@@ -304,6 +313,10 @@ public static ProguardOutput getProguardOutputs(
304313 * @param optimizationPasses if not null specifies to break proguard up into multiple passes with
305314 * the given number of optimization passes.
306315 * @param proguardOutputMap mapping generated by Proguard if requested. could be null.
316+ * @param baselineProfileIn Profile to pass the optimizer to perform feedback-directed
317+ * optimization.
318+ * @param baselineProfileDir Directory to write baseline profile artifacts if baseline profile is
319+ * provided.
307320 */
308321 public static ProguardOutput createOptimizationActions (
309322 RuleContext ruleContext ,
@@ -318,10 +331,11 @@ public static ProguardOutput createOptimizationActions(
318331 Artifact proguardOutputJar ,
319332 JavaSemantics semantics ,
320333 @ Nullable Integer optimizationPasses ,
321- @ Nullable Artifact proguardOutputMap )
334+ @ Nullable Artifact proguardOutputMap ,
335+ @ Nullable Artifact baselineProfileIn ,
336+ String baselineProfileDir )
322337 throws InterruptedException {
323338 Preconditions .checkArgument (!proguardSpecs .isEmpty ());
324-
325339 Artifact libraryJar = null ;
326340
327341 if (!libraryJars .isEmpty () && !libraryJars .isSingleton ()) {
@@ -359,7 +373,10 @@ public static ProguardOutput createOptimizationActions(
359373 libraryJars = NestedSetBuilder .create (Order .STABLE_ORDER , filteredLibraryJar );
360374 libraryJar = filteredLibraryJar ;
361375 }
362-
376+ Artifact baselineProfileOut = null ;
377+ if (baselineProfileIn != null ) {
378+ baselineProfileOut = ruleContext .getBinArtifact (baselineProfileDir + "rewritten-prof.txt" );
379+ }
363380 ProguardOutput output =
364381 getProguardOutputs (
365382 proguardOutputJar ,
@@ -368,7 +385,8 @@ public static ProguardOutput createOptimizationActions(
368385 ruleContext ,
369386 semantics ,
370387 proguardOutputMap ,
371- libraryJar );
388+ libraryJar ,
389+ baselineProfileOut );
372390
373391 JavaConfiguration javaConfiguration =
374392 ruleContext .getConfiguration ().getFragment (JavaConfiguration .class );
@@ -394,6 +412,8 @@ public static ProguardOutput createOptimizationActions(
394412 output .getUsage (),
395413 output .getConstantStringObfuscatedMapping (),
396414 output .getConfig (),
415+ baselineProfileIn ,
416+ baselineProfileOut ,
397417 mnemonic );
398418 proguardAction
399419 .setProgressMessage ("Trimming binary with %s: %s" , mnemonic , ruleContext .getLabel ())
@@ -435,6 +455,8 @@ public static ProguardOutput createOptimizationActions(
435455 /* proguardUsage */ null ,
436456 /* constantStringObfuscatedMapping */ null ,
437457 /* proguardConfigOutput */ null ,
458+ baselineProfileIn ,
459+ /* baselineProfileOutput */ null ,
438460 mnemonic );
439461 initialAction
440462 .setProgressMessage ("Trimming binary with %s: Verification/Shrinking Pass" , mnemonic )
@@ -515,6 +537,8 @@ public static ProguardOutput createOptimizationActions(
515537 output .getUsage (),
516538 output .getConstantStringObfuscatedMapping (),
517539 output .getConfig (),
540+ /* baselineProfileInput */ null ,
541+ baselineProfileOut ,
518542 mnemonic );
519543 finalAction
520544 .setProgressMessage (
@@ -576,6 +600,8 @@ private static Artifact createSingleOptimizationAction(
576600 /* proguardUsage */ null ,
577601 /* constantStringObfuscatedMapping */ null ,
578602 /* proguardConfigOutput */ null ,
603+ /* baselineProfileInput */ null ,
604+ /* baselineProfileOutput */ null ,
579605 mnemonic );
580606 optimizationAction
581607 .setProgressMessage (
@@ -609,6 +635,8 @@ private static void defaultAction(
609635 @ Nullable Artifact proguardUsage ,
610636 @ Nullable Artifact constantStringObfuscatedMapping ,
611637 @ Nullable Artifact proguardConfigOutput ,
638+ @ Nullable Artifact baselineProfileInput ,
639+ @ Nullable Artifact baselineProfileOutput ,
612640 String mnemonic ) {
613641
614642 builder
@@ -680,6 +708,14 @@ private static void defaultAction(
680708 builder .addOutput (proguardConfigOutput );
681709 commandLine .addExecPath ("-printconfiguration" , proguardConfigOutput );
682710 }
711+ if (baselineProfileInput != null ) {
712+ builder .addInput (baselineProfileInput );
713+ commandLine .addExecPath ("-baselineprofile" , baselineProfileInput );
714+ }
715+ if (baselineProfileOutput != null ) {
716+ builder .addOutput (baselineProfileOutput );
717+ commandLine .addExecPath ("-printbaselineprofile" , baselineProfileOutput );
718+ }
683719 }
684720
685721 /** Returns an intermediate artifact used to run Proguard. */
0 commit comments