diff options
Diffstat (limited to 'java/java.go')
| -rw-r--r-- | java/java.go | 86 | 
1 files changed, 59 insertions, 27 deletions
| diff --git a/java/java.go b/java/java.go index 97feb9bb2..72536cd6d 100644 --- a/java/java.go +++ b/java/java.go @@ -21,6 +21,7 @@ package java  import (  	"fmt"  	"path/filepath" +	"slices"  	"sort"  	"strings" @@ -2337,6 +2338,9 @@ type ImportProperties struct {  	// List of shared java libs that this module has dependencies to  	Libs []string +	// List of static java libs that this module has dependencies to +	Static_libs []string +  	// List of files to remove from the jar file(s)  	Exclude_files []string @@ -2389,9 +2393,10 @@ type Import struct {  	dexJarFileErr     error  	dexJarInstallFile android.Path -	combinedClasspathFile android.Path -	classLoaderContexts   dexpreopt.ClassLoaderContextMap -	exportAidlIncludeDirs android.Paths +	combinedImplementationFile android.Path +	combinedHeaderFile         android.Path +	classLoaderContexts        dexpreopt.ClassLoaderContextMap +	exportAidlIncludeDirs      android.Paths  	hideApexVariantFromMake bool @@ -2475,6 +2480,7 @@ func (j *Import) setStrictUpdatabilityLinting(bool) {  func (j *Import) DepsMutator(ctx android.BottomUpMutatorContext) {  	ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...) +	ctx.AddVariationDependencies(nil, staticLibTag, j.properties.Static_libs...)  	if ctx.Device() && Bool(j.dexProperties.Compile_dex) {  		sdkDeps(ctx, android.SdkContext(j), j.dexer) @@ -2504,23 +2510,13 @@ func (j *Import) commonBuildActions(ctx android.ModuleContext) {  func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {  	j.commonBuildActions(ctx) -	jars := android.PathsForModuleSrc(ctx, j.properties.Jars) - -	jarName := j.Stem() + ".jar" -	outputFile := android.PathForModuleOut(ctx, "combined", jarName) -	TransformJarsToJar(ctx, outputFile, "for prebuilts", jars, android.OptionalPath{}, -		false, j.properties.Exclude_files, j.properties.Exclude_dirs) -	if Bool(j.properties.Jetifier) { -		inputFile := outputFile -		outputFile = android.PathForModuleOut(ctx, "jetifier", jarName) -		TransformJetifier(ctx, outputFile, inputFile) -	} -	j.combinedClasspathFile = outputFile  	j.classLoaderContexts = make(dexpreopt.ClassLoaderContextMap)  	var flags javaBuilderFlags  	j.collectTransitiveHeaderJars(ctx) +	var staticJars android.Paths +	var staticHeaderJars android.Paths  	ctx.VisitDirectDeps(func(module android.Module) {  		tag := ctx.OtherModuleDependencyTag(module)  		if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { @@ -2530,6 +2526,8 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {  				flags.dexClasspath = append(flags.dexClasspath, dep.HeaderJars...)  			case staticLibTag:  				flags.classpath = append(flags.classpath, dep.HeaderJars...) +				staticJars = append(staticJars, dep.ImplementationAndResourcesJars...) +				staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...)  			case bootClasspathTag:  				flags.bootClasspath = append(flags.bootClasspath, dep.HeaderJars...)  			} @@ -2543,6 +2541,46 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {  		addCLCFromDep(ctx, module, j.classLoaderContexts)  	}) +	jars := android.PathsForModuleSrc(ctx, j.properties.Jars) +	jarName := j.Stem() + ".jar" + +	// Always pass the input jars to TransformJarsToJar, even if there is only a single jar, we need the output +	// file of the module to be named jarName. +	outputFile := android.PathForModuleOut(ctx, "combined", jarName) +	implementationJars := append(slices.Clone(jars), staticJars...) +	TransformJarsToJar(ctx, outputFile, "combine prebuilt implementation jars", implementationJars, android.OptionalPath{}, +		false, j.properties.Exclude_files, j.properties.Exclude_dirs) + +	// If no dependencies have separate header jars then there is no need to create a separate +	// header jar for this module. +	reuseImplementationJarAsHeaderJar := slices.Equal(staticJars, staticHeaderJars) + +	var headerOutputFile android.WritablePath +	if reuseImplementationJarAsHeaderJar { +		headerOutputFile = outputFile +	} else { +		headerJars := append(slices.Clone(jars), staticHeaderJars...) +		headerOutputFile = android.PathForModuleOut(ctx, "turbine-combined", jarName) +		TransformJarsToJar(ctx, headerOutputFile, "combine prebuilt header jars", headerJars, android.OptionalPath{}, +			false, j.properties.Exclude_files, j.properties.Exclude_dirs) +	} + +	if Bool(j.properties.Jetifier) { +		inputFile := outputFile +		outputFile = android.PathForModuleOut(ctx, "jetifier", jarName) +		TransformJetifier(ctx, outputFile, inputFile) + +		if !reuseImplementationJarAsHeaderJar { +			headerInputFile := headerOutputFile +			headerOutputFile = android.PathForModuleOut(ctx, "jetifier-headers", jarName) +			TransformJetifier(ctx, headerOutputFile, headerInputFile) +		} else { +			headerOutputFile = outputFile +		} +	} +	j.combinedHeaderFile = headerOutputFile +	j.combinedImplementationFile = outputFile +  	j.maybeInstall(ctx, jarName, outputFile)  	j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Aidl.Export_include_dirs) @@ -2626,11 +2664,11 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {  	}  	android.SetProvider(ctx, JavaInfoProvider, JavaInfo{ -		HeaderJars:                     android.PathsIfNonNil(j.combinedClasspathFile), +		HeaderJars:                     android.PathsIfNonNil(j.combinedHeaderFile),  		TransitiveLibsHeaderJars:       j.transitiveLibsHeaderJars,  		TransitiveStaticLibsHeaderJars: j.transitiveStaticLibsHeaderJars, -		ImplementationAndResourcesJars: android.PathsIfNonNil(j.combinedClasspathFile), -		ImplementationJars:             android.PathsIfNonNil(j.combinedClasspathFile), +		ImplementationAndResourcesJars: android.PathsIfNonNil(j.combinedImplementationFile), +		ImplementationJars:             android.PathsIfNonNil(j.combinedImplementationFile),  		AidlIncludeDirs:                j.exportAidlIncludeDirs,  		StubsLinkType:                  j.stubsLinkType,  		// TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts @@ -2658,7 +2696,7 @@ func (j *Import) maybeInstall(ctx android.ModuleContext, jarName string, outputF  func (j *Import) OutputFiles(tag string) (android.Paths, error) {  	switch tag {  	case "", ".jar": -		return android.Paths{j.combinedClasspathFile}, nil +		return android.Paths{j.combinedImplementationFile}, nil  	default:  		return nil, fmt.Errorf("unsupported module reference tag %q", tag)  	} @@ -2667,17 +2705,11 @@ func (j *Import) OutputFiles(tag string) (android.Paths, error) {  var _ android.OutputFileProducer = (*Import)(nil)  func (j *Import) HeaderJars() android.Paths { -	if j.combinedClasspathFile == nil { -		return nil -	} -	return android.Paths{j.combinedClasspathFile} +	return android.PathsIfNonNil(j.combinedHeaderFile)  }  func (j *Import) ImplementationAndResourcesJars() android.Paths { -	if j.combinedClasspathFile == nil { -		return nil -	} -	return android.Paths{j.combinedClasspathFile} +	return android.PathsIfNonNil(j.combinedImplementationFile)  }  func (j *Import) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { |