diff options
Diffstat (limited to 'java/java.go')
| -rw-r--r-- | java/java.go | 81 |
1 files changed, 68 insertions, 13 deletions
diff --git a/java/java.go b/java/java.go index 00ee5319b..8179df8c0 100644 --- a/java/java.go +++ b/java/java.go @@ -281,6 +281,9 @@ type Module struct { // list of extra progurad flag files extraProguardFlagFiles android.Paths + + // list of SDK lib names that this java moudule is exporting + exportedSdkLibs []string } func (j *Module) Srcs() android.Paths { @@ -293,6 +296,7 @@ type Dependency interface { HeaderJars() android.Paths ImplementationJars() android.Paths AidlIncludeDirs() android.Paths + ExportedSdkLibs() []string } type SdkLibraryDependency interface { @@ -714,10 +718,14 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { deps.bootClasspath = append(deps.bootClasspath, dep.HeaderJars()...) case libTag: deps.classpath = append(deps.classpath, dep.HeaderJars()...) + // sdk lib names from dependencies are re-exported + j.exportedSdkLibs = append(j.exportedSdkLibs, dep.ExportedSdkLibs()...) case staticLibTag: deps.classpath = append(deps.classpath, dep.HeaderJars()...) deps.staticJars = append(deps.staticJars, dep.ImplementationJars()...) deps.staticHeaderJars = append(deps.staticHeaderJars, dep.HeaderJars()...) + // sdk lib names from dependencies are re-exported + j.exportedSdkLibs = append(j.exportedSdkLibs, dep.ExportedSdkLibs()...) case frameworkResTag: if ctx.ModuleName() == "framework" { // framework.jar has a one-off dependency on the R.java and Manifest.java files @@ -748,6 +756,8 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { switch tag { case libTag: deps.classpath = append(deps.classpath, dep.HeaderJars(getLinkType(j, ctx.ModuleName()))...) + // names of sdk libs that are directly depended are exported + j.exportedSdkLibs = append(j.exportedSdkLibs, otherName) default: ctx.ModuleErrorf("dependency on java_sdk_library %q can only be in libs", otherName) } @@ -785,9 +795,30 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { } }) + j.exportedSdkLibs = android.FirstUniqueStrings(j.exportedSdkLibs) + return deps } +func getJavaVersion(ctx android.ModuleContext, javaVersion, sdkVersion string) string { + var ret string + sdk := sdkStringToNumber(ctx, sdkVersion) + if javaVersion != "" { + ret = javaVersion + } else if ctx.Device() && sdk <= 23 { + ret = "1.7" + } else if ctx.Device() && sdk <= 26 || !ctx.Config().TargetOpenJDK9() { + ret = "1.8" + } else if ctx.Device() && sdkVersion != "" && sdk == android.FutureApiLevel { + // TODO(ccross): once we generate stubs we should be able to use 1.9 for sdk_version: "current" + ret = "1.8" + } else { + ret = "1.9" + } + + return ret +} + func (j *Module) collectBuilderFlags(ctx android.ModuleContext, deps deps) javaBuilderFlags { var flags javaBuilderFlags @@ -813,19 +844,8 @@ func (j *Module) collectBuilderFlags(ctx android.ModuleContext, deps deps) javaB } // javaVersion flag. - sdk := sdkStringToNumber(ctx, String(j.deviceProperties.Sdk_version)) - if j.properties.Java_version != nil { - flags.javaVersion = *j.properties.Java_version - } else if ctx.Device() && sdk <= 23 { - flags.javaVersion = "1.7" - } else if ctx.Device() && sdk <= 26 || !ctx.Config().TargetOpenJDK9() { - flags.javaVersion = "1.8" - } else if ctx.Device() && String(j.deviceProperties.Sdk_version) != "" && sdk == android.FutureApiLevel { - // TODO(ccross): once we generate stubs we should be able to use 1.9 for sdk_version: "current" - flags.javaVersion = "1.8" - } else { - flags.javaVersion = "1.9" - } + flags.javaVersion = getJavaVersion(ctx, + String(j.properties.Java_version), String(j.deviceProperties.Sdk_version)) // classpath flags.bootClasspath = append(flags.bootClasspath, deps.bootClasspath...) @@ -1189,6 +1209,10 @@ func (j *Module) AidlIncludeDirs() android.Paths { return j.exportAidlIncludeDirs } +func (j *Module) ExportedSdkLibs() []string { + return j.exportedSdkLibs +} + var _ logtagsProducer = (*Module)(nil) func (j *Module) logtags() android.Paths { @@ -1390,6 +1414,9 @@ type ImportProperties struct { Sdk_version *string Installable *bool + + // List of shared java libs that this module has dependencies to + Libs []string } type Import struct { @@ -1400,6 +1427,7 @@ type Import struct { classpathFiles android.Paths combinedClasspathFile android.Path + exportedSdkLibs []string } func (j *Import) Prebuilt() *android.Prebuilt { @@ -1415,6 +1443,7 @@ func (j *Import) Name() string { } func (j *Import) DepsMutator(ctx android.BottomUpMutatorContext) { + ctx.AddDependency(ctx.Module(), libTag, j.properties.Libs...) } func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { @@ -1423,6 +1452,28 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { outputFile := android.PathForModuleOut(ctx, "classes.jar") TransformJarsToJar(ctx, outputFile, "for prebuilts", j.classpathFiles, android.OptionalPath{}, false, nil) j.combinedClasspathFile = outputFile + + ctx.VisitDirectDeps(func(module android.Module) { + otherName := ctx.OtherModuleName(module) + tag := ctx.OtherModuleDependencyTag(module) + + switch dep := module.(type) { + case Dependency: + switch tag { + case libTag, staticLibTag: + // sdk lib names from dependencies are re-exported + j.exportedSdkLibs = append(j.exportedSdkLibs, dep.ExportedSdkLibs()...) + } + case SdkLibraryDependency: + switch tag { + case libTag: + // names of sdk libs that are directly depended are exported + j.exportedSdkLibs = append(j.exportedSdkLibs, otherName) + } + } + }) + + j.exportedSdkLibs = android.FirstUniqueStrings(j.exportedSdkLibs) } var _ Dependency = (*Import)(nil) @@ -1439,6 +1490,10 @@ func (j *Import) AidlIncludeDirs() android.Paths { return nil } +func (j *Import) ExportedSdkLibs() []string { + return j.exportedSdkLibs +} + var _ android.PrebuiltInterface = (*Import)(nil) func ImportFactory() android.Module { |