diff --git a/java/aar.go b/java/aar.go index 415170eb5..da353e01f 100644 --- a/java/aar.go +++ b/java/aar.go @@ -475,6 +475,10 @@ func (a *AARImport) AidlIncludeDirs() android.Paths { return nil } +func (a *AARImport) ExportedSdkLibs() []string { + return nil +} + var _ android.PrebuiltInterface = (*Import)(nil) func AARImportFactory() android.Module { diff --git a/java/androidmk.go b/java/androidmk.go index ab9ceeb99..d6095ae0f 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -63,6 +63,10 @@ func (library *Library) AndroidMk() android.AndroidMkData { fmt.Fprintln(w, "LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR :=", library.jacocoReportClassesFile.String()) } + if len(library.exportedSdkLibs) != 0 { + fmt.Fprintln(w, "LOCAL_EXPORT_SDK_LIBRARIES :=", strings.Join(library.exportedSdkLibs, " ")) + } + // Temporary hack: export sources used to compile framework.jar to Make // to be used for droiddoc // TODO(ccross): remove this once droiddoc is in soong diff --git a/java/java.go b/java/java.go index 969b0637e..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,6 +795,8 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { } }) + j.exportedSdkLibs = android.FirstUniqueStrings(j.exportedSdkLibs) + return deps } @@ -1197,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 { @@ -1398,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 { @@ -1408,6 +1427,7 @@ type Import struct { classpathFiles android.Paths combinedClasspathFile android.Path + exportedSdkLibs []string } func (j *Import) Prebuilt() *android.Prebuilt { @@ -1423,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) { @@ -1431,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) @@ -1447,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 { diff --git a/java/java_test.go b/java/java_test.go index 16782967c..96bf22436 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -1095,6 +1095,12 @@ func TestJavaSdkLibrary(t *testing.T) { libs: ["foo", "bar"], sdk_version: "system_current", } + java_library { + name: "qux", + srcs: ["c.java"], + libs: ["baz"], + sdk_version: "system_current", + } `) // check the existence of the internal modules @@ -1127,4 +1133,13 @@ func TestJavaSdkLibrary(t *testing.T) { t.Errorf("baz javac classpath %v should not contain %q", bazJavac.Args["classpath"], "foo.stubs.jar") } + + // test if baz has exported SDK lib names foo and bar to qux + qux := ctx.ModuleForTests("qux", "android_common") + if quxLib, ok := qux.Module().(*Library); ok { + sdkLibs := quxLib.ExportedSdkLibs() + if len(sdkLibs) != 2 || !android.InList("foo", sdkLibs) || !android.InList("bar", sdkLibs) { + t.Errorf("qux should export \"foo\" and \"bar\" but exports %v", sdkLibs) + } + } } diff --git a/java/sdk_library.go b/java/sdk_library.go index aee528f4f..55da533cd 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -67,9 +67,8 @@ var ( // classpath at runtime if requested via . // // TODO: these are big features that are currently missing -// 1) ensuring that apps have appropriate tag -// 2) disallowing linking to the runtime shared lib -// 3) HTML generation +// 1) disallowing linking to the runtime shared lib +// 2) HTML generation func init() { android.RegisterModuleType("java_sdk_library", sdkLibraryFactory)