Declare ConfiguredJarList in specific fragment implementations.
Each specific classpath_fragment module knows what jars must be part
of the corresponding classpaths.proto config.
Note that bootclasspath_fragment does not implement classpath_fragment
yet, thus all boot jars and all system server jars go into corresponding
platform classpaths.
Bug: 180105615
Test: m && launch_cvd; atest CtsClasspathsTestCases
Change-Id: I6a8c7b0a5d17d62e790a441b8e2c5c1a816e7f30
diff --git a/java/classpath_fragment.go b/java/classpath_fragment.go
index 00e9591..2e05823 100644
--- a/java/classpath_fragment.go
+++ b/java/classpath_fragment.go
@@ -51,6 +51,10 @@
android.Module
classpathFragmentBase() *ClasspathFragmentBase
+
+ // ClasspathFragmentToConfiguredJarList returns android.ConfiguredJarList representation of all
+ // the jars in this classpath fragment.
+ ClasspathFragmentToConfiguredJarList(ctx android.ModuleContext) android.ConfiguredJarList
}
// ClasspathFragmentBase is meant to be embedded in any module types that implement classpathFragment;
@@ -84,24 +88,26 @@
maxSdkVersion int32
}
-func (c *ClasspathFragmentBase) generateClasspathProtoBuildActions(ctx android.ModuleContext) {
+// Converts android.ConfiguredJarList into a list of classpathJars for each given classpathType.
+func configuredJarListToClasspathJars(ctx android.ModuleContext, configuredJars android.ConfiguredJarList, classpaths ...classpathType) []classpathJar {
+ paths := configuredJars.DevicePaths(ctx.Config(), android.Android)
+ jars := make([]classpathJar, 0, len(paths)*len(classpaths))
+ for i := 0; i < len(paths); i++ {
+ for _, classpathType := range classpaths {
+ jars = append(jars, classpathJar{
+ classpath: classpathType,
+ path: paths[i],
+ })
+ }
+ }
+ return jars
+}
+
+func (c *ClasspathFragmentBase) generateClasspathProtoBuildActions(ctx android.ModuleContext, jars []classpathJar) {
outputFilename := ctx.ModuleName() + ".pb"
c.outputFilepath = android.PathForModuleOut(ctx, outputFilename).OutputPath
c.installDirPath = android.PathForModuleInstall(ctx, "etc", "classpaths")
- var jars []classpathJar
- switch c.classpathType {
- case BOOTCLASSPATH:
- jars = appendClasspathJar(jars, BOOTCLASSPATH, defaultBootclasspath(ctx)...)
- jars = appendClasspathJar(jars, DEX2OATBOOTCLASSPATH, defaultBootImageConfig(ctx).getAnyAndroidVariant().dexLocationsDeps...)
- case SYSTEMSERVERCLASSPATH:
- jars = appendClasspathJar(jars, SYSTEMSERVERCLASSPATH, systemServerClasspath(ctx)...)
- default:
- // Only supported classpath fragments are BOOTCLASSPATH and SYSTEMSERVERCLASSPATH.
- // DEX2OATBOOTCLASSPATH is a special case of BOOTCLASSPATH and is auto-generated.
- panic(fmt.Errorf("found %v, expected either BOOTCLASSPATH or SYSTEMSERVERCLASSPATH", c.classpathType))
- }
-
generatedJson := android.PathForModuleOut(ctx, outputFilename+".json")
writeClasspathsJson(ctx, generatedJson, jars)
@@ -137,19 +143,8 @@
android.WriteFileRule(ctx, output, content.String())
}
-func appendClasspathJar(slice []classpathJar, classpathType classpathType, paths ...string) (result []classpathJar) {
- result = append(result, slice...)
- for _, path := range paths {
- result = append(result, classpathJar{
- path: path,
- classpath: classpathType,
- })
- }
- return
-}
-
func (c *ClasspathFragmentBase) androidMkEntries() []android.AndroidMkEntries {
- return []android.AndroidMkEntries{android.AndroidMkEntries{
+ return []android.AndroidMkEntries{{
Class: "ETC",
OutputFile: android.OptionalPathForPath(c.outputFilepath),
ExtraEntries: []android.AndroidMkExtraEntriesFunc{