Loading apex/deapexer.go +29 −15 Original line number Diff line number Diff line Loading @@ -40,17 +40,29 @@ import ( // This is intentionally not registered by name as it is not intended to be used from within an // `Android.bp` file. // Properties that are specific to `deapexer` but which need to be provided on the `prebuilt_apex` // module.` // DeapexerExportedFile defines the properties needed to expose a file from the deapexer module. type DeapexerExportedFile struct { // The tag parameter which must be passed to android.OutputFileProducer OutputFiles(tag) method // to retrieve the path to the unpacked file. Tag string // The path within the APEX that needs to be exported. Path string `android:"path"` } // DeapexerProperties specifies the properties supported by the deapexer module. // // As these are never intended to be supplied in a .bp file they use a different naming convention // to make it clear that they are different. type DeapexerProperties struct { // List of java libraries that are embedded inside this prebuilt APEX bundle and for which this // APEX bundle will create an APEX variant and provide dex implementation jars for use by // dexpreopt and boot jars package check. Exported_java_libs []string // List of bootclasspath fragments inside this prebuiltd APEX bundle and for which this APEX // bundle will create an APEX variant. Exported_bootclasspath_fragments []string // List of common modules that may need access to files exported by this module. // // A common module in this sense is one that is not arch specific but uses a common variant for // all architectures, e.g. java. CommonModules []string // List of files exported from the .apex file by this module ExportedFiles []DeapexerExportedFile } type SelectedApexProperties struct { Loading Loading @@ -81,7 +93,7 @@ func privateDeapexerFactory() android.Module { func (p *Deapexer) DepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies from the java modules to which this exports files from the `.apex` file onto // this module so that they can access the `DeapexerInfo` object that this provides. for _, lib := range p.properties.Exported_java_libs { for _, lib := range p.properties.CommonModules { dep := prebuiltApexExportedModuleName(ctx, lib) ctx.AddReverseDependency(ctx.Module(), android.DeapexerTag, dep) } Loading @@ -96,10 +108,12 @@ func (p *Deapexer) GenerateAndroidBuildActions(ctx android.ModuleContext) { exports := make(map[string]android.Path) // Create mappings from name+tag to all the required exported paths. for _, l := range p.properties.Exported_java_libs { // Populate the exports that this makes available. The path here must match the path of the // file in the APEX created by apexFileForJavaModule(...). exports[l+"{.dexjar}"] = deapexerOutput.Join(ctx, "javalib", l+".jar") for _, e := range p.properties.ExportedFiles { tag := e.Tag path := e.Path // Populate the exports that this makes available. exports[tag] = deapexerOutput.Join(ctx, path) } // If the prebuilt_apex exports any files then create a build rule that unpacks the apex using Loading apex/prebuilt.go +32 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package apex import ( "fmt" "path/filepath" "strconv" "strings" Loading Loading @@ -57,10 +58,18 @@ type sanitizedPrebuilt interface { } type prebuiltCommonProperties struct { DeapexerProperties SelectedApexProperties ForceDisable bool `blueprint:"mutated"` // List of java libraries that are embedded inside this prebuilt APEX bundle and for which this // APEX bundle will create an APEX variant and provide dex implementation jars for use by // dexpreopt and boot jars package check. Exported_java_libs []string // List of bootclasspath fragments inside this prebuilt APEX bundle and for which this APEX // bundle will create an APEX variant. Exported_bootclasspath_fragments []string } func (p *prebuiltCommon) Prebuilt() *android.Prebuilt { Loading Loading @@ -411,15 +420,20 @@ func createDeapexerModuleIfNeeded(ctx android.TopDownMutatorContext, deapexerNam } // Compute the deapexer properties from the transitive dependencies of this module. deapexerProperties := &DeapexerProperties{} javaModules := []string{} exportedFiles := map[string]string{} ctx.WalkDeps(func(child, parent android.Module) bool { tag := ctx.OtherModuleDependencyTag(child) name := android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(child)) if java.IsBootclasspathFragmentContentDepTag(tag) || tag == exportedJavaLibTag { deapexerProperties.Exported_java_libs = append(deapexerProperties.Exported_java_libs, name) javaModules = append(javaModules, name) // Add the dex implementation jar to the set of exported files. The path here must match the // path of the file in the APEX created by apexFileForJavaModule(...). exportedFiles[name+"{.dexjar}"] = filepath.Join("javalib", name+".jar") } else if tag == exportedBootclasspathFragmentTag { deapexerProperties.Exported_bootclasspath_fragments = append(deapexerProperties.Exported_bootclasspath_fragments, name) // Only visit the children of the bootclasspath_fragment for now. return true } Loading @@ -427,9 +441,20 @@ func createDeapexerModuleIfNeeded(ctx android.TopDownMutatorContext, deapexerNam return false }) // Remove any duplicates from the deapexer lists. deapexerProperties.Exported_bootclasspath_fragments = android.FirstUniqueStrings(deapexerProperties.Exported_bootclasspath_fragments) deapexerProperties.Exported_java_libs = android.FirstUniqueStrings(deapexerProperties.Exported_java_libs) // Create properties for deapexer module. deapexerProperties := &DeapexerProperties{ // Remove any duplicates from the java modules lists as a module may be included via a direct // dependency as well as transitive ones. CommonModules: android.SortedUniqueStrings(javaModules), } // Populate the exported files property in a fixed order. for _, tag := range android.SortedStringKeys(exportedFiles) { deapexerProperties.ExportedFiles = append(deapexerProperties.ExportedFiles, DeapexerExportedFile{ Tag: tag, Path: exportedFiles[tag], }) } props := struct { Name *string Loading Loading
apex/deapexer.go +29 −15 Original line number Diff line number Diff line Loading @@ -40,17 +40,29 @@ import ( // This is intentionally not registered by name as it is not intended to be used from within an // `Android.bp` file. // Properties that are specific to `deapexer` but which need to be provided on the `prebuilt_apex` // module.` // DeapexerExportedFile defines the properties needed to expose a file from the deapexer module. type DeapexerExportedFile struct { // The tag parameter which must be passed to android.OutputFileProducer OutputFiles(tag) method // to retrieve the path to the unpacked file. Tag string // The path within the APEX that needs to be exported. Path string `android:"path"` } // DeapexerProperties specifies the properties supported by the deapexer module. // // As these are never intended to be supplied in a .bp file they use a different naming convention // to make it clear that they are different. type DeapexerProperties struct { // List of java libraries that are embedded inside this prebuilt APEX bundle and for which this // APEX bundle will create an APEX variant and provide dex implementation jars for use by // dexpreopt and boot jars package check. Exported_java_libs []string // List of bootclasspath fragments inside this prebuiltd APEX bundle and for which this APEX // bundle will create an APEX variant. Exported_bootclasspath_fragments []string // List of common modules that may need access to files exported by this module. // // A common module in this sense is one that is not arch specific but uses a common variant for // all architectures, e.g. java. CommonModules []string // List of files exported from the .apex file by this module ExportedFiles []DeapexerExportedFile } type SelectedApexProperties struct { Loading Loading @@ -81,7 +93,7 @@ func privateDeapexerFactory() android.Module { func (p *Deapexer) DepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies from the java modules to which this exports files from the `.apex` file onto // this module so that they can access the `DeapexerInfo` object that this provides. for _, lib := range p.properties.Exported_java_libs { for _, lib := range p.properties.CommonModules { dep := prebuiltApexExportedModuleName(ctx, lib) ctx.AddReverseDependency(ctx.Module(), android.DeapexerTag, dep) } Loading @@ -96,10 +108,12 @@ func (p *Deapexer) GenerateAndroidBuildActions(ctx android.ModuleContext) { exports := make(map[string]android.Path) // Create mappings from name+tag to all the required exported paths. for _, l := range p.properties.Exported_java_libs { // Populate the exports that this makes available. The path here must match the path of the // file in the APEX created by apexFileForJavaModule(...). exports[l+"{.dexjar}"] = deapexerOutput.Join(ctx, "javalib", l+".jar") for _, e := range p.properties.ExportedFiles { tag := e.Tag path := e.Path // Populate the exports that this makes available. exports[tag] = deapexerOutput.Join(ctx, path) } // If the prebuilt_apex exports any files then create a build rule that unpacks the apex using Loading
apex/prebuilt.go +32 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package apex import ( "fmt" "path/filepath" "strconv" "strings" Loading Loading @@ -57,10 +58,18 @@ type sanitizedPrebuilt interface { } type prebuiltCommonProperties struct { DeapexerProperties SelectedApexProperties ForceDisable bool `blueprint:"mutated"` // List of java libraries that are embedded inside this prebuilt APEX bundle and for which this // APEX bundle will create an APEX variant and provide dex implementation jars for use by // dexpreopt and boot jars package check. Exported_java_libs []string // List of bootclasspath fragments inside this prebuilt APEX bundle and for which this APEX // bundle will create an APEX variant. Exported_bootclasspath_fragments []string } func (p *prebuiltCommon) Prebuilt() *android.Prebuilt { Loading Loading @@ -411,15 +420,20 @@ func createDeapexerModuleIfNeeded(ctx android.TopDownMutatorContext, deapexerNam } // Compute the deapexer properties from the transitive dependencies of this module. deapexerProperties := &DeapexerProperties{} javaModules := []string{} exportedFiles := map[string]string{} ctx.WalkDeps(func(child, parent android.Module) bool { tag := ctx.OtherModuleDependencyTag(child) name := android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(child)) if java.IsBootclasspathFragmentContentDepTag(tag) || tag == exportedJavaLibTag { deapexerProperties.Exported_java_libs = append(deapexerProperties.Exported_java_libs, name) javaModules = append(javaModules, name) // Add the dex implementation jar to the set of exported files. The path here must match the // path of the file in the APEX created by apexFileForJavaModule(...). exportedFiles[name+"{.dexjar}"] = filepath.Join("javalib", name+".jar") } else if tag == exportedBootclasspathFragmentTag { deapexerProperties.Exported_bootclasspath_fragments = append(deapexerProperties.Exported_bootclasspath_fragments, name) // Only visit the children of the bootclasspath_fragment for now. return true } Loading @@ -427,9 +441,20 @@ func createDeapexerModuleIfNeeded(ctx android.TopDownMutatorContext, deapexerNam return false }) // Remove any duplicates from the deapexer lists. deapexerProperties.Exported_bootclasspath_fragments = android.FirstUniqueStrings(deapexerProperties.Exported_bootclasspath_fragments) deapexerProperties.Exported_java_libs = android.FirstUniqueStrings(deapexerProperties.Exported_java_libs) // Create properties for deapexer module. deapexerProperties := &DeapexerProperties{ // Remove any duplicates from the java modules lists as a module may be included via a direct // dependency as well as transitive ones. CommonModules: android.SortedUniqueStrings(javaModules), } // Populate the exported files property in a fixed order. for _, tag := range android.SortedStringKeys(exportedFiles) { deapexerProperties.ExportedFiles = append(deapexerProperties.ExportedFiles, DeapexerExportedFile{ Tag: tag, Path: exportedFiles[tag], }) } props := struct { Name *string Loading