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",