Prepend header jar for sharded javac compilation
When compiling without sharding javac will prefer classes built from source over classes in the classpath. Compiling with sharding puts the header classes for all the sources onto the classpath, including the sources that are not part of the current shard. Emulate the behavior when building without sharding by putting the header jar first on the classpath so classes are resolved from the rest of the sources before the real classpath. Also switch to using the header jar without static libs dependencies merged in, as those will already be present in the classpath. Test: m framework-minus-apex Test: m services.core Test: TestSharding Change-Id: Id11b39c15d89ce70da27d746a5c7e6b603c3c0f9
This commit is contained in:
20
java/base.go
20
java/base.go
@@ -1066,7 +1066,7 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) {
|
||||
j.compiledSrcJars = srcJars
|
||||
|
||||
enableSharding := false
|
||||
var headerJarFileWithoutJarjar android.Path
|
||||
var headerJarFileWithoutDepsOrJarjar android.Path
|
||||
if ctx.Device() && !ctx.Config().IsEnvFalse("TURBINE_ENABLED") && !deps.disableTurbine {
|
||||
if j.properties.Javac_shard_size != nil && *(j.properties.Javac_shard_size) > 0 {
|
||||
enableSharding = true
|
||||
@@ -1076,7 +1076,7 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) {
|
||||
// allow for the use of annotation processors that do function correctly
|
||||
// with sharding enabled. See: b/77284273.
|
||||
}
|
||||
headerJarFileWithoutJarjar, j.headerJarFile =
|
||||
headerJarFileWithoutDepsOrJarjar, j.headerJarFile =
|
||||
j.compileJavaHeader(ctx, uniqueSrcFiles, srcJars, deps, flags, jarName, kotlinJars)
|
||||
if ctx.Failed() {
|
||||
return
|
||||
@@ -1105,7 +1105,9 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) {
|
||||
}
|
||||
|
||||
if enableSharding {
|
||||
flags.classpath = append(flags.classpath, headerJarFileWithoutJarjar)
|
||||
if headerJarFileWithoutDepsOrJarjar != nil {
|
||||
flags.classpath = append(classpath{headerJarFileWithoutDepsOrJarjar}, flags.classpath...)
|
||||
}
|
||||
shardSize := int(*(j.properties.Javac_shard_size))
|
||||
var shardSrcs []android.Paths
|
||||
if len(uniqueSrcFiles) > 0 {
|
||||
@@ -1508,7 +1510,7 @@ func CheckKotlincFlags(ctx android.ModuleContext, flags []string) {
|
||||
|
||||
func (j *Module) compileJavaHeader(ctx android.ModuleContext, srcFiles, srcJars android.Paths,
|
||||
deps deps, flags javaBuilderFlags, jarName string,
|
||||
extraJars android.Paths) (headerJar, jarjarHeaderJar android.Path) {
|
||||
extraJars android.Paths) (headerJar, jarjarAndDepsHeaderJar android.Path) {
|
||||
|
||||
var jars android.Paths
|
||||
if len(srcFiles) > 0 || len(srcJars) > 0 {
|
||||
@@ -1519,6 +1521,7 @@ func (j *Module) compileJavaHeader(ctx android.ModuleContext, srcFiles, srcJars
|
||||
return nil, nil
|
||||
}
|
||||
jars = append(jars, turbineJar)
|
||||
headerJar = turbineJar
|
||||
}
|
||||
|
||||
jars = append(jars, extraJars...)
|
||||
@@ -1532,20 +1535,19 @@ func (j *Module) compileJavaHeader(ctx android.ModuleContext, srcFiles, srcJars
|
||||
combinedJar := android.PathForModuleOut(ctx, "turbine-combined", jarName)
|
||||
TransformJarsToJar(ctx, combinedJar, "for turbine", jars, android.OptionalPath{},
|
||||
false, nil, []string{"META-INF/TRANSITIVE"})
|
||||
headerJar = combinedJar
|
||||
jarjarHeaderJar = combinedJar
|
||||
jarjarAndDepsHeaderJar = combinedJar
|
||||
|
||||
if j.expandJarjarRules != nil {
|
||||
// Transform classes.jar into classes-jarjar.jar
|
||||
jarjarFile := android.PathForModuleOut(ctx, "turbine-jarjar", jarName)
|
||||
TransformJarJar(ctx, jarjarFile, headerJar, j.expandJarjarRules)
|
||||
jarjarHeaderJar = jarjarFile
|
||||
TransformJarJar(ctx, jarjarFile, jarjarAndDepsHeaderJar, j.expandJarjarRules)
|
||||
jarjarAndDepsHeaderJar = jarjarFile
|
||||
if ctx.Failed() {
|
||||
return nil, nil
|
||||
}
|
||||
}
|
||||
|
||||
return headerJar, jarjarHeaderJar
|
||||
return headerJar, jarjarAndDepsHeaderJar
|
||||
}
|
||||
|
||||
func (j *Module) instrument(ctx android.ModuleContext, flags javaBuilderFlags,
|
||||
|
@@ -988,11 +988,11 @@ func TestSharding(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
barHeaderJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
|
||||
barHeaderJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
|
||||
for i := 0; i < 3; i++ {
|
||||
barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i))
|
||||
if !strings.Contains(barJavac.Args["classpath"], barHeaderJar) {
|
||||
t.Errorf("bar javac classpath %v does not contain %q", barJavac.Args["classpath"], barHeaderJar)
|
||||
if !strings.HasPrefix(barJavac.Args["classpath"], "-classpath "+barHeaderJar+":") {
|
||||
t.Errorf("bar javac classpath %v does start with %q", barJavac.Args["classpath"], barHeaderJar)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user