Add a soong wrapper for R8's tracereferences
Add a new traceReferences rule that wraps the base R8 tracereferences
command. This allows generating a set of keep rules after tracing
references from a given set of sources onto a given target jar.
This will be used to keep hidden/unannotated members of optimzed
libraries that may be referenced by other bundled libraries on the
platform.
Bug: 212737576
Test: m
Flag: EXEMPT basic soong rule addition
Change-Id: I92cbe8839ce68056311c7c38de181f2e5f7cb775
diff --git a/java/Android.bp b/java/Android.bp
index 911af83..99d9c38 100644
--- a/java/Android.bp
+++ b/java/Android.bp
@@ -78,6 +78,7 @@
"system_modules.go",
"systemserver_classpath_fragment.go",
"testing.go",
+ "tracereferences.go",
"tradefed.go",
],
testSrcs: [
diff --git a/java/config/config.go b/java/config/config.go
index 71025de..fdb8d78 100644
--- a/java/config/config.go
+++ b/java/config/config.go
@@ -173,6 +173,7 @@
pctx.HostBinToolVariable("R8Cmd", "r8")
pctx.HostBinToolVariable("ExtractR8RulesCmd", "extract-r8-rules")
pctx.HostBinToolVariable("ResourceShrinkerCmd", "resourceshrinker")
+ pctx.HostBinToolVariable("TraceReferencesCmd", "tracereferences")
pctx.HostBinToolVariable("HiddenAPICmd", "hiddenapi")
pctx.HostBinToolVariable("ExtractApksCmd", "extract_apks")
pctx.VariableFunc("TurbineJar", func(ctx android.PackageVarContext) string {
diff --git a/java/tracereferences.go b/java/tracereferences.go
new file mode 100644
index 0000000..342b6a6
--- /dev/null
+++ b/java/tracereferences.go
@@ -0,0 +1,54 @@
+// Copyright 2025 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package java
+
+import (
+ "android/soong/android"
+
+ "github.com/google/blueprint"
+)
+
+var traceReferences = pctx.AndroidStaticRule("traceReferences",
+ blueprint.RuleParams{
+ Command: `${config.TraceReferencesCmd} ` +
+ // Note that we suppress missing def errors, as we're only interested
+ // in the direct deps between the sources and target.
+ `--map-diagnostics:MissingDefinitionsDiagnostic error none ` +
+ `--keep-rules ` +
+ `--output ${out} ` +
+ `--target ${in} ` +
+ // `--source` and `--lib` are already prepended to each
+ // jar reference in the sources and libs joined string args.
+ `${sources} ` +
+ `${libs}`,
+ CommandDeps: []string{"${config.TraceReferencesCmd}"},
+ }, "sources", "libs")
+
+// Generates keep rules in output corresponding to any references from sources
+// (a list of jars) onto target (the referenced jar) that are not included in
+// libs (a list of external jars).
+func TraceReferences(ctx android.ModuleContext, sources android.Paths, target android.Path, libs android.Paths,
+ output android.WritablePath) {
+ ctx.Build(pctx, android.BuildParams{
+ Rule: traceReferences,
+ Input: target,
+ Output: output,
+ Implicits: append(sources, libs...),
+ Args: map[string]string{
+ "sources": android.JoinWithPrefix(sources.Strings(), "--source "),
+ "libs": android.JoinWithPrefix(libs.Strings(), "--lib "),
+ },
+ })
+}