diff options
Diffstat (limited to 'java/java.go')
-rw-r--r-- | java/java.go | 127 |
1 files changed, 72 insertions, 55 deletions
diff --git a/java/java.go b/java/java.go index ccb348fbb..b320732cd 100644 --- a/java/java.go +++ b/java/java.go @@ -432,6 +432,7 @@ var ( 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 @@ type JavaApiLibraryProperties struct { // 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 @@ type JavaApiLibraryProperties struct { // 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 @@ func (al *ApiLibrary) addValidation(ctx android.ModuleContext, cmd *android.Rule } } +// 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 @@ func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { } } } - 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 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 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 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 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 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 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 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 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,17 +2350,18 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 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") + annoSrcJar := android.PathForModuleOut(ctx, ctx.ModuleName(), "anno.srcjar") - TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{}, - android.Paths{al.stubsSrcJar}, annoSrcJar, javacFlags, android.Paths{}) + TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{}, + android.Paths{al.stubsSrcJar}, annoSrcJar, flags, android.Paths{}) + } builder := android.NewRuleBuilder(pctx, ctx) builder.Command(). @@ -2344,7 +2373,7 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { // 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 @@ func (al *ApiLibrary) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap { 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 @@ func (al *ApiLibrary) ideDeps() []string { 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 @@ func (al *ApiLibrary) ideDeps() []string { // 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) |