Baseline profiles are compiled by profgen tool and the generated ART profile info is packaged in the final apk.

BEGIN_PUBLIC
Internal Change
END_PUBLIC

PiperOrigin-RevId: 452785657
Change-Id: I9ecadfef5dfc992407d2e7ee8be67069235ad8ea
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
index 1fd43b9..9f4b62c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
@@ -117,4 +117,14 @@
             + ruleContext.getRule().getRuleClass()
             + "\"). See http://github.com/bazelbuild/rules_android.");
   }
+
+  /* Bazel does not currently support baseline profiles in the final apk.  */
+  @Override
+  public Artifact getArtProfileForApk(
+      RuleContext ruleContext,
+      Artifact finalClassesDex,
+      Artifact proguardOutputMap,
+      boolean hasProguardSpecs) {
+    return null;
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index 7a3ddc9..158497e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -683,6 +683,9 @@
       proguardOutput.addAllToSet(filesBuilder, finalProguardOutputMap);
     }
 
+    Artifact artProfileZip =
+        androidSemantics.getArtProfileForApk(
+            ruleContext, finalClassesDex, proguardOutputMap, hasProguardSpecs);
     Artifact unsignedApk =
         ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_UNSIGNED_APK);
     Artifact zipAlignedApk =
@@ -698,21 +701,26 @@
     FilesToRunProvider resourceExtractor =
         ruleContext.getExecutablePrerequisite("$resource_extractor");
 
-    ApkActionsBuilder.create("apk")
-        .setClassesDex(finalClassesDex)
-        .addInputZip(resourceApk.getArtifact())
-        .setJavaResourceZip(dexingOutput.javaResourceJar, resourceExtractor)
-        .addInputZips(nativeLibsAar.toList())
-        .setNativeLibs(nativeLibs)
-        .setUnsignedApk(unsignedApk)
-        .setSignedApk(zipAlignedApk)
-        .setSigningKeys(signingKeys)
-        .setSigningLineageFile(signingLineage)
-        .setSigningKeyRotationMinSdk(keyRotationMinSdk)
-        .setV4Signature(v4Signature)
-        .setZipalignApk(true)
-        .setDeterministicSigning(androidSemantics.deterministicSigning())
-        .registerActions(ruleContext);
+    ApkActionsBuilder actionsBuilder =
+        ApkActionsBuilder.create("apk")
+            .setClassesDex(finalClassesDex)
+            .addInputZip(resourceApk.getArtifact())
+            .setJavaResourceZip(dexingOutput.javaResourceJar, resourceExtractor)
+            .addInputZips(nativeLibsAar.toList())
+            .setNativeLibs(nativeLibs)
+            .setUnsignedApk(unsignedApk)
+            .setSignedApk(zipAlignedApk)
+            .setSigningKeys(signingKeys)
+            .setSigningLineageFile(signingLineage)
+            .setSigningKeyRotationMinSdk(keyRotationMinSdk)
+            .setV4Signature(v4Signature)
+            .setZipalignApk(true)
+            .setDeterministicSigning(androidSemantics.deterministicSigning());
+
+    if (artProfileZip != null) {
+      actionsBuilder.addInputZip(artProfileZip);
+    }
+    actionsBuilder.registerActions(ruleContext);
 
     filesBuilder.add(binaryJar);
     filesBuilder.add(unsignedApk);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
index 920c3f4..e3bd025 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
@@ -109,6 +109,13 @@
   /** The artifact for the map that proguard will output. */
   Artifact getProguardOutputMap(RuleContext ruleContext) throws InterruptedException;
 
+  /** The artifact for ART profile information. */
+  Artifact getArtProfileForApk(
+      RuleContext ruleContext,
+      Artifact finalClassesDex,
+      Artifact proguardOutputMap,
+      boolean hasProguardSpecs);
+
   boolean postprocessClassesRewritesMap(RuleContext ruleContext);
 
   /** Maybe post process the dex files and proguard output map. */