Remove internal deapexer module

The build ations will be created by the top-level apex.

Details
1. In GenerateAndroidBuildActions, do a graph walk to determine if the
   apex has exported deps.
2. If there are exported deps, call the newly introduced `deapex`
   function. This registers the build rules and returns a DeapexerInfo
object. This was previously provided by the internal deapexer
dependency.
3. Update `dexpreoptSystemServerJars and `provideApexExportsInfo` to use
   the DeapexerInfo object from (2).

A lot of unit tests that relied on the legacy mechanism of deapexing
have been updated.

Test: go test ./apex
Test: lunch cf_x86_64_phone-next-userdebug (uses mainline prebuilts)
Test: verified no diff in file_list.txt
Bug: 368337090
Change-Id: I0edb681beccac4d2a9ceb73f9a506c081a8a96e0
This commit is contained in:
Spandan Das
2024-09-20 01:09:48 +00:00
parent a326b320ab
commit 52c01a1897
9 changed files with 126 additions and 234 deletions

View File

@@ -194,9 +194,8 @@ func (p *prebuiltCommon) initApexFilesForAndroidMk(ctx android.ModuleContext) {
}
// If this prebuilt has system server jar, create the rules to dexpreopt it and install it alongside the prebuilt apex
func (p *prebuiltCommon) dexpreoptSystemServerJars(ctx android.ModuleContext) {
// If this apex does not export anything, return
if !p.hasExportedDeps() {
func (p *prebuiltCommon) dexpreoptSystemServerJars(ctx android.ModuleContext, di *android.DeapexerInfo) {
if di == nil {
return
}
// If this prebuilt apex has not been selected, return
@@ -205,10 +204,7 @@ func (p *prebuiltCommon) dexpreoptSystemServerJars(ctx android.ModuleContext) {
}
// Use apex_name to determine the api domain of this prebuilt apex
apexName := p.ApexVariationName()
di, err := android.FindDeapexerProviderForModule(ctx)
if err != nil {
ctx.ModuleErrorf(err.Error())
}
// TODO: do not compute twice
dc := dexpreopt.GetGlobalConfig(ctx)
systemServerJarList := dc.AllApexSystemServerJars(ctx)
@@ -545,17 +541,7 @@ func createApexSelectorModule(ctx android.BottomUpMutatorContext, name string, a
)
}
// createDeapexerModuleIfNeeded will create a deapexer module if it is needed.
//
// A deapexer module is only needed when the prebuilt apex specifies one or more modules in either
// the `exported_bootclasspath_fragments` properties as that indicates that
// the listed modules need access to files from within the prebuilt .apex file.
func (p *prebuiltCommon) createDeapexerModuleIfNeeded(ctx android.BottomUpMutatorContext, deapexerName string, apexFileSource string) {
// Only create the deapexer module if it is needed.
if !p.hasExportedDeps() {
return
}
func (p *prebuiltCommon) getDeapexerPropertiesIfNeeded(ctx android.ModuleContext) DeapexerProperties {
// Compute the deapexer properties from the transitive dependencies of this module.
commonModules := []string{}
dexpreoptProfileGuidedModules := []string{}
@@ -589,7 +575,7 @@ func (p *prebuiltCommon) createDeapexerModuleIfNeeded(ctx android.BottomUpMutato
})
// Create properties for deapexer module.
deapexerProperties := &DeapexerProperties{
deapexerProperties := DeapexerProperties{
// Remove any duplicates from the common modules lists as a module may be included via a direct
// dependency as well as transitive ones.
CommonModules: android.SortedUniqueStrings(commonModules),
@@ -598,18 +584,7 @@ func (p *prebuiltCommon) createDeapexerModuleIfNeeded(ctx android.BottomUpMutato
// Populate the exported files property in a fixed order.
deapexerProperties.ExportedFiles = android.SortedUniqueStrings(exportedFiles)
props := struct {
Name *string
Selected_apex *string
}{
Name: proptools.StringPtr(deapexerName),
Selected_apex: proptools.StringPtr(apexFileSource),
}
ctx.CreateModule(privateDeapexerFactory,
&props,
deapexerProperties,
)
return deapexerProperties
}
func apexSelectorModuleName(baseModuleName string) string {
@@ -661,6 +636,7 @@ var (
var _ prebuiltApexModuleCreator = (*Prebuilt)(nil)
// DEPRECATED: This dependency graph is being removed.
// createPrebuiltApexModules creates modules necessary to export files from the prebuilt apex to the
// build.
//
@@ -696,7 +672,6 @@ func (p *Prebuilt) createPrebuiltApexModules(ctx android.BottomUpMutatorContext)
createApexSelectorModule(ctx, apexSelectorModuleName, &p.properties.ApexFileProperties)
apexFileSource := ":" + apexSelectorModuleName
p.createDeapexerModuleIfNeeded(ctx, deapexerModuleName(p.Name()), apexFileSource)
// Add a source reference to retrieve the selected apex from the selector module.
p.prebuiltCommonProperties.Selected_apex = proptools.StringPtr(apexFileSource)
@@ -706,45 +681,43 @@ func (p *Prebuilt) ComponentDepsMutator(ctx android.BottomUpMutatorContext) {
p.prebuiltApexContentsDeps(ctx)
}
func (p *prebuiltCommon) DepsMutator(ctx android.BottomUpMutatorContext) {
if p.hasExportedDeps() {
// Create a dependency from the prebuilt apex (prebuilt_apex/apex_set) to the internal deapexer module
// The deapexer will return a provider which will be used to determine the exported artfifacts from this prebuilt.
ctx.AddDependency(ctx.Module(), android.DeapexerTag, deapexerModuleName(p.Name()))
}
}
var _ ApexInfoMutator = (*Prebuilt)(nil)
func (p *Prebuilt) ApexInfoMutator(mctx android.TopDownMutatorContext) {
p.apexInfoMutator(mctx)
}
// creates the build rules to deapex the prebuilt, and returns a deapexerInfo
func (p *prebuiltCommon) getDeapexerInfo(ctx android.ModuleContext) *android.DeapexerInfo {
if !p.hasExportedDeps() {
// nothing to do
return nil
}
apexFile := android.OptionalPathForModuleSrc(ctx, p.prebuiltCommonProperties.Selected_apex).Path()
deapexerProps := p.getDeapexerPropertiesIfNeeded(ctx)
return deapex(ctx, apexFile, deapexerProps)
}
// Set a provider containing information about the jars and .prof provided by the apex
// Apexes built from prebuilts retrieve this information by visiting its internal deapexer module
// Used by dex_bootjars to generate the boot image
func (p *prebuiltCommon) provideApexExportsInfo(ctx android.ModuleContext) {
if !p.hasExportedDeps() {
// nothing to do
func (p *prebuiltCommon) provideApexExportsInfo(ctx android.ModuleContext, di *android.DeapexerInfo) {
if di == nil {
return
}
if di, err := android.FindDeapexerProviderForModule(ctx); err == nil {
javaModuleToDexPath := map[string]android.Path{}
for _, commonModule := range di.GetExportedModuleNames() {
if dex := di.PrebuiltExportPath(java.ApexRootRelativePathToJavaLib(commonModule)); dex != nil {
javaModuleToDexPath[commonModule] = dex
}
javaModuleToDexPath := map[string]android.Path{}
for _, commonModule := range di.GetExportedModuleNames() {
if dex := di.PrebuiltExportPath(java.ApexRootRelativePathToJavaLib(commonModule)); dex != nil {
javaModuleToDexPath[commonModule] = dex
}
exports := android.ApexExportsInfo{
ApexName: p.ApexVariationName(),
ProfilePathOnHost: di.PrebuiltExportPath(java.ProfileInstallPathInApex),
LibraryNameToDexJarPathOnHost: javaModuleToDexPath,
}
android.SetProvider(ctx, android.ApexExportsInfoProvider, exports)
} else {
ctx.ModuleErrorf(err.Error())
}
exports := android.ApexExportsInfo{
ApexName: p.ApexVariationName(),
ProfilePathOnHost: di.PrebuiltExportPath(java.ProfileInstallPathInApex),
LibraryNameToDexJarPathOnHost: javaModuleToDexPath,
}
android.SetProvider(ctx, android.ApexExportsInfoProvider, exports)
}
// Set prebuiltInfoProvider. This will be used by `apex_prebuiltinfo_singleton` to print out a metadata file
@@ -798,11 +771,13 @@ func (p *Prebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
return
}
deapexerInfo := p.getDeapexerInfo(ctx)
// dexpreopt any system server jars if present
p.dexpreoptSystemServerJars(ctx)
p.dexpreoptSystemServerJars(ctx, deapexerInfo)
// provide info used for generating the boot image
p.provideApexExportsInfo(ctx)
p.provideApexExportsInfo(ctx, deapexerInfo)
p.providePrebuiltInfo(ctx)
@@ -977,7 +952,6 @@ func (a *ApexSet) createPrebuiltApexModules(ctx android.BottomUpMutatorContext)
createApexExtractorModule(ctx, apexExtractorModuleName, &a.properties.ApexExtractorProperties)
apexFileSource := ":" + apexExtractorModuleName
a.createDeapexerModuleIfNeeded(ctx, deapexerModuleName(a.Name()), apexFileSource)
// After passing the arch specific src properties to the creating the apex selector module
a.prebuiltCommonProperties.Selected_apex = proptools.StringPtr(apexFileSource)
@@ -1024,11 +998,13 @@ func (a *ApexSet) GenerateAndroidBuildActions(ctx android.ModuleContext) {
return
}
deapexerInfo := a.getDeapexerInfo(ctx)
// dexpreopt any system server jars if present
a.dexpreoptSystemServerJars(ctx)
a.dexpreoptSystemServerJars(ctx, deapexerInfo)
// provide info used for generating the boot image
a.provideApexExportsInfo(ctx)
a.provideApexExportsInfo(ctx, deapexerInfo)
a.providePrebuiltInfo(ctx)