From 204356f3b54be5936e152815a96d1e917022d077 Mon Sep 17 00:00:00 2001 From: Jiakai Zhang Date: Thu, 9 Sep 2021 08:12:46 +0000 Subject: [PATCH] Preopt APEX system server jars from prebuilts. Similar to the previous CL, but for jars from prebuilts. Test: manual - 1. Patch aosp/1818020 and aosp/1810840. 2. m SOONG_CONFIG_art_module_source_build=false com.android.art Bug: 194150908 Change-Id: Idc0c73a78045a602ad3a91cb5071d291bd611015 --- android/deapexer.go | 6 +++--- apex/deapexer.go | 2 +- apex/prebuilt.go | 19 +++++++++++++++++-- java/dexpreopt.go | 4 ++++ java/sdk_library.go | 24 +++++++++++++++++++++++- java/sdk_library_test.go | 3 ++- 6 files changed, 50 insertions(+), 8 deletions(-) diff --git a/android/deapexer.go b/android/deapexer.go index de3f63582..9290481d4 100644 --- a/android/deapexer.go +++ b/android/deapexer.go @@ -73,7 +73,7 @@ type DeapexerInfo struct { // exported file name is the apex relative path, e.g. javalib/core-libart.jar. // // See Prebuilt.ApexInfoMutator for more information. - exports map[string]Path + exports map[string]WritablePath } // PrebuiltExportPath provides the path, or nil if not available, of a file exported from the @@ -82,7 +82,7 @@ type DeapexerInfo struct { // The exported file is identified by the apex relative path, e.g. "javalib/core-libart.jar". // // See apex/deapexer.go for more information. -func (i DeapexerInfo) PrebuiltExportPath(apexRelativePath string) Path { +func (i DeapexerInfo) PrebuiltExportPath(apexRelativePath string) WritablePath { path := i.exports[apexRelativePath] return path } @@ -95,7 +95,7 @@ var DeapexerProvider = blueprint.NewProvider(DeapexerInfo{}) // for use with a prebuilt_apex module. // // See apex/deapexer.go for more information. -func NewDeapexerInfo(exports map[string]Path) DeapexerInfo { +func NewDeapexerInfo(exports map[string]WritablePath) DeapexerInfo { return DeapexerInfo{ exports: exports, } diff --git a/apex/deapexer.go b/apex/deapexer.go index c70da1542..2c1835aa4 100644 --- a/apex/deapexer.go +++ b/apex/deapexer.go @@ -97,7 +97,7 @@ func (p *Deapexer) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Create and remember the directory into which the .apex file's contents will be unpacked. deapexerOutput := android.PathForModuleOut(ctx, "deapexer") - exports := make(map[string]android.Path) + exports := make(map[string]android.WritablePath) // Create mappings from apex relative path to the extracted file's path. exportedPaths := make(android.Paths, 0, len(exports)) diff --git a/apex/prebuilt.go b/apex/prebuilt.go index c4794dc89..4833a644b 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -178,13 +178,19 @@ func (p *prebuiltCommon) initApexFilesForAndroidMk(ctx android.ModuleContext) { // If the exported java module provides a dex jar path then add it to the list of apexFiles. path := child.(interface{ DexJarBuildPath() android.Path }).DexJarBuildPath() if path != nil { - p.apexFilesForAndroidMk = append(p.apexFilesForAndroidMk, apexFile{ + af := apexFile{ module: child, moduleDir: ctx.OtherModuleDir(child), androidMkModuleName: name, builtFile: path, class: javaSharedLib, - }) + } + if module, ok := child.(java.DexpreopterInterface); ok { + for _, install := range module.DexpreoptBuiltInstalledForApex() { + af.requiredModuleNames = append(af.requiredModuleNames, install.FullModuleName()) + } + } + p.apexFilesForAndroidMk = append(p.apexFilesForAndroidMk, af) } } else if tag == exportedBootclasspathFragmentTag { // Visit the children of the bootclasspath_fragment. @@ -195,6 +201,14 @@ func (p *prebuiltCommon) initApexFilesForAndroidMk(ctx android.ModuleContext) { }) } +func (p *prebuiltCommon) addRequiredModules(entries *android.AndroidMkEntries) { + for _, fi := range p.apexFilesForAndroidMk { + entries.AddStrings("LOCAL_REQUIRED_MODULES", fi.requiredModuleNames...) + entries.AddStrings("LOCAL_TARGET_REQUIRED_MODULES", fi.targetRequiredModuleNames...) + entries.AddStrings("LOCAL_HOST_REQUIRED_MODULES", fi.hostRequiredModuleNames...) + } +} + func (p *prebuiltCommon) AndroidMkEntries() []android.AndroidMkEntries { entriesList := []android.AndroidMkEntries{ { @@ -213,6 +227,7 @@ func (p *prebuiltCommon) AndroidMkEntries() []android.AndroidMkEntries { if len(postInstallCommands) > 0 { entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(postInstallCommands, " && ")) } + p.addRequiredModules(entries) }, }, }, diff --git a/java/dexpreopt.go b/java/dexpreopt.go index cdd42ed1a..b852615ca 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -160,6 +160,10 @@ func (d *dexpreopter) dexpreoptDisabled(ctx android.BaseModuleContext) bool { } } + if !android.IsModulePreferred(ctx.Module()) { + return true + } + // TODO: contains no java code return false diff --git a/java/sdk_library.go b/java/sdk_library.go index ce8f179af..1d3907178 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -1907,6 +1907,7 @@ type SdkLibraryImport struct { android.SdkBase hiddenAPI + dexpreopter properties sdkLibraryImportProperties @@ -2111,6 +2112,14 @@ func (module *SdkLibraryImport) DepsMutator(ctx android.BottomUpMutatorContext) } } +func (module *SdkLibraryImport) AndroidMkEntries() []android.AndroidMkEntries { + // For an SDK library imported from a prebuilt APEX, we don't need a Make module for itself, as we + // don't need to install it. However, we need to add its dexpreopt outputs as sub-modules, if it + // is preopted. + dexpreoptEntries := module.dexpreopter.AndroidMkEntriesForApex() + return append(dexpreoptEntries, android.AndroidMkEntries{Disabled: true}) +} + var _ android.ApexModule = (*SdkLibraryImport)(nil) // Implements android.ApexModule @@ -2208,8 +2217,16 @@ func (module *SdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleCo di := ctx.OtherModuleProvider(deapexerModule, android.DeapexerProvider).(android.DeapexerInfo) if dexOutputPath := di.PrebuiltExportPath(apexRootRelativePathToJavaLib(module.BaseModuleName())); dexOutputPath != nil { module.dexJarFile = dexOutputPath - module.installFile = android.PathForModuleInPartitionInstall(ctx, "apex", ai.ApexVariationName, apexRootRelativePathToJavaLib(module.BaseModuleName())) + installPath := android.PathForModuleInPartitionInstall( + ctx, "apex", ai.ApexVariationName, apexRootRelativePathToJavaLib(module.BaseModuleName())) + module.installFile = installPath module.initHiddenAPI(ctx, dexOutputPath, module.findScopePaths(apiScopePublic).stubsImplPath[0], nil) + + // Dexpreopting. + module.dexpreopter.installPath = module.dexpreopter.getInstallPath(ctx, installPath) + module.dexpreopter.isSDKLibrary = true + module.dexpreopter.uncompressedDex = shouldUncompressDex(ctx, &module.dexpreopter) + module.dexpreopt(ctx, dexOutputPath) } else { // This should never happen as a variant for a prebuilt_apex is only created if the // prebuilt_apex has been configured to export the java library dex file. @@ -2328,6 +2345,11 @@ func (module *SdkLibraryImport) ImplementationAndResourcesJars() android.Paths { } } +// to satisfy java.DexpreopterInterface interface +func (module *SdkLibraryImport) IsInstallable() bool { + return true +} + var _ android.RequiredFilesFromPrebuiltApex = (*SdkLibraryImport)(nil) func (module *SdkLibraryImport) RequiredFilesFromPrebuiltApex(ctx android.BaseModuleContext) []string { diff --git a/java/sdk_library_test.go b/java/sdk_library_test.go index 938bb2895..d6c0946b1 100644 --- a/java/sdk_library_test.go +++ b/java/sdk_library_test.go @@ -598,6 +598,7 @@ func TestJavaSdkLibraryImport(t *testing.T) { } CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{ + `dex2oatd`, `prebuilt_sdklib.stubs`, `prebuilt_sdklib.stubs.source.test`, `prebuilt_sdklib.stubs.system`, @@ -674,7 +675,6 @@ func TestJavaSdkLibraryImport_Preferred(t *testing.T) { `) CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{ - `dex2oatd`, `prebuilt_sdklib`, `sdklib.impl`, `sdklib.stubs`, @@ -683,6 +683,7 @@ func TestJavaSdkLibraryImport_Preferred(t *testing.T) { }) CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{ + `dex2oatd`, `prebuilt_sdklib.stubs`, `sdklib.impl`, `sdklib.xml`,