Merge changes from topic "empty-framework-location" into main

* changes:
  Created empty framework-location non-updatable module
  java_library support for building headers-only
This commit is contained in:
Mark White
2023-08-23 17:25:39 +00:00
committed by Android (Google) Code Review
8 changed files with 92 additions and 0 deletions

View File

@@ -79,6 +79,9 @@ func (library *Library) AndroidMkEntries() []android.AndroidMkEntries {
} else if !library.ApexModuleBase.AvailableFor(android.AvailableToPlatform) {
// Platform variant. If not available for the platform, we don't need Make module.
entriesList = append(entriesList, android.AndroidMkEntries{Disabled: true})
} else if library.properties.Headers_only {
// If generating headers only then don't expose to Make.
entriesList = append(entriesList, android.AndroidMkEntries{Disabled: true})
} else {
entriesList = append(entriesList, android.AndroidMkEntries{
Class: "JAVA_LIBRARIES",

View File

@@ -192,6 +192,9 @@ type CommonProperties struct {
// Additional srcJars tacked in by GeneratedJavaLibraryModule
Generated_srcjars []android.Path `android:"mutated"`
// If true, then only the headers are built and not the implementation jar.
Headers_only bool
}
// Properties that are specific to device modules. Host module factories should not add these when
@@ -574,6 +577,17 @@ func (j *Module) checkPlatformAPI(ctx android.ModuleContext) {
}
}
func (j *Module) checkHeadersOnly(ctx android.ModuleContext) {
if _, ok := ctx.Module().(android.SdkContext); ok {
headersOnly := proptools.Bool(&j.properties.Headers_only)
installable := proptools.Bool(j.properties.Installable)
if headersOnly && installable {
ctx.PropertyErrorf("headers_only", "This module has conflicting settings. headers_only is true which, which means this module doesn't generate an implementation jar. However installable is set to true.")
}
}
}
func (j *Module) addHostProperties() {
j.AddProperties(
&j.properties,
@@ -1153,6 +1167,36 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
// final R classes from the app.
flags.classpath = append(android.CopyOf(extraClasspathJars), flags.classpath...)
// If compiling headers then compile them and skip the rest
if j.properties.Headers_only {
if srcFiles.HasExt(".kt") {
ctx.ModuleErrorf("Compiling headers_only with .kt not supported")
}
if ctx.Config().IsEnvFalse("TURBINE_ENABLED") || disableTurbine {
ctx.ModuleErrorf("headers_only is enabled but Turbine is disabled.")
}
_, j.headerJarFile =
j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName,
extraCombinedJars)
if ctx.Failed() {
return
}
ctx.SetProvider(JavaInfoProvider, JavaInfo{
HeaderJars: android.PathsIfNonNil(j.headerJarFile),
TransitiveLibsHeaderJars: j.transitiveLibsHeaderJars,
TransitiveStaticLibsHeaderJars: j.transitiveStaticLibsHeaderJars,
AidlIncludeDirs: j.exportAidlIncludeDirs,
ExportedPlugins: j.exportedPluginJars,
ExportedPluginClasses: j.exportedPluginClasses,
ExportedPluginDisableTurbine: j.exportedDisableTurbine,
})
j.outputFile = j.headerJarFile
return
}
if srcFiles.HasExt(".kt") {
// When using kotlin sources turbine is used to generate annotation processor sources,
// including for annotation processors that generate API, so we can use turbine for

View File

@@ -698,6 +698,7 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {
}
j.checkSdkVersions(ctx)
j.checkHeadersOnly(ctx)
if ctx.Device() {
j.dexpreopter.installPath = j.dexpreopter.getInstallPath(
ctx, android.PathForModuleInstall(ctx, "framework", j.Stem()+".jar"))

View File

@@ -2370,3 +2370,21 @@ func TestJavaLibraryWithResourcesStem(t *testing.T) {
t.Errorf("Module output does not contain expected jar %s", "test.jar")
}
}
func TestHeadersOnly(t *testing.T) {
ctx, _ := testJava(t, `
java_library {
name: "foo",
srcs: ["a.java"],
headers_only: true,
}
`)
turbine := ctx.ModuleForTests("foo", "android_common").Rule("turbine")
if len(turbine.Inputs) != 1 || turbine.Inputs[0].String() != "a.java" {
t.Errorf(`foo inputs %v != ["a.java"]`, turbine.Inputs)
}
javac := ctx.ModuleForTests("foo", "android_common").MaybeRule("javac")
android.AssertDeepEquals(t, "javac rule", nil, javac.Rule)
}

View File

@@ -28,6 +28,7 @@ var legacyCorePlatformApiModules = []string{
"FloralClocks",
"framework-jobscheduler",
"framework-minus-apex",
"framework-minus-apex-headers",
"framework-minus-apex-intdefs",
"FrameworksCoreTests",
"HelloOslo",