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:
102
apex/prebuilt.go
102
apex/prebuilt.go
@@ -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)
|
||||
|
||||
|
Reference in New Issue
Block a user