aboutsummaryrefslogtreecommitdiff
path: root/java/base.go
diff options
context:
space:
mode:
authormosimchah <mosimchah@gmail.com>2025-12-02 09:27:38 -0500
committermosimchah <mosimchah@gmail.com>2025-12-02 09:27:38 -0500
commitc7bade461dc55726f62997d13a48582f7c4b4655 (patch)
treeea0588da76060a2038f54f67efd046ca77634b10 /java/base.go
parent0f5414d19317805e8bbbe7c4db5f0fd78769bad5 (diff)
parent89d78cff8b00d3b20a90074635c3fe5a2ee49474 (diff)
Merge branch 'lineage-23.1' of https://github.com/LineageOS/android_build_soong into HEADw16.1
* 'lineage-23.1' of https://github.com/LineageOS/android_build_soong: (528 commits) Revert "install_symlink: Make symlink target configurable" Reapply "Clear as much of cc.Module as possible after GenerateBuildActions" Revert "rust: config: Fix missing CPU variant LD flags in Rust" Rename build-flag in outdir Revert^4 "cipd: Default CIPD proxy server to on, add opt-out" Convert check-vintf-all to phony with actions Create a partial implementation of check-vintf-all for soong-only Configure RBE rust pool based on build variant Revert^3 "Add sdk version check to arr" Add jdk.internal.invoke to the allowlist Make droid always depend on symbols zip Import Device and Odm skus Don't install gob_gen in Soong Remove bazel reference from run_integration_tests.sh Fix bootstrap_test.sh Don't panic in aconfig libraries when AllowMissingDependencies is set Avoid returning nil paths from PathForModuleSrc Revert "Flag controled clang version" Rework module target dependencies on required deps Revert^2 "Add sdk version check to arr" ... Change-Id: I6e9a63fa14fda917a42e426e5dcebbad7f67e1de
Diffstat (limited to 'java/base.go')
-rw-r--r--java/base.go297
1 files changed, 232 insertions, 65 deletions
diff --git a/java/base.go b/java/base.go
index 8aa0109d0..7d56522b9 100644
--- a/java/base.go
+++ b/java/base.go
@@ -15,7 +15,6 @@
package java
import (
- "encoding/gob"
"fmt"
"path/filepath"
"reflect"
@@ -33,6 +32,8 @@ import (
"android/soong/java/config"
)
+//go:generate go run ../../blueprint/gobtools/codegen/gob_gen.go
+
// This file contains the definition and the implementation of the base module that most
// source-based Java module structs embed.
@@ -94,12 +95,18 @@ type CommonProperties struct {
// See kotlinc's `-language-version` flag.
Kotlin_lang_version *string
+ // Whether this target supports compilation with the kotlin-incremental-client.
+ Kotlin_incremental *bool
+
// list of java libraries that will be in the classpath
Libs []string `android:"arch_variant"`
// list of java libraries that will be compiled into the resulting jar
Static_libs proptools.Configurable[[]string] `android:"arch_variant"`
+ // List of Kotlin libraries whose `internal` members are accessible to this library
+ Associates []string `android:"arch_variant"`
+
// manifest file to be included in resulting jar
Manifest *string `android:"path"`
@@ -229,6 +236,11 @@ type CommonProperties struct {
// If true, then only the headers are built and not the implementation jar.
Headers_only *bool
+ // If specified, this is used for this library's header jar, rather than generating it. This
+ // should only be used if the library adds nothing new to the header jars vs the provided path.
+ // For example, this could be used if the module only adds implementation code.
+ Header_jar_override string `android:"path,arch_variant"`
+
// A list of files or dependencies to make available to the build sandbox. This is
// useful if source files are symlinks, the targets of the symlinks must be listed here.
// Note that currently not all actions implemented by android_apps are sandboxed, so you
@@ -251,6 +263,9 @@ type CommonProperties struct {
// If true, the "Ravenizer" tool will remove all Mockito and DexMaker
// classes from the output jar.
Strip_mockito *bool
+
+ // Extra arguments passed to Ravenizer
+ Flags []string
}
// Contributing api surface of the stub module. Is not visible to bp modules, and should
@@ -505,11 +520,12 @@ type Module struct {
dexJarFile OptionalDexJarPath
// output file containing uninstrumented classes that will be instrumented by jacoco
- jacocoReportClassesFile android.Path
+ jacocoInfo JacocoInfo
// output file of the module, which may be a classes jar or a dex jar
- outputFile android.Path
- extraOutputFiles android.Paths
+ outputFile android.Path
+ installedOutputFile android.Path
+ extraOutputFiles android.Paths
exportAidlIncludeDirs android.Paths
ignoredAidlPermissionList android.Paths
@@ -867,6 +883,17 @@ func (j *Module) staticLibs(ctx android.BaseModuleContext) []string {
return j.properties.Static_libs.GetOrDefault(ctx, nil)
}
+func (j *Module) incrementalKotlin(config android.Config) bool {
+ incremental := proptools.BoolDefault(
+ j.properties.Kotlin_incremental, config.PartialCompileFlags().Enable_inc_kotlin)
+ nonIncrementalFlags := []string{"-Xmulti-platform", "-Xexpect-actual-classes"}
+ for _, flag := range nonIncrementalFlags {
+ incremental = incremental && !slices.Contains(j.properties.Kotlincflags, flag)
+ }
+
+ return incremental
+}
+
func (j *Module) deps(ctx android.BottomUpMutatorContext) {
if ctx.Device() {
j.linter.deps(ctx)
@@ -892,24 +919,7 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) {
traceRefs := j.dexProperties.Optimize.Trace_references_from.GetOrDefault(ctx, []string{})
ctx.AddVariationDependencies(nil, traceReferencesTag, traceRefs...)
- // For library dependencies that are component libraries (like stubs), add the implementation
- // as a dependency (dexpreopt needs to be against the implementation library, not stubs).
- for _, dep := range libDeps {
- if dep != nil {
- if component, ok := dep.(SdkLibraryComponentDependency); ok {
- if lib := component.OptionalSdkLibraryImplementation(); lib != nil {
- // Add library as optional if it's one of the optional compatibility libs or it's
- // explicitly listed in the optional_uses_libs property.
- tag := usesLibReqTag
- if android.InList(*lib, dexpreopt.OptionalCompatUsesLibs) ||
- android.InList(*lib, j.usesLibrary.usesLibraryProperties.Optional_uses_libs.GetOrDefault(ctx, nil)) {
- tag = usesLibOptTag
- }
- ctx.AddVariationDependencies(nil, tag, *lib)
- }
- }
- }
- }
+ j.usesLibrary.depsFromLibs(ctx, libDeps)
ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), pluginTag, j.properties.Plugins...)
ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), kotlinPluginTag, j.properties.Kotlin_plugins...)
@@ -943,10 +953,17 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) {
ctx.AddVariationDependencies(nil, staticLibTag, "jacocoagent")
}
+ incremental := j.incrementalKotlin(ctx.Config())
if j.useCompose(ctx) {
- ctx.AddVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), kotlinPluginTag,
+ if incremental {
+ ctx.AddVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), composeEmbeddablePluginTag,
+ "kotlin-compose-compiler-embeddable-plugin")
+ }
+ ctx.AddVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), composePluginTag,
"kotlin-compose-compiler-plugin")
}
+
+ j.EmbeddableSdkLibraryComponent.setComponentDependencyInfoProvider(ctx)
}
func hasSrcExt(srcs []string, ext string) bool {
@@ -1152,14 +1169,6 @@ func (j *Module) collectJavacFlags(
return flags
}
-func (j *Module) AddJSONData(d *map[string]interface{}) {
- (&j.ModuleBase).AddJSONData(d)
- (*d)["Java"] = map[string]interface{}{
- "SourceExtensions": j.sourceExtensions,
- }
-
-}
-
func (j *Module) addGeneratedSrcJars(path android.Path) {
j.properties.Generated_srcjars = append(j.properties.Generated_srcjars, path)
}
@@ -1284,10 +1293,10 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
transitiveStaticLibsHeaderJars := deps.transitiveStaticLibsHeaderJars
- localHeaderJars, combinedHeaderJarFile := j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName,
+ localHeaderJars, _, preJarjarHeaderJarFile := j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName,
extraCombinedJars)
- combinedHeaderJarFile, jarjared := j.jarjarIfNecessary(ctx, combinedHeaderJarFile, jarName, "turbine", false)
+ combinedHeaderJarFile, jarjared := j.jarjarIfNecessary(ctx, preJarjarHeaderJarFile, jarName, "turbine", false)
if jarjared {
localHeaderJars = android.Paths{combinedHeaderJarFile}
transitiveStaticLibsHeaderJars = nil
@@ -1301,6 +1310,9 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
return nil
}
j.headerJarFile = combinedHeaderJarFile
+ if deps.headerJarOverride.Valid() {
+ j.headerJarFile = deps.headerJarOverride.Path()
+ }
if len(localHeaderJars) > 0 {
ctx.CheckbuildFile(localHeaderJars...)
@@ -1312,6 +1324,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
j.outputFile = j.headerJarFile
return &JavaInfo{
HeaderJars: android.PathsIfNonNil(j.headerJarFile),
+ LocalHeaderJarsPreJarjar: android.PathsIfNonNil(preJarjarHeaderJarFile),
LocalHeaderJars: localHeaderJars,
TransitiveStaticLibsHeaderJars: depset.New(depset.PREORDER, localHeaderJars, transitiveStaticLibsHeaderJars),
TransitiveLibsHeaderJarsForR8: j.transitiveLibsHeaderJarsForR8,
@@ -1323,6 +1336,8 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
StubsLinkType: j.stubsLinkType,
AconfigIntermediateCacheOutputPaths: deps.aconfigProtoFiles,
SdkVersion: j.SdkVersion(ctx),
+ OverrideMinSdkVersion: j.overridableProperties.Min_sdk_version,
+ Installable: BoolDefault(j.properties.Installable, true),
}
}
@@ -1367,23 +1382,73 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
kotlincFlags = append(kotlincFlags, "-no-jdk")
}
+ var kotlincPluginFlags []string
for _, plugin := range deps.kotlinPlugins {
- kotlincFlags = append(kotlincFlags, "-Xplugin="+plugin.String())
+ kotlincPluginFlags = append(kotlincPluginFlags, "-Xplugin="+plugin.String())
+ }
+ if len(kotlincPluginFlags) > 0 {
+ // optimization.
+ ctx.Variable(pctx, "kotlincPluginFlags", strings.Join(kotlincPluginFlags, " "))
+ flags.kotlincPluginFlags += "$kotlincPluginFlags"
}
flags.kotlincDeps = append(flags.kotlincDeps, deps.kotlinPlugins...)
+ if deps.composePlugin.Valid() {
+ flags.composePluginFlag = "-Xplugin=" + deps.composePlugin.String()
+ ctx.Variable(pctx, "composePluginFlag", flags.composePluginFlag)
+ flags.kotlincDeps = append(flags.kotlincDeps, deps.composePlugin.Path())
+ }
+ if deps.composeEmbeddablePlugin.Valid() {
+ flags.composeEmbeddablePluginFlag = "-Xplugin=" + deps.composeEmbeddablePlugin.String()
+ ctx.Variable(pctx, "composeEmbeddablePluginFlag", flags.composeEmbeddablePluginFlag)
+ flags.kotlincDeps = append(flags.kotlincDeps, deps.composeEmbeddablePlugin.Path())
+ }
+
+ // TODO(b/403236545): Remove this once the Kotlin compiler version is >= 2.2.0.
+ if j.useCompose(ctx) {
+ kotlincFlags = append(kotlincFlags, "-P", "plugin:androidx.compose.compiler.plugins.kotlin:featureFlag=+OptimizeNonSkippingGroups")
+ }
+
if len(kotlincFlags) > 0 {
+ // Flags with `-J` as a prefix are meant to be passed to java directly.
+ // When running the kotlin-incremental-client, flags are first parsed by a bash
+ // script that eagerly takes all the leading arguments that start with `-J` and feeds
+ // them to java. Any `-J` arguments that occur elsewhere (i.e. after a non-J argument)
+ // fail to pass through to java as expected.
+ slices.SortStableFunc(kotlincFlags, func(a, b string) int {
+ aHasPrefix := strings.HasPrefix(a, "-J")
+ bHasPrefix := strings.HasPrefix(b, "-J")
+
+ // If only a has the prefix, it should come before b
+ if aHasPrefix && !bHasPrefix {
+ return -1
+ } else if bHasPrefix && !aHasPrefix {
+ return 1
+ }
+ return 0 // Otherwise maintain their order
+ })
// optimization.
ctx.Variable(pctx, "kotlincFlags", strings.Join(kotlincFlags, " "))
flags.kotlincFlags += "$kotlincFlags"
}
+ incrementalKotlin := j.incrementalKotlin(ctx.Config())
+
// Collect common .kt files for AIDEGen
j.expandIDEInfoCompiledSrcs = append(j.expandIDEInfoCompiledSrcs, kotlinCommonSrcFiles.Strings()...)
flags.kotlincClasspath = append(flags.kotlincClasspath, flags.bootClasspath...)
flags.kotlincClasspath = append(flags.kotlincClasspath, flags.classpath...)
+ kotlinJar := android.PathForModuleOut(ctx, "kotlin", jarName)
+ kotlinHeaderJar := android.PathForModuleOut(ctx, "kotlin_headers", jarName)
+
+ kotlinCompileData := KotlinCompileData{
+ diffFile: kotlinJar.ReplaceExtension(ctx, "source_diff"),
+ pcStateFileNew: kotlinJar.ReplaceExtension(ctx, "pc_state.new"),
+ pcStateFilePrior: kotlinJar.ReplaceExtension(ctx, "pc_state"),
+ }
+
if len(flags.processorPath) > 0 {
// Use kapt for annotation processing
kaptSrcJar := android.PathForModuleOut(ctx, "kapt", "kapt-sources.jar")
@@ -1396,9 +1461,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
flags.processors = nil
}
- kotlinJar := android.PathForModuleOut(ctx, "kotlin", jarName)
- kotlinHeaderJar := android.PathForModuleOut(ctx, "kotlin_headers", jarName)
- j.kotlinCompile(ctx, kotlinJar, kotlinHeaderJar, uniqueSrcFiles, kotlinCommonSrcFiles, srcJars, flags)
+ j.kotlinCompile(ctx, kotlinJar, kotlinHeaderJar, uniqueSrcFiles, kotlinCommonSrcFiles, srcJars, flags, kotlinCompileData, incrementalKotlin)
if ctx.Failed() {
return nil
}
@@ -1421,6 +1484,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
var localHeaderJars android.Paths
var shardingHeaderJars android.Paths
var repackagedHeaderJarFile android.Path
+ var combinedHeaderJarFile android.Path
if ctx.Device() && !ctx.Config().IsEnvFalse("TURBINE_ENABLED") && !disableTurbine {
if j.properties.Javac_shard_size != nil && *(j.properties.Javac_shard_size) > 0 {
enableSharding = true
@@ -1432,9 +1496,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
}
extraJars := slices.Clone(kotlinHeaderJars)
extraJars = append(extraJars, extraCombinedJars...)
- var combinedHeaderJarFile android.Path
- localHeaderJars, combinedHeaderJarFile = j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName, extraJars)
- shardingHeaderJars = localHeaderJars
+ localHeaderJars, shardingHeaderJars, combinedHeaderJarFile = j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName, extraJars)
var jarjared bool
j.headerJarFile, jarjared = j.jarjarIfNecessary(ctx, combinedHeaderJarFile, jarName, "turbine", false)
@@ -1464,6 +1526,24 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
break
}
}
+
+ // turbine is disabled when API generating APs are present, in which case,
+ // we would want to process annotations before moving to incremental javac
+ var genAnnoSrcJar android.Path
+ if ctx.Device() && ctx.Config().PartialCompileFlags().Enable_inc_javac && disableTurbine {
+ srcJarsForTurbine := slices.Clone(srcJars)
+ if len(flags.processorPath) > 0 {
+ genAnnoSrcJar, _ = j.generateJavaAnnotations(ctx, jarName, -1, uniqueJavaFiles, srcJars, flags, nil)
+ flags.processorPath = nil
+ flags.processors = nil
+ srcJarsForTurbine = append(srcJarsForTurbine, genAnnoSrcJar)
+ }
+ // turbine was disabled, lets run it now
+ turbineExtraJars := slices.Clone(kotlinHeaderJars)
+ turbineExtraJars = append(turbineExtraJars, extraCombinedJars...)
+ _, shardingHeaderJars, _ = j.compileJavaHeader(ctx, uniqueJavaFiles, srcJarsForTurbine, deps, flags, jarName, turbineExtraJars)
+ }
+
var extraJarDeps android.Paths
if Bool(j.properties.Errorprone.Enabled) {
// If error-prone is enabled, enable errorprone flags on the regular
@@ -1486,7 +1566,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
errorprone := android.PathForModuleOut(ctx, "errorprone", jarName)
errorproneAnnoSrcJar := android.PathForModuleOut(ctx, "errorprone", "anno.srcjar")
- transformJavaToClasses(ctx, errorprone, -1, uniqueJavaFiles, srcJars, errorproneAnnoSrcJar, errorproneFlags, nil,
+ transformJavaToClasses(ctx, errorprone, -1, uniqueJavaFiles, srcJars, errorproneAnnoSrcJar, false, errorproneFlags, nil,
"errorprone", "errorprone")
extraJarDeps = append(extraJarDeps, errorprone)
@@ -1503,7 +1583,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
shardSrcs = android.ShardPaths(uniqueJavaFiles, shardSize)
for idx, shardSrc := range shardSrcs {
classes := j.compileJavaClasses(ctx, jarName, idx, shardSrc,
- nil, flags, extraJarDeps)
+ nil, nil, flags, extraJarDeps, nil)
classes, _ = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac-"+strconv.Itoa(idx))
localImplementationJars = append(localImplementationJars, classes)
}
@@ -1516,13 +1596,13 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
shardSrcJarsList := android.ShardPaths(srcJars, shardSize/5)
for idx, shardSrcJars := range shardSrcJarsList {
classes := j.compileJavaClasses(ctx, jarName, startIdx+idx,
- nil, shardSrcJars, flags, extraJarDeps)
+ nil, shardSrcJars, nil, flags, extraJarDeps, nil)
classes, _ = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac-"+strconv.Itoa(startIdx+idx))
localImplementationJars = append(localImplementationJars, classes)
}
}
} else {
- classes := j.compileJavaClasses(ctx, jarName, -1, uniqueJavaFiles, srcJars, flags, extraJarDeps)
+ classes := j.compileJavaClasses(ctx, jarName, -1, uniqueJavaFiles, srcJars, shardingHeaderJars, flags, extraJarDeps, genAnnoSrcJar)
classes, _ = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac")
localImplementationJars = append(localImplementationJars, classes)
}
@@ -1685,10 +1765,12 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
if j.ravenizer.enabled {
ravenizerInput := outputFile
ravenizerOutput := android.PathForModuleOut(ctx, "ravenizer", "", jarName)
- ravenizerArgs := ""
+
+ ravenizerArgs := j.properties.Ravenizer.Flags
if proptools.Bool(j.properties.Ravenizer.Strip_mockito) {
- ravenizerArgs = "--strip-mockito"
+ ravenizerArgs = append(ravenizerArgs, "--strip-mockito")
}
+
TransformRavenizer(ctx, ravenizerOutput, ravenizerInput, ravenizerArgs)
outputFile = ravenizerOutput
localImplementationJars = android.Paths{ravenizerOutput}
@@ -1835,7 +1917,11 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
// If r8/d8 provides a profile that matches the optimized dex, use that for dexpreopt.
if dexArtProfileOutput != nil {
- j.dexpreopter.SetRewrittenProfile(dexArtProfileOutput)
+ if concretePtr, ok := dexArtProfileOutput.(*android.OutputPath); ok {
+ if concretePtr != nil {
+ j.dexpreopter.SetRewrittenProfile(dexArtProfileOutput)
+ }
+ }
}
// merge dex jar with resources if necessary
@@ -1864,11 +1950,13 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
j.dexJarFile = makeDexJarPathFromPath(dexOutputFile)
// Dexpreopting
- libName := android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName())
- if j.SdkLibraryName() != nil && strings.HasSuffix(ctx.ModuleName(), ".impl") {
- libName = strings.TrimSuffix(libName, ".impl")
+ if dexArtProfileOutput != nil {
+ libName := android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName())
+ if j.SdkLibraryName() != nil && strings.HasSuffix(ctx.ModuleName(), ".impl") {
+ libName = strings.TrimSuffix(libName, ".impl")
+ }
+ j.dexpreopt(ctx, libName, dexOutputFile)
}
- j.dexpreopt(ctx, libName, dexOutputFile)
outputFile = dexOutputFile
@@ -1905,7 +1993,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
j.linter.javaLanguageLevel = flags.javaVersion.String()
j.linter.kotlinLanguageLevel = "1.3"
j.linter.compile_data = android.PathsForModuleSrc(ctx, j.properties.Compile_data)
- if !apexInfo.IsForPlatform() && ctx.Config().UnbundledBuildApps() {
+ if !apexInfo.IsForPlatform() && ctx.Config().HasUnbundledBuildApps() {
j.linter.buildModuleReportZip = true
}
j.linter.lint(ctx)
@@ -1925,11 +2013,16 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
// Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource
j.outputFile = outputFile.WithoutRel()
+ if deps.headerJarOverride.Valid() {
+ j.headerJarFile = deps.headerJarOverride.Path()
+ }
return &JavaInfo{
- HeaderJars: android.PathsIfNonNil(j.headerJarFile),
- RepackagedHeaderJars: android.PathsIfNonNil(repackagedHeaderJarFile),
+ HeaderJars: android.PathsIfNonNil(j.headerJarFile),
+ LocalHeaderJarsPreJarjar: android.PathsIfNonNil(combinedHeaderJarFile),
+ RepackagedHeaderJars: android.PathsIfNonNil(repackagedHeaderJarFile),
LocalHeaderJars: localHeaderJars,
+ KotlinHeaderJars: kotlinHeaderJars,
TransitiveStaticLibsHeaderJars: depset.New(depset.PREORDER, localHeaderJars, transitiveStaticLibsHeaderJars),
TransitiveStaticLibsImplementationJars: completeStaticLibsImplementationJars,
TransitiveStaticLibsResourceJars: completeStaticLibsResourceJars,
@@ -1946,11 +2039,13 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
ExportedPlugins: j.exportedPluginJars,
ExportedPluginClasses: j.exportedPluginClasses,
ExportedPluginDisableTurbine: j.exportedDisableTurbine,
- JacocoReportClassesFile: j.jacocoReportClassesFile,
+ JacocoInfo: j.jacocoInfo,
StubsLinkType: j.stubsLinkType,
AconfigIntermediateCacheOutputPaths: j.aconfigCacheFiles,
SdkVersion: j.SdkVersion(ctx),
OutputFile: j.outputFile,
+ OverrideMinSdkVersion: j.overridableProperties.Min_sdk_version,
+ Installable: BoolDefault(j.properties.Installable, true),
}
}
@@ -2018,7 +2113,7 @@ func enableErrorproneFlags(flags javaBuilderFlags) javaBuilderFlags {
}
func (j *Module) compileJavaClasses(ctx android.ModuleContext, jarName string, idx int,
- srcFiles, srcJars android.Paths, flags javaBuilderFlags, extraJarDeps android.Paths) android.Path {
+ srcFiles, srcJars, localHeaderJars android.Paths, flags javaBuilderFlags, extraJarDeps android.Paths, genAnnoSrcJar android.Path) android.Path {
kzipName := pathtools.ReplaceExtension(jarName, "kzip")
annoSrcJar := android.PathForModuleOut(ctx, "javac", "anno.srcjar")
@@ -2029,7 +2124,13 @@ func (j *Module) compileJavaClasses(ctx android.ModuleContext, jarName string, i
}
classes := android.PathForModuleOut(ctx, "javac", jarName)
- TransformJavaToClasses(ctx, classes, idx, srcFiles, srcJars, annoSrcJar, flags, extraJarDeps)
+ // enable incremental javac when corresponding flags are enabled and
+ // header jars are present
+ if ctx.Config().PartialCompileFlags().Enable_inc_javac && len(localHeaderJars) > 0 {
+ TransformJavaToClassesInc(ctx, classes, srcFiles, srcJars, localHeaderJars, annoSrcJar, flags, extraJarDeps, genAnnoSrcJar)
+ } else {
+ TransformJavaToClasses(ctx, classes, idx, srcFiles, srcJars, annoSrcJar, flags, extraJarDeps)
+ }
if ctx.Config().EmitXrefRules() && ctx.Module() == ctx.PrimaryModule() {
extractionFile := android.PathForModuleOut(ctx, kzipName)
@@ -2044,6 +2145,20 @@ func (j *Module) compileJavaClasses(ctx android.ModuleContext, jarName string, i
return classes
}
+func (j *Module) generateJavaAnnotations(ctx android.ModuleContext, jarName string, idx int,
+ srcFiles, srcJars android.Paths, flags javaBuilderFlags, extraJarDeps android.Paths) (android.Path, android.Path) {
+
+ annoSrcJar := android.PathForModuleOut(ctx, "javac-apt", "anno.srcjar")
+ if idx >= 0 {
+ annoSrcJar = android.PathForModuleOut(ctx, "javac-apt", "anno-"+strconv.Itoa(idx)+".srcjar")
+ jarName += strconv.Itoa(idx)
+ }
+
+ classes := android.PathForModuleOut(ctx, "javac-apt", jarName)
+ GenerateJavaAnnotations(ctx, classes, idx, srcFiles, srcJars, annoSrcJar, flags, extraJarDeps)
+ return annoSrcJar, classes
+}
+
// Check for invalid kotlinc flags. Only use this for flags explicitly passed by the user,
// since some of these flags may be used internally.
func CheckKotlincFlags(ctx android.ModuleContext, flags []string) {
@@ -2073,7 +2188,21 @@ 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) (localHeaderJars android.Paths, combinedHeaderJar android.Path) {
+ extraJars android.Paths) (localHeaderJars, localHeaderJarsForSharding android.Paths, combinedHeaderJar android.Path) {
+
+ if deps.headerJarOverride.Valid() {
+ // If we are sharding, we need the pre-jarjar override path; localHeaderJars always
+ // needs the jarjared version.
+ localHeaderJars = append(android.Paths{deps.headerJarOverride.Path()}, extraJars...)
+ var headerJar android.Path
+ if deps.headerJarOverridePreJarjar.Valid() {
+ headerJar = deps.headerJarOverridePreJarjar.Path()
+ } else {
+ headerJar = deps.headerJarOverride.Path()
+ }
+ localHeaderJarsForSharding = append(android.Paths{headerJar}, extraJars...)
+ return localHeaderJars, localHeaderJarsForSharding, deps.headerJarOverride.Path()
+ }
if len(srcFiles) > 0 || len(srcJars) > 0 {
// Compile java sources into turbine.jar.
@@ -2089,13 +2218,14 @@ func (j *Module) compileJavaHeader(ctx android.ModuleContext, srcFiles, srcJars
depSet := depset.New(depset.PREORDER, localHeaderJars, deps.transitiveStaticLibsHeaderJars)
jars := depSet.ToList()
+ var combinedHeaderJarOutputPath android.WritablePath
// we cannot skip the combine step for now if there is only one jar
// since we have to strip META-INF/TRANSITIVE dir from turbine.jar
- combinedHeaderJarOutputPath := android.PathForModuleOut(ctx, "turbine-combined", jarName)
+ combinedHeaderJarOutputPath = android.PathForModuleOut(ctx, "turbine-combined", jarName)
TransformJarsToJar(ctx, combinedHeaderJarOutputPath, "for turbine", jars, android.OptionalPath{},
false, nil, []string{"META-INF/TRANSITIVE"})
- return localHeaderJars, combinedHeaderJarOutputPath
+ return localHeaderJars, localHeaderJars, combinedHeaderJarOutputPath
}
func (j *Module) instrument(ctx android.ModuleContext, flags javaBuilderFlags,
@@ -2106,7 +2236,12 @@ func (j *Module) instrument(ctx android.ModuleContext, flags javaBuilderFlags,
jacocoInstrumentJar(ctx, instrumentedJar, jacocoReportClassesFile, classesJar, specs)
- j.jacocoReportClassesFile = jacocoReportClassesFile
+ j.jacocoInfo.ReportClassesFile = jacocoReportClassesFile
+ j.jacocoInfo.ModuleName = android.ModuleNameWithPossibleOverride(ctx)
+ // Allow overriding the class before instrument() is called
+ if j.jacocoInfo.Class == "" {
+ j.jacocoInfo.Class = "JAVA_LIBRARIES"
+ }
return instrumentedJar
}
@@ -2251,8 +2386,8 @@ func (j *Module) Stem() string {
return j.stem
}
-func (j *Module) JacocoReportClassesFile() android.Path {
- return j.jacocoReportClassesFile
+func (j *Module) JacocoInfo() JacocoInfo {
+ return j.jacocoInfo
}
func (j *Module) collectTransitiveSrcFiles(ctx android.ModuleContext, mine android.Paths) {
@@ -2463,6 +2598,15 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
deps.disableTurbine = deps.disableTurbine || dep.ExportedPluginDisableTurbine
transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars)
+ case headerJarOverrideTag:
+ if dep.HeaderJars == nil {
+ ctx.ModuleErrorf("%s does not provide header jars", otherName)
+ } else if len(dep.HeaderJars) > 1 {
+ ctx.ModuleErrorf("%s provides too many header jars", otherName)
+ } else {
+ deps.headerJarOverride = android.OptionalPathForPath(dep.HeaderJars[0])
+ deps.headerJarOverridePreJarjar = android.OptionalPathForPath(dep.LocalHeaderJarsPreJarjar[0])
+ }
case java9LibTag:
deps.java9Classpath = append(deps.java9Classpath, dep.HeaderJars...)
transitiveJava9ClasspathHeaderJars = append(transitiveJava9ClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars)
@@ -2519,6 +2663,18 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
} else {
ctx.PropertyErrorf("exported_plugins", "%q is not a java_plugin module", otherName)
}
+ case composeEmbeddablePluginTag:
+ if _, ok := android.OtherModuleProvider(ctx, module, KotlinPluginInfoProvider); ok {
+ deps.composeEmbeddablePlugin = android.OptionalPathForPath(dep.ImplementationAndResourcesJars[0])
+ } else {
+ ctx.PropertyErrorf("kotlin_plugins", "%q is not a kotlin_plugin module", otherName)
+ }
+ case composePluginTag:
+ if _, ok := android.OtherModuleProvider(ctx, module, KotlinPluginInfoProvider); ok {
+ deps.composePlugin = android.OptionalPathForPath(dep.ImplementationAndResourcesJars[0])
+ } else {
+ ctx.PropertyErrorf("kotlin_plugins", "%q is not a kotlin_plugin module", otherName)
+ }
case kotlinPluginTag:
if _, ok := android.OtherModuleProvider(ctx, module, KotlinPluginInfoProvider); ok {
deps.kotlinPlugins = append(deps.kotlinPlugins, dep.ImplementationAndResourcesJars...)
@@ -2556,6 +2712,8 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
case staticLibTag:
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...)
}
+ } else if dep, ok := android.OtherModuleProvider(ctx, module, DroidStubsInfoProvider); ok {
+ deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.AconfigProtoFiles...)
} else {
switch tag {
case bootClasspathTag:
@@ -2645,6 +2803,7 @@ const (
RenameUseExclude
)
+// @auto-generate: gob
type JarJarProviderData struct {
// Mapping of class names: original --> renamed. If the value is "", the class will be
// renamed by the next rdep that has the jarjar_prefix attribute (or this module if it has
@@ -2669,12 +2828,11 @@ var overridableJarJarPrefix = "com.android.internal.hidden_from_bootclasspath"
func init() {
android.SetJarJarPrefixHandler(mergeJarJarPrefixes)
-
- gob.Register(BaseJarJarProviderData{})
}
// BaseJarJarProviderData contains information that will propagate across dependencies regardless of
// whether they are java modules or not.
+// @auto-generate: gob
type BaseJarJarProviderData struct {
JarJarProviderData JarJarProviderData
}
@@ -2849,6 +3007,15 @@ func (this Module) GetDebugString() string {
// Merge the jarjar rules we inherit from our dependencies, any that have been added directly to
// us, and if it's been set, apply the jarjar_prefix property to rename them.
func (module *Module) collectJarJarRules(ctx android.ModuleContext) *JarJarProviderData {
+
+ // Stop collect jarjar_prefix jarjar rules if the module has test sdk scope.
+ // If a module uses test API scope, which means in its source code and static dependencies
+ // it could only use API exposed through the test surface. So it should not apply the jarjar
+ // rules set by any bootclass path jar
+ if ctx.Config().ReleaseJarjarFlagsInFramework() && module.SdkVersion(ctx).Kind == android.SdkTest {
+ return nil
+ }
+
// Gather repackage information from deps
result := collectDirectDepsProviders(ctx)