Configuration
Basic Configuration¶
In order to enable Keeper on a particular variant, you must register the KeeperVariantMarker
extension in AGP’s VariantBuilder
API like so:
androidComponents {
beforeVariants { builder ->
if (shouldRunKeeperOnVariant()) {
builder.optInToKeeper() // Helpful extension function
}
}
}
Or in Groovy
androidComponents {
beforeVariants { builder ->
if (shouldRunKeeperOnVariant(builder)) {
builder.registerExtension(KeeperVariantMarker.class, KeeperVariantMarker.INSTANCE)
}
}
}
Keeper’s default behavior with no configuration effectively be a no-op, which isn’t what you want!
Advanced Configuration¶
Normally, your app variant’s minification task doesn’t depend on compilation of its corresponding
androidTest
variant. This means you can call assembleRelease
and assembleAndroidTestRelease
won’t inherently run. Keeper, however, changes this since it requires the compiled androidTest
sources in order to correctly infer how they use APIs in the app variant. For a production build,
you likely do want these “test-only” APIs removed if possible though. There are a few patterns to
better control this behavior via Gradle property.
Simplest solution¶
The simplest solution is to add a new build type that extends release
but is solely used for these
tests. This way it’s identical to release in everything except the name.
android {
buildTypes {
staging {
initWith release
}
}
testBuildType = "staging"
}
Now Keeper will only wire for the StagingAndroidTest build type and the assembleRelease
dependency
tree will remain untouched.
This is the recommended solution, since builds that need this plugin likely already have custom
logic in place for controlling testBuildType
and it avoids messing with your normal release build.
This is what we do internally at Slack as well.
Property-based Examples¶
Let’s assume an example command to build a production app with custom property productionBuild
.
./gradlew :myapp:assembleRelease -PproductionBuild=true
Use the testBuildType
option¶
If you avoid setting your testBuildType
to your “release” build type in a production build, then
Keeper won’t configure your release artifact to depend on test sources since your release variant
would no longer be the testedVariant
of any androidTest
variants.
android {
// ...
if (hasProperty("productionBuild")) {
testBuildType = "debug"
} else {
testBuildType = "release"
}
}
Avoid applying the plugin entirely¶
This is probably the simplest approach, but not as dynamic as controlling the testBuildType
.
if (!hasProperty("productionBuild")) {
apply plugin: "com.slack.keeper"
}
¶
Everyone’s project is different, so you should do whatever works for you! We’re open to suggestions of better ways to support configuration for this, so please do file issues if you have any proposals.
Custom R8 behavior¶
Keeper uses R8’s TraceReferences
CLI under the hood for rules inference. By default it uses R8 version
3.2.78
. If you want to customize what version is used, you can specify the dependency via the
keeperR8
configuration. Note that these must be tags from R8’s
r8-releases/raw
maven repo.
dependencies {
keeperR8 "com.android.tools:r8:x.y.z"
}
If you don’t want Keeper to automatically manage adding R8’s maven repo, you can set disable it
via automaticR8RepoManagement
. Note that you’ll need to manually add your own repo that the
keeperR8
configuration mentioned above can resolve from.
keeper {
automaticR8RepoManagement = false
}
If you want to add custom JVM arguments to its invocation (i.e. for debugging), you and set them
via the keeper
extension.
keeper {
/**
* Optional custom jvm arguments to pass into the R8 `PrintUses` execution. Useful if you want
* to enable debugging in R8. Default is empty.
*
* Example: `listOf("-Xdebug", "-Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y")`
*/
r8JvmArgs = []
}
TraceReferences¶
Heads up!
TraceReferences is still experimental. Before reporting issues, please check if it’s an issue with Keeper or TraceReferences itself before filing. If it’s an issue with TraceReferences, please file on the Android issue tracker instead: https://issuetracker.google.com/issues/new?component=326788
TraceReferences
is a new tool for generating Proguard rules based on one jar’s usage of classes
in another jar. It is the formal successor and long-term replacement for the current PrintUses
CLI
that Keeper currently uses.
keeper {
traceReferences {
// Invoking this enables it!
// Optional: extra arguments to pass to TraceReferences
arguments.set(listOf("--map-diagnostics:MissingDefinitionsDiagnostic", "error", "info"))
}
}
Note that this uses the R8 version controlled by the R8 version defined by the keeperR8
version.
If you want to change it, set the version in keeperR8
to whichever version you want (must be
higher than 3.0.9-dev
).