public abstract class AbstractShrinker<T>
extends java.lang.Object
FullRunShrinker and IncrementalShrinker.| Modifier and Type | Class and Description |
|---|---|
static class |
AbstractShrinker.CounterSet
Set of counters, for keeping different sets of reachable nodes for different purposes.
|
| Modifier and Type | Field and Description |
|---|---|
protected com.android.ide.common.internal.WaitableExecutor |
mExecutor |
protected ShrinkerGraph<T> |
mGraph |
protected ShrinkerLogger |
mShrinkerLogger |
| Modifier | Constructor and Description |
|---|---|
protected |
AbstractShrinker(ShrinkerGraph<T> graph,
com.android.ide.common.internal.WaitableExecutor executor,
ShrinkerLogger shrinkerLogger,
BytecodeVersion bytecodeVersion) |
| Modifier and Type | Method and Description |
|---|---|
protected java.util.Optional<java.io.File> |
chooseOutputFile(T klass,
java.io.File classFile,
java.lang.Iterable<com.android.build.api.transform.TransformInput> inputs,
com.android.build.api.transform.TransformOutputProvider output)
Tries to determine the output class file, for rewriting the given class file.
|
protected static java.util.Collection<java.io.File> |
getAllDirectories(com.android.build.api.transform.TransformInput input)
Determines all directories where class files can be found in the given
TransformInput. |
protected static java.util.Collection<java.io.File> |
getAllJars(com.android.build.api.transform.TransformInput input)
Determines all directories where class files can be found in the given
TransformInput. |
protected void |
incrementCounter(T node,
DependencyType dependencyType,
AbstractShrinker.CounterSet counterSet,
Tracer<T> tracer,
Trace<T> trace)
Increments the counter on the given graph node.
|
protected boolean |
isProgramClass(T klass) |
static void |
logTime(java.lang.String section,
com.google.common.base.Stopwatch stopwatch) |
protected void |
resolveReferences(java.lang.Iterable<com.android.build.gradle.shrinker.PostProcessingData.UnresolvedReference<T>> unresolvedReferences)
Finds existing methods or fields (graph nodes) which encountered opcodes refer to.
|
protected byte[] |
rewrite(java.lang.String className,
java.io.File classFile,
java.util.Set<java.lang.String> membersToKeep,
java.util.function.Predicate<java.lang.String> keepInterface)
Rewrites the given class (read from file) to only include used methods and fields and
interfaces.
|
protected void |
setCounters(AbstractShrinker.CounterSet counterSet,
Tracer<T> tracer)
Walks the entire graph, starting from the roots, and increments counters for reachable nodes.
|
protected void |
updateClassFiles(java.lang.Iterable<T> classesToWrite,
java.lang.Iterable<java.io.File> classFilesToDelete,
java.lang.Iterable<com.android.build.api.transform.TransformInput> inputs,
com.android.build.api.transform.TransformOutputProvider output)
Writes updates class files to the outputs.
|
protected void |
waitForAllTasks() |
protected final com.android.ide.common.internal.WaitableExecutor mExecutor
protected final ShrinkerGraph<T> mGraph
protected final ShrinkerLogger mShrinkerLogger
protected AbstractShrinker(@NonNull
ShrinkerGraph<T> graph,
@NonNull
com.android.ide.common.internal.WaitableExecutor executor,
@NonNull
ShrinkerLogger shrinkerLogger,
@Nullable
BytecodeVersion bytecodeVersion)
@NonNull
protected java.util.Optional<java.io.File> chooseOutputFile(@NonNull
T klass,
@NonNull
java.io.File classFile,
@NonNull
java.lang.Iterable<com.android.build.api.transform.TransformInput> inputs,
@NonNull
com.android.build.api.transform.TransformOutputProvider output)
This will return Optional.empty() if the class is not part of the program to
shrink (e.g. comes from a platform JAR).
@NonNull
protected static java.util.Collection<java.io.File> getAllDirectories(@NonNull
com.android.build.api.transform.TransformInput input)
TransformInput.@NonNull
protected static java.util.Collection<java.io.File> getAllJars(@NonNull
com.android.build.api.transform.TransformInput input)
TransformInput.protected void incrementCounter(@NonNull
T node,
@NonNull
DependencyType dependencyType,
@NonNull
AbstractShrinker.CounterSet counterSet,
@NonNull
Tracer<T> tracer,
@NonNull
Trace<T> trace)
node - node to incrementdependencyType - type of counter to incrementcounterSet - set of counters to work ontracer - tracer for recording paths to nodestrace - trace of how we got hereprotected void resolveReferences(@NonNull
java.lang.Iterable<com.android.build.gradle.shrinker.PostProcessingData.UnresolvedReference<T>> unresolvedReferences)
protected boolean isProgramClass(@NonNull
T klass)
@NonNull
protected byte[] rewrite(@NonNull
java.lang.String className,
@NonNull
java.io.File classFile,
@NonNull
java.util.Set<java.lang.String> membersToKeep,
@NonNull
java.util.function.Predicate<java.lang.String> keepInterface)
throws java.io.IOException
byte[].java.io.IOExceptionprotected void setCounters(@NonNull
AbstractShrinker.CounterSet counterSet,
@NonNull
Tracer<T> tracer)
protected void updateClassFiles(@NonNull
java.lang.Iterable<T> classesToWrite,
@NonNull
java.lang.Iterable<java.io.File> classFilesToDelete,
@NonNull
java.lang.Iterable<com.android.build.api.transform.TransformInput> inputs,
@NonNull
com.android.build.api.transform.TransformOutputProvider output)
throws java.io.IOException
java.io.IOExceptionprotected void waitForAllTasks()
public static void logTime(java.lang.String section,
com.google.common.base.Stopwatch stopwatch)