Export implementation class jars for java_boot_libs

Hiddenapi processing currently requires access to the class
implementation jars for libraries on the bootclasspath which means that
they need to be provided as part of the prebuilts. This change modifies
the java_boot_libs property on the sdk to make those files available.

Modularization of the hiddenapi processing will hopefully remove the
need for these to be exported so this should be temporary.

Bug: 178361284
Test: m art-module-sdk
      check generated snapshot zip contains implementation jars
Change-Id: I9e94662dddb0ddb85a477ae6d27e533085147e88
This commit is contained in:
Paul Duffin
2021-02-04 11:15:34 +00:00
parent dd63d6d7bd
commit 22ff0aaf51
4 changed files with 18 additions and 46 deletions

View File

@@ -177,12 +177,6 @@ type SnapshotBuilder interface {
// to the zip // to the zip
CopyToSnapshot(src Path, dest string) CopyToSnapshot(src Path, dest string)
// Return the path to an empty file.
//
// This can be used by sdk member types that need to create an empty file in the snapshot, simply
// pass the value returned from this to the CopyToSnapshot() method.
EmptyFile() Path
// Unzip the supplied zip into the snapshot relative directory destDir. // Unzip the supplied zip into the snapshot relative directory destDir.
UnzipToSnapshot(zipPath Path, destDir string) UnzipToSnapshot(zipPath Path, destDir string)

View File

@@ -40,18 +40,21 @@ func init() {
// Register sdk member types. // Register sdk member types.
android.RegisterSdkMemberType(javaHeaderLibsSdkMemberType) android.RegisterSdkMemberType(javaHeaderLibsSdkMemberType)
// Export implementation classes jar as part of the sdk.
exportImplementationClassesJar := func(_ android.SdkMemberContext, j *Library) android.Path {
implementationJars := j.ImplementationAndResourcesJars()
if len(implementationJars) != 1 {
panic(fmt.Errorf("there must be only one implementation jar from %q", j.Name()))
}
return implementationJars[0]
}
// Register java implementation libraries for use only in module_exports (not sdk). // Register java implementation libraries for use only in module_exports (not sdk).
android.RegisterSdkMemberType(&librarySdkMemberType{ android.RegisterSdkMemberType(&librarySdkMemberType{
android.SdkMemberTypeBase{ android.SdkMemberTypeBase{
PropertyName: "java_libs", PropertyName: "java_libs",
}, },
func(_ android.SdkMemberContext, j *Library) android.Path { exportImplementationClassesJar,
implementationJars := j.ImplementationAndResourcesJars()
if len(implementationJars) != 1 {
panic(fmt.Errorf("there must be only one implementation jar from %q", j.Name()))
}
return implementationJars[0]
},
sdkSnapshotFilePathForJar, sdkSnapshotFilePathForJar,
copyEverythingToSnapshot, copyEverythingToSnapshot,
}) })
@@ -72,19 +75,11 @@ func init() {
PropertyName: "java_boot_libs", PropertyName: "java_boot_libs",
SupportsSdk: true, SupportsSdk: true,
}, },
func(ctx android.SdkMemberContext, j *Library) android.Path { // Temporarily export implementation classes jar for java_boot_libs as it is required for the
// Java boot libs are only provided in the SDK to provide access to their dex implementation // hiddenapi processing.
// jar for use by dexpreopting and boot jars package check. They do not need to provide an // TODO(b/179354495): Revert once hiddenapi processing has been modularized.
// actual implementation jar but the java_import will need a file that exists so just copy an exportImplementationClassesJar,
// empty file. Any attempt to use that file as a jar will cause a build error. sdkSnapshotFilePathForJar,
return ctx.SnapshotBuilder().EmptyFile()
},
func(osPrefix, name string) string {
// Create a special name for the implementation jar to try and provide some useful information
// to a developer that attempts to compile against this.
// TODO(b/175714559): Provide a proper error message in Soong not ninja.
return filepath.Join(osPrefix, "java_boot_libs", "snapshot", "jars", "are", "invalid", name+jarFileSuffix)
},
onlyCopyJarToSnapshot, onlyCopyJarToSnapshot,
}) })

View File

@@ -503,7 +503,7 @@ java_import {
sdk_member_name: "myjavalib", sdk_member_name: "myjavalib",
visibility: ["//visibility:public"], visibility: ["//visibility:public"],
apex_available: ["//apex_available:platform"], apex_available: ["//apex_available:platform"],
jars: ["java_boot_libs/snapshot/jars/are/invalid/myjavalib.jar"], jars: ["java/myjavalib.jar"],
} }
java_import { java_import {
@@ -511,7 +511,7 @@ java_import {
prefer: false, prefer: false,
visibility: ["//visibility:public"], visibility: ["//visibility:public"],
apex_available: ["//apex_available:platform"], apex_available: ["//apex_available:platform"],
jars: ["java_boot_libs/snapshot/jars/are/invalid/myjavalib.jar"], jars: ["java/myjavalib.jar"],
} }
module_exports_snapshot { module_exports_snapshot {
@@ -519,10 +519,9 @@ module_exports_snapshot {
visibility: ["//visibility:public"], visibility: ["//visibility:public"],
java_boot_libs: ["myexports_myjavalib@current"], java_boot_libs: ["myexports_myjavalib@current"],
} }
`), `),
checkAllCopyRules(` checkAllCopyRules(`
.intermediates/myexports/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/myjavalib.jar .intermediates/myjavalib/android_common/withres/myjavalib.jar -> java/myjavalib.jar
`), `),
) )
} }

View File

@@ -653,9 +653,6 @@ type snapshotBuilder struct {
filesToZip android.Paths filesToZip android.Paths
zipsToMerge android.Paths zipsToMerge android.Paths
// The path to an empty file.
emptyFile android.WritablePath
prebuiltModules map[string]*bpModule prebuiltModules map[string]*bpModule
prebuiltOrder []*bpModule prebuiltOrder []*bpModule
@@ -706,19 +703,6 @@ func (s *snapshotBuilder) UnzipToSnapshot(zipPath android.Path, destDir string)
s.zipsToMerge = append(s.zipsToMerge, tmpZipPath) s.zipsToMerge = append(s.zipsToMerge, tmpZipPath)
} }
func (s *snapshotBuilder) EmptyFile() android.Path {
if s.emptyFile == nil {
ctx := s.ctx
s.emptyFile = android.PathForModuleOut(ctx, "empty")
s.ctx.Build(pctx, android.BuildParams{
Rule: android.Touch,
Output: s.emptyFile,
})
}
return s.emptyFile
}
func (s *snapshotBuilder) AddPrebuiltModule(member android.SdkMember, moduleType string) android.BpModule { func (s *snapshotBuilder) AddPrebuiltModule(member android.SdkMember, moduleType string) android.BpModule {
name := member.Name() name := member.Name()
if s.prebuiltModules[name] != nil { if s.prebuiltModules[name] != nil {