Revert "Enable from-text stub generation in non-sdk java_sdk_library"

Revert submission 2982300-java_api_library_non_sdk

Reason for revert: DroidMonitor: Potential culprit for b/357648959 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted.

Reverted changes: /q/submissionid:2982300-java_api_library_non_sdk

Change-Id: I5ef7afd9ec3e10ea99f82d02172843ad9b2cfda9
diff --git a/java/java.go b/java/java.go
index ccb348f..b320732 100644
--- a/java/java.go
+++ b/java/java.go
@@ -432,6 +432,7 @@
 	r8LibraryJarTag         = dependencyTag{name: "r8-libraryjar", runtimeLinked: true}
 	syspropPublicStubDepTag = dependencyTag{name: "sysprop public stub"}
 	javaApiContributionTag  = dependencyTag{name: "java-api-contribution"}
+	depApiSrcsTag           = dependencyTag{name: "dep-api-srcs"}
 	aconfigDeclarationTag   = dependencyTag{name: "aconfig-declaration"}
 	jniInstallTag           = dependencyTag{name: "jni install", runtimeLinked: true, installable: true}
 	binaryInstallTag        = dependencyTag{name: "binary install", runtimeLinked: true, installable: true}
@@ -2004,6 +2005,12 @@
 	// merge zipped after metalava invocation
 	Static_libs []string
 
+	// Java Api library to provide the full API surface stub jar file.
+	// If this property is set, the stub jar of this module is created by
+	// extracting the compiled class files provided by the
+	// full_api_surface_stub module.
+	Full_api_surface_stub *string
+
 	// Version of previously released API file for compatibility check.
 	Previous_api *string `android:"path"`
 
@@ -2036,15 +2043,6 @@
 	// List of hard coded filegroups containing Metalava config files that are passed to every
 	// Metalava invocation that this module performs. See addMetalavaConfigFilesToCmd.
 	ConfigFiles []string `android:"path" blueprint:"mutated"`
-
-	// If not blank, set to the version of the sdk to compile against.
-	// Defaults to an empty string, which compiles the module against the private platform APIs.
-	// Values are of one of the following forms:
-	// 1) numerical API level, "current", "none", or "core_platform"
-	// 2) An SDK kind with an API level: "<sdk kind>_<API level>"
-	// See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
-	// If the SDK kind is empty, it will be set to public.
-	Sdk_version *string
 }
 
 func ApiLibraryFactory() android.Module {
@@ -2143,6 +2141,40 @@
 	}
 }
 
+// This method extracts the stub class files from the stub jar file provided
+// from full_api_surface_stub module instead of compiling the srcjar generated from invoking metalava.
+// This method is used because metalava can generate compilable from-text stubs only when
+// the codebase encompasses all classes listed in the input API text file, and a class can extend
+// a class that is not within the same API domain.
+func (al *ApiLibrary) extractApiSrcs(ctx android.ModuleContext, rule *android.RuleBuilder, stubsDir android.OptionalPath, fullApiSurfaceStubJar android.Path) {
+	classFilesList := android.PathForModuleOut(ctx, "metalava", "classes.txt")
+	unzippedSrcJarDir := android.PathForModuleOut(ctx, "metalava", "unzipDir")
+
+	rule.Command().
+		BuiltTool("list_files").
+		Text(stubsDir.String()).
+		FlagWithOutput("--out ", classFilesList).
+		FlagWithArg("--extensions ", ".java").
+		FlagWithArg("--root ", unzippedSrcJarDir.String()).
+		Flag("--classes")
+
+	rule.Command().
+		Text("unzip").
+		Flag("-q").
+		Input(fullApiSurfaceStubJar).
+		FlagWithArg("-d ", unzippedSrcJarDir.String())
+
+	rule.Command().
+		BuiltTool("soong_zip").
+		Flag("-jar").
+		Flag("-write_if_changed").
+		Flag("-ignore_missing_files").
+		Flag("-quiet").
+		FlagWithArg("-C ", unzippedSrcJarDir.String()).
+		FlagWithInput("-l ", classFilesList).
+		FlagWithOutput("-o ", al.stubsJarWithoutStaticLibs)
+}
+
 func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
 	apiContributions := al.properties.Api_contributions
 	addValidations := !ctx.Config().IsEnvTrue("DISABLE_STUB_VALIDATION") &&
@@ -2169,18 +2201,14 @@
 			}
 		}
 	}
-	if ctx.Device() {
-		sdkDep := decodeSdkDep(ctx, android.SdkContext(al))
-		if sdkDep.useModule {
-			ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules)
-			ctx.AddVariationDependencies(nil, libTag, sdkDep.classpath...)
-			ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.bootclasspath...)
-
-		}
-	}
 	ctx.AddVariationDependencies(nil, libTag, al.properties.Libs...)
 	ctx.AddVariationDependencies(nil, staticLibTag, al.properties.Static_libs...)
-
+	if al.properties.Full_api_surface_stub != nil {
+		ctx.AddVariationDependencies(nil, depApiSrcsTag, String(al.properties.Full_api_surface_stub))
+	}
+	if al.properties.System_modules != nil {
+		ctx.AddVariationDependencies(nil, systemModulesTag, String(al.properties.System_modules))
+	}
 	for _, aconfigDeclarationsName := range al.properties.Aconfig_declarations {
 		ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfigDeclarationsName)
 	}
@@ -2236,8 +2264,8 @@
 
 	var srcFilesInfo []JavaApiImportInfo
 	var classPaths android.Paths
-	var bootclassPaths android.Paths
 	var staticLibs android.Paths
+	var depApiSrcsStubsJar android.Path
 	var systemModulesPaths android.Paths
 	ctx.VisitDirectDeps(func(dep android.Module) {
 		tag := ctx.OtherModuleDependencyTag(dep)
@@ -2251,12 +2279,12 @@
 		case libTag:
 			provider, _ := android.OtherModuleProvider(ctx, dep, JavaInfoProvider)
 			classPaths = append(classPaths, provider.HeaderJars...)
-		case bootClasspathTag:
-			provider, _ := android.OtherModuleProvider(ctx, dep, JavaInfoProvider)
-			bootclassPaths = append(bootclassPaths, provider.HeaderJars...)
 		case staticLibTag:
 			provider, _ := android.OtherModuleProvider(ctx, dep, JavaInfoProvider)
 			staticLibs = append(staticLibs, provider.HeaderJars...)
+		case depApiSrcsTag:
+			provider, _ := android.OtherModuleProvider(ctx, dep, JavaInfoProvider)
+			depApiSrcsStubsJar = provider.HeaderJars[0]
 		case systemModulesTag:
 			module := dep.(SystemModulesProvider)
 			systemModulesPaths = append(systemModulesPaths, module.HeaderJars()...)
@@ -2291,10 +2319,7 @@
 
 	configFiles := android.PathsForModuleSrc(ctx, al.properties.ConfigFiles)
 
-	combinedPaths := append(([]android.Path)(nil), systemModulesPaths...)
-	combinedPaths = append(combinedPaths, classPaths...)
-	combinedPaths = append(combinedPaths, bootclassPaths...)
-	cmd := metalavaStubCmd(ctx, rule, srcFiles, homeDir, combinedPaths, configFiles)
+	cmd := metalavaStubCmd(ctx, rule, srcFiles, homeDir, systemModulesPaths, configFiles)
 
 	al.stubsFlags(ctx, cmd, stubsDir)
 
@@ -2312,6 +2337,9 @@
 	al.stubsJarWithoutStaticLibs = android.PathForModuleOut(ctx, "metalava", "stubs.jar")
 	al.stubsJar = android.PathForModuleOut(ctx, ctx.ModuleName(), fmt.Sprintf("%s.jar", ctx.ModuleName()))
 
+	if depApiSrcsStubsJar != nil {
+		al.extractApiSrcs(ctx, rule, stubsDir, depApiSrcsStubsJar)
+	}
 	rule.Command().
 		BuiltTool("soong_zip").
 		Flag("-write_if_changed").
@@ -2322,18 +2350,19 @@
 
 	rule.Build("metalava", "metalava merged text")
 
-	javacFlags := javaBuilderFlags{
-		javaVersion:   getStubsJavaVersion(),
-		javacFlags:    strings.Join(al.properties.Javacflags, " "),
-		classpath:     classpath(classPaths),
-		bootClasspath: classpath(append(systemModulesPaths, bootclassPaths...)),
+	if depApiSrcsStubsJar == nil {
+		var flags javaBuilderFlags
+		flags.javaVersion = getStubsJavaVersion()
+		flags.javacFlags = strings.Join(al.properties.Javacflags, " ")
+		flags.classpath = classpath(classPaths)
+		flags.bootClasspath = classpath(systemModulesPaths)
+
+		annoSrcJar := android.PathForModuleOut(ctx, ctx.ModuleName(), "anno.srcjar")
+
+		TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{},
+			android.Paths{al.stubsSrcJar}, annoSrcJar, flags, android.Paths{})
 	}
 
-	annoSrcJar := android.PathForModuleOut(ctx, ctx.ModuleName(), "anno.srcjar")
-
-	TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{},
-		android.Paths{al.stubsSrcJar}, annoSrcJar, javacFlags, android.Paths{})
-
 	builder := android.NewRuleBuilder(pctx, ctx)
 	builder.Command().
 		BuiltTool("merge_zips").
@@ -2344,7 +2373,7 @@
 
 	// compile stubs to .dex for hiddenapi processing
 	dexParams := &compileDexParams{
-		flags:         javacFlags,
+		flags:         javaBuilderFlags{},
 		sdkVersion:    al.SdkVersion(ctx),
 		minSdkVersion: al.MinSdkVersion(ctx),
 		classesJar:    al.stubsJar,
@@ -2380,28 +2409,14 @@
 	return nil
 }
 
-// Most java_api_library constitues the sdk, but there are some java_api_library that
-// does not contribute to the api surface. Such modules are allowed to set sdk_version
-// other than "none"
+// java_api_library constitutes the sdk, and does not build against one
 func (al *ApiLibrary) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
-	return android.SdkSpecFrom(ctx, proptools.String(al.properties.Sdk_version))
+	return android.SdkSpecNone
 }
 
 // java_api_library is always at "current". Return FutureApiLevel
 func (al *ApiLibrary) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
-	return al.SdkVersion(ctx).ApiLevel
-}
-
-func (al *ApiLibrary) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
-	return al.SdkVersion(ctx).ApiLevel
-}
-
-func (al *ApiLibrary) SystemModules() string {
-	return proptools.String(al.properties.System_modules)
-}
-
-func (al *ApiLibrary) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
-	return al.SdkVersion(ctx).ApiLevel
+	return android.FutureApiLevel
 }
 
 func (al *ApiLibrary) IDEInfo(i *android.IdeInfo) {
@@ -2419,6 +2434,9 @@
 	if al.properties.System_modules != nil {
 		ret = append(ret, proptools.String(al.properties.System_modules))
 	}
+	if al.properties.Full_api_surface_stub != nil {
+		ret = append(ret, proptools.String(al.properties.Full_api_surface_stub))
+	}
 	// Other non java_library dependencies like java_api_contribution are ignored for now.
 	return ret
 }
@@ -2426,7 +2444,6 @@
 // implement the following interfaces for hiddenapi processing
 var _ hiddenAPIModule = (*ApiLibrary)(nil)
 var _ UsesLibraryDependency = (*ApiLibrary)(nil)
-var _ android.SdkContext = (*ApiLibrary)(nil)
 
 // implement the following interface for IDE completion.
 var _ android.IDEInfo = (*ApiLibrary)(nil)