From 4340863ed900eacddffe782d44b8ed1693b72234 Mon Sep 17 00:00:00 2001 From: Liana Kazanova Date: Fri, 20 Sep 2024 17:09:21 +0000 Subject: [PATCH 1/2] Revert "Remove java_sdk_library "magic"" Revert submission 3271699 Reason for revert: DroidMonitor: Potential culprit for http://b/368606825 - verifying through ABTD before submission. Reverted changes: /q/submissionid:3271699 Change-Id: If40f7956e699246cf1d72ffc50ffffa4696504df --- java/sdk_library.go | 117 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/java/sdk_library.go b/java/sdk_library.go index c3ffb46d5..7daaca753 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -268,6 +268,10 @@ func (scope *apiScope) stubsSourceModuleName(baseName string) string { return baseName + ".stubs.source" + scope.moduleSuffix } +func (scope *apiScope) apiModuleName(baseName string) string { + return baseName + ".api" + scope.moduleSuffix +} + func (scope *apiScope) String() string { return scope.name } @@ -1078,6 +1082,21 @@ func (c *commonToSdkLibraryAndImport) findClosestScopePath(scope *apiScope) *sco return nil } +func (c *commonToSdkLibraryAndImport) selectHeaderJarsForSdkVersion(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths { + + // If a specific numeric version has been requested then use prebuilt versions of the sdk. + if !sdkVersion.ApiLevel.IsPreview() { + return PrebuiltJars(ctx, c.module.RootLibraryName(), sdkVersion) + } + + paths := c.selectScopePaths(ctx, sdkVersion.Kind) + if paths == nil { + return nil + } + + return paths.stubsHeaderPath +} + // selectScopePaths returns the *scopePaths appropriate for the specific kind. // // If the module does not support the specific kind then it will return the *scopePaths for the @@ -1244,6 +1263,12 @@ var _ SdkLibraryComponentDependency = (*SdkLibraryImport)(nil) type SdkLibraryDependency interface { SdkLibraryComponentDependency + // Get the header jars appropriate for the supplied sdk_version. + // + // These are turbine generated jars so they only change if the externals of the + // class changes but it does not contain and implementation or JavaDoc. + SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths + // SdkApiStubDexJar returns the dex jar for the stubs for the prebuilt // java_sdk_library_import module. It is needed by the hiddenapi processing tool which // processes dex files. @@ -2207,6 +2232,72 @@ func (module *SdkLibrary) createXmlFile(mctx android.DefaultableHookContext) { mctx.CreateModule(sdkLibraryXmlFactory, &props) } +func PrebuiltJars(ctx android.BaseModuleContext, baseName string, s android.SdkSpec) android.Paths { + var ver android.ApiLevel + var kind android.SdkKind + if s.UsePrebuilt(ctx) { + ver = s.ApiLevel + kind = s.Kind + } else { + // We don't have prebuilt SDK for the specific sdkVersion. + // Instead of breaking the build, fallback to use "system_current" + ver = android.FutureApiLevel + kind = android.SdkSystem + } + + dir := filepath.Join("prebuilts", "sdk", ver.String(), kind.String()) + jar := filepath.Join(dir, baseName+".jar") + jarPath := android.ExistentPathForSource(ctx, jar) + if !jarPath.Valid() { + if ctx.Config().AllowMissingDependencies() { + return android.Paths{android.PathForSource(ctx, jar)} + } else { + ctx.PropertyErrorf("sdk_library", "invalid sdk version %q, %q does not exist", s.Raw, jar) + } + return nil + } + return android.Paths{jarPath.Path()} +} + +// Check to see if the other module is within the same set of named APEXes as this module. +// +// If either this or the other module are on the platform then this will return +// false. +func withinSameApexesAs(ctx android.BaseModuleContext, other android.Module) bool { + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + otherApexInfo, _ := android.OtherModuleProvider(ctx, other, android.ApexInfoProvider) + return len(otherApexInfo.InApexVariants) > 0 && reflect.DeepEqual(apexInfo.InApexVariants, otherApexInfo.InApexVariants) +} + +func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths { + // If the client doesn't set sdk_version, but if this library prefers stubs over + // the impl library, let's provide the widest API surface possible. To do so, + // force override sdk_version to module_current so that the closest possible API + // surface could be found in selectHeaderJarsForSdkVersion + if module.defaultsToStubs() && !sdkVersion.Specified() { + sdkVersion = android.SdkSpecFrom(ctx, "module_current") + } + + // Only provide access to the implementation library if it is actually built. + if module.requiresRuntimeImplementationLibrary() { + // Check any special cases for java_sdk_library. + // + // Only allow access to the implementation library in the following condition: + // * No sdk_version specified on the referencing module. + // * The referencing module is in the same apex as this. + if sdkVersion.Kind == android.SdkPrivate || withinSameApexesAs(ctx, module) { + return module.implLibraryHeaderJars + } + } + + return module.selectHeaderJarsForSdkVersion(ctx, sdkVersion) +} + +// to satisfy SdkLibraryDependency interface +func (module *SdkLibrary) SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths { + return module.sdkJars(ctx, sdkVersion) +} + var javaSdkLibrariesKey = android.NewOnceKey("javaSdkLibraries") func javaSdkLibraries(config android.Config) *[]string { @@ -2325,6 +2416,10 @@ func (module *SdkLibrary) requiresRuntimeImplementationLibrary() bool { return !proptools.Bool(module.sdkLibraryProperties.Api_only) } +func (module *SdkLibrary) defaultsToStubs() bool { + return proptools.Bool(module.sdkLibraryProperties.Default_to_stubs) +} + func moduleStubLinkType(j *Module) (stub bool, ret sdkLinkType) { kind := android.ToSdkKind(proptools.String(j.properties.Stub_contributing_api)) switch kind { @@ -2826,6 +2921,28 @@ func (module *SdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleCo }) } +func (module *SdkLibraryImport) sdkJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec, headerJars bool) android.Paths { + + // For consistency with SdkLibrary make the implementation jar available to libraries that + // are within the same APEX. + implLibraryModule := module.implLibraryModule + if implLibraryModule != nil && withinSameApexesAs(ctx, module) { + if headerJars { + return implLibraryModule.HeaderJars() + } else { + return implLibraryModule.ImplementationJars() + } + } + + return module.selectHeaderJarsForSdkVersion(ctx, sdkVersion) +} + +// to satisfy SdkLibraryDependency interface +func (module *SdkLibraryImport) SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths { + // This module is just a wrapper for the prebuilt stubs. + return module.sdkJars(ctx, sdkVersion, true) +} + // to satisfy UsesLibraryDependency interface func (module *SdkLibraryImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { // The dex implementation jar extracted from the .apex file should be used in preference to the From 6a32dfdb868780cd54c23771628d1a54c84fca1c Mon Sep 17 00:00:00 2001 From: Liana Kazanova Date: Fri, 20 Sep 2024 17:09:21 +0000 Subject: [PATCH 2/2] Revert "Restrict java_sdk_library in libs of java_import and dro..." Revert submission 3271699 Reason for revert: DroidMonitor: Potential culprit for http://b/368606825 - verifying through ABTD before submission. Reverted changes: /q/submissionid:3271699 Change-Id: I65f0e10eb775fd08dd958b699ce1191da7ce0669 --- java/droiddoc.go | 7 ++----- java/java.go | 10 +++++----- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/java/droiddoc.go b/java/droiddoc.go index a7e92d9ef..2929bb8d9 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -373,11 +373,8 @@ func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps { panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName())) } case libTag, sdkLibTag: - if _, ok := module.(SdkLibraryDependency); ok { - sdkInfo, _ := android.OtherModuleProvider(ctx, module, SdkLibraryInfoProvider) - generatingLibsString := android.PrettyConcat( - getGeneratingLibs(ctx, j.SdkVersion(ctx), module.Name(), sdkInfo), true, "or") - ctx.ModuleErrorf("cannot depend directly on java_sdk_library %q; try depending on %s instead", module.Name(), generatingLibsString) + if dep, ok := module.(SdkLibraryDependency); ok { + deps.classpath = append(deps.classpath, dep.SdkHeaderJars(ctx, j.SdkVersion(ctx))...) } else if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { deps.classpath = append(deps.classpath, dep.HeaderJars...) deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs...) diff --git a/java/java.go b/java/java.go index b6d617377..d63bbe6e1 100644 --- a/java/java.go +++ b/java/java.go @@ -2700,13 +2700,13 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { transitiveBootClasspathHeaderJars = append(transitiveBootClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars) } } - } else if _, ok := module.(SdkLibraryDependency); ok { + } else if dep, ok := module.(SdkLibraryDependency); ok { switch tag { case libTag, sdkLibTag: - sdkInfo, _ := android.OtherModuleProvider(ctx, module, SdkLibraryInfoProvider) - generatingLibsString := android.PrettyConcat( - getGeneratingLibs(ctx, j.SdkVersion(ctx), module.Name(), sdkInfo), true, "or") - ctx.ModuleErrorf("cannot depend directly on java_sdk_library %q; try depending on %s instead", module.Name(), generatingLibsString) + depHeaderJars := dep.SdkHeaderJars(ctx, j.SdkVersion(ctx)) + flags.classpath = append(flags.classpath, depHeaderJars...) + transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, + android.NewDepSet(android.PREORDER, depHeaderJars, nil)) } }