Add output log for android resource shrinking, following the format produced by the Gradle resource shrinker in resources.txt.

--
MOS_MIGRATED_REVID=126420534
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 c1f129d..082fe72 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
@@ -1012,6 +1012,8 @@
               AndroidRuleClasses.ANDROID_RESOURCES_SHRUNK_APK))
           .setShrunkResourcesOut(ruleContext.getImplicitOutputArtifact(
               AndroidRuleClasses.ANDROID_RESOURCES_SHRUNK_ZIP))
+          .setLogOut(ruleContext.getImplicitOutputArtifact(
+              AndroidRuleClasses.ANDROID_RESOURCE_SHRINKER_LOG))
           .withResourceFiles(ruleContext.getImplicitOutputArtifact(
               AndroidRuleClasses.ANDROID_RESOURCES_ZIP))
           .withShrunkJar(shrunkJar)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index 2a8d499..30d659b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -98,6 +98,8 @@
       fromTemplates("%{name}_files/resource_files.zip");
   public static final SafeImplicitOutputsFunction ANDROID_RESOURCES_SHRUNK_ZIP =
       fromTemplates("%{name}_files/resource_files_shrunk.zip");
+  public static final SafeImplicitOutputsFunction ANDROID_RESOURCE_SHRINKER_LOG =
+      fromTemplates("%{name}_files/resource_shrinker_log.txt");
   public static final SafeImplicitOutputsFunction ANDROID_INCREMENTAL_RESOURCES_APK =
       fromTemplates("%{name}_files/incremental.ap_");
   public static final SafeImplicitOutputsFunction ANDROID_BINARY_APK =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
index e8a545a..8ec9d3c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
@@ -37,6 +37,7 @@
   private ResourceDependencies dependencyResources;
   private Artifact resourceApkOut;
   private Artifact shrunkResourcesOut;
+  private Artifact logOut;
 
   private final RuleContext ruleContext;
   private final SpawnAction.Builder spawnActionBuilder;
@@ -123,6 +124,14 @@
     return this;
   }
 
+  /**
+   * @param logOut The location to write the shrinker log.
+   */
+  public ResourceShrinkerActionBuilder setLogOut(Artifact logOut) {
+    this.logOut = logOut;
+    return this;
+  }
+
   public Artifact build() {
     ImmutableList.Builder<Artifact> inputs = ImmutableList.builder();
     ImmutableList.Builder<Artifact> outputs = ImmutableList.builder();
@@ -184,6 +193,9 @@
     commandLine.addExecPath("--shrunkResources", shrunkResourcesOut);
     outputs.add(shrunkResourcesOut);
 
+    commandLine.addExecPath("--log", logOut);
+    outputs.add(logOut);
+
     ruleContext.registerAction(spawnActionBuilder
         .addTool(sdk.getAapt())
         .addInputs(inputs.build())
diff --git a/src/tools/android/java/com/google/devtools/build/android/ResourceShrinker.java b/src/tools/android/java/com/google/devtools/build/android/ResourceShrinker.java
index 29c5965..160c045 100644
--- a/src/tools/android/java/com/google/devtools/build/android/ResourceShrinker.java
+++ b/src/tools/android/java/com/google/devtools/build/android/ResourceShrinker.java
@@ -79,6 +79,10 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.logging.FileHandler;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
@@ -119,14 +123,13 @@
  */
 public class ResourceShrinker {
 
-  private static final Logger logger = Logger.getLogger(ResourceShrinker.class.getName());
-
   public static final int TYPICAL_RESOURCE_COUNT = 200;
   private final Set<String> resourcePackages;
   private final Path rTxt;
   private final Path classesJar;
   private final Path mergedManifest;
   private final Path mergedResourceDir;
+  private final Logger logger;
 
   /**
    * The computed set of unused resources
@@ -158,12 +161,30 @@
       @NonNull Path rTxt,
       @NonNull Path classesJar,
       @NonNull Path manifest,
-      @NonNull Path resources) {
+      @NonNull Path resources,
+      Path logFile) {
     this.resourcePackages = resourcePackages;
     this.rTxt = rTxt;
     this.classesJar = classesJar;
     this.mergedManifest = manifest;
     this.mergedResourceDir = resources;
+
+    this.logger = Logger.getLogger(getClass().getName());
+    logger.setLevel(Level.FINE);
+    if (logFile != null) {
+      try {
+        FileHandler fileHandler = new FileHandler(logFile.toString());
+        fileHandler.setLevel(Level.FINE);
+        fileHandler.setFormatter(new Formatter(){
+          @Override public String format(LogRecord record) {
+            return record.getMessage() + "\n";
+          }
+        });
+        logger.addHandler(fileHandler);
+      } catch (SecurityException | IOException e) {
+        logger.warning(String.format("Unable to open '%s' to write log.", logFile));
+      }
+    }
   }
 
   public void shrink(Path destinationDir) throws IOException,
@@ -425,8 +446,8 @@
         roots.add(resource);
       }
     }
-    logger.fine(String.format("The root reachable resources are: %s",
-        Joiner.on(",\n   ").join(roots)));
+    logger.fine(String.format("The root reachable resources are:\n  %s",
+        Joiner.on(",\n  ").join(roots)));
     Map<Resource, Boolean> seen = new IdentityHashMap<>(resources.size());
     for (Resource root : roots) {
       visit(root, seen);
diff --git a/src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java b/src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java
index 7846844..1994e8a 100644
--- a/src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java
+++ b/src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java
@@ -129,6 +129,13 @@
         converter = PathConverter.class,
         help = "Path to where the shrunk resource.ap_ should be written.")
     public Path shrunkResources;
+
+    @Option(name = "log",
+        defaultValue = "null",
+        category = "output",
+        converter = PathConverter.class,
+        help = "Path to where the shrinker log should be written.")
+    public Path log;
   }
 
   private static AaptConfigOptions aaptConfigOptions;
@@ -194,7 +201,8 @@
           options.rTxt,
           options.shrunkJar,
           options.primaryManifest,
-          resourceFiles.resolve("res"));
+          resourceFiles.resolve("res"),
+          options.log);
 
       resourceShrinker.shrink(shrunkResources);
       logger.fine(String.format("Shrinking resources finished at %sms",