Convert apex modules to app bundle modules
Convert .apex files to base.zip files suitable for bundletool. They will be copied to the dist directory when built with TARGET_BUILD_APPS and dist. Also fix up apex.go to use Build instead of the deprecated ModuleBuild, and ctx.ModuleName() instead of module.ModuleBase.Name(). Bug: 117295826 Test: tapas com.android.runtime && m dist Change-Id: I7919c8d3da280e87c624a6628a1715e8060852dc
This commit is contained in:
67
apex/apex.go
67
apex/apex.go
@@ -61,6 +61,18 @@ var (
|
|||||||
"${soong_zip}", "${zipalign}", "${aapt2}"},
|
"${soong_zip}", "${zipalign}", "${aapt2}"},
|
||||||
Description: "APEX ${image_dir} => ${out}",
|
Description: "APEX ${image_dir} => ${out}",
|
||||||
}, "tool_path", "image_dir", "copy_commands", "manifest", "file_contexts", "canned_fs_config", "key")
|
}, "tool_path", "image_dir", "copy_commands", "manifest", "file_contexts", "canned_fs_config", "key")
|
||||||
|
|
||||||
|
apexProtoConvertRule = pctx.AndroidStaticRule("apexProtoConvertRule",
|
||||||
|
blueprint.RuleParams{
|
||||||
|
Command: `${aapt2} convert --output-format proto $in -o $out`,
|
||||||
|
CommandDeps: []string{"${aapt2}"},
|
||||||
|
})
|
||||||
|
|
||||||
|
apexBundleRule = pctx.StaticRule("apexBundleRule", blueprint.RuleParams{
|
||||||
|
Command: `${zip2zip} -i $in -o $out image.img:apex/${abi}.img manifest.json:root/manifest.json AndroidManifest.xml:manifest/AndroidManifest.xml`,
|
||||||
|
CommandDeps: []string{"${zip2zip}"},
|
||||||
|
Description: "app bundle",
|
||||||
|
}, "abi")
|
||||||
)
|
)
|
||||||
|
|
||||||
var apexSuffix = ".apex"
|
var apexSuffix = ".apex"
|
||||||
@@ -102,6 +114,7 @@ func init() {
|
|||||||
pctx.HostBinToolVariable("resize2fs", "resize2fs")
|
pctx.HostBinToolVariable("resize2fs", "resize2fs")
|
||||||
pctx.HostBinToolVariable("sefcontext_compile", "sefcontext_compile")
|
pctx.HostBinToolVariable("sefcontext_compile", "sefcontext_compile")
|
||||||
pctx.HostBinToolVariable("soong_zip", "soong_zip")
|
pctx.HostBinToolVariable("soong_zip", "soong_zip")
|
||||||
|
pctx.HostBinToolVariable("zip2zip", "zip2zip")
|
||||||
pctx.HostBinToolVariable("zipalign", "zipalign")
|
pctx.HostBinToolVariable("zipalign", "zipalign")
|
||||||
|
|
||||||
android.RegisterModuleType("apex", apexBundleFactory)
|
android.RegisterModuleType("apex", apexBundleFactory)
|
||||||
@@ -123,10 +136,10 @@ func apexBundleNamesFor(config android.Config) map[string]map[string]bool {
|
|||||||
// can be built for the apex bundles.
|
// can be built for the apex bundles.
|
||||||
func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
||||||
if _, ok := mctx.Module().(*apexBundle); ok {
|
if _, ok := mctx.Module().(*apexBundle); ok {
|
||||||
apexBundleName := mctx.Module().Name()
|
apexBundleName := mctx.ModuleName()
|
||||||
mctx.WalkDeps(func(child, parent android.Module) bool {
|
mctx.WalkDeps(func(child, parent android.Module) bool {
|
||||||
if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() {
|
if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() {
|
||||||
moduleName := am.Name() + "-" + am.Target().String()
|
moduleName := mctx.OtherModuleName(am) + "-" + am.Target().String()
|
||||||
bundleNames, ok := apexBundleNamesFor(mctx.Config())[moduleName]
|
bundleNames, ok := apexBundleNamesFor(mctx.Config())[moduleName]
|
||||||
if !ok {
|
if !ok {
|
||||||
bundleNames = make(map[string]bool)
|
bundleNames = make(map[string]bool)
|
||||||
@@ -144,7 +157,7 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
|||||||
// Create apex variations if a module is included in APEX(s).
|
// Create apex variations if a module is included in APEX(s).
|
||||||
func apexMutator(mctx android.BottomUpMutatorContext) {
|
func apexMutator(mctx android.BottomUpMutatorContext) {
|
||||||
if am, ok := mctx.Module().(android.ApexModule); ok && am.CanHaveApexVariants() {
|
if am, ok := mctx.Module().(android.ApexModule); ok && am.CanHaveApexVariants() {
|
||||||
moduleName := am.Name() + "-" + am.Target().String()
|
moduleName := mctx.ModuleName() + "-" + am.Target().String()
|
||||||
if bundleNames, ok := apexBundleNamesFor(mctx.Config())[moduleName]; ok {
|
if bundleNames, ok := apexBundleNamesFor(mctx.Config())[moduleName]; ok {
|
||||||
variations := []string{"platform"}
|
variations := []string{"platform"}
|
||||||
for bn := range bundleNames {
|
for bn := range bundleNames {
|
||||||
@@ -268,6 +281,7 @@ type apexBundle struct {
|
|||||||
|
|
||||||
properties apexBundleProperties
|
properties apexBundleProperties
|
||||||
|
|
||||||
|
bundleModuleFile android.WritablePath
|
||||||
outputFile android.WritablePath
|
outputFile android.WritablePath
|
||||||
installDir android.OutputPath
|
installDir android.OutputPath
|
||||||
|
|
||||||
@@ -518,7 +532,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
filesInfo[i].moduleName = ctx.ModuleName() + "." + filesInfo[i].moduleName
|
filesInfo[i].moduleName = ctx.ModuleName() + "." + filesInfo[i].moduleName
|
||||||
}
|
}
|
||||||
|
|
||||||
a.flattened = ctx.Config().FlattenApex()
|
a.flattened = ctx.Config().FlattenApex() && !ctx.Config().UnbundledBuild()
|
||||||
a.installDir = android.PathForModuleInstall(ctx, "apex")
|
a.installDir = android.PathForModuleInstall(ctx, "apex")
|
||||||
a.filesInfo = filesInfo
|
a.filesInfo = filesInfo
|
||||||
if ctx.Config().FlattenApex() {
|
if ctx.Config().FlattenApex() {
|
||||||
@@ -558,9 +572,10 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
|
|||||||
sort.Strings(readOnlyPaths)
|
sort.Strings(readOnlyPaths)
|
||||||
sort.Strings(executablePaths)
|
sort.Strings(executablePaths)
|
||||||
cannedFsConfig := android.PathForModuleOut(ctx, "canned_fs_config")
|
cannedFsConfig := android.PathForModuleOut(ctx, "canned_fs_config")
|
||||||
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
|
ctx.Build(pctx, android.BuildParams{
|
||||||
Rule: generateFsConfig,
|
Rule: generateFsConfig,
|
||||||
Output: cannedFsConfig,
|
Output: cannedFsConfig,
|
||||||
|
Description: "generate fs config",
|
||||||
Args: map[string]string{
|
Args: map[string]string{
|
||||||
"ro_paths": strings.Join(readOnlyPaths, " "),
|
"ro_paths": strings.Join(readOnlyPaths, " "),
|
||||||
"exec_paths": strings.Join(executablePaths, " "),
|
"exec_paths": strings.Join(executablePaths, " "),
|
||||||
@@ -569,7 +584,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
|
|||||||
|
|
||||||
manifest := android.PathForModuleSrc(ctx, proptools.StringDefault(a.properties.Manifest, "manifest.json"))
|
manifest := android.PathForModuleSrc(ctx, proptools.StringDefault(a.properties.Manifest, "manifest.json"))
|
||||||
|
|
||||||
fcName := proptools.StringDefault(a.properties.File_contexts, a.ModuleBase.Name())
|
fcName := proptools.StringDefault(a.properties.File_contexts, ctx.ModuleName())
|
||||||
fileContextsPath := "system/sepolicy/apex/" + fcName + "-file_contexts"
|
fileContextsPath := "system/sepolicy/apex/" + fcName + "-file_contexts"
|
||||||
fileContextsOptionalPath := android.ExistentPathForSource(ctx, fileContextsPath)
|
fileContextsOptionalPath := android.ExistentPathForSource(ctx, fileContextsPath)
|
||||||
if !fileContextsOptionalPath.Valid() {
|
if !fileContextsOptionalPath.Valid() {
|
||||||
@@ -578,7 +593,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
|
|||||||
}
|
}
|
||||||
fileContexts := fileContextsOptionalPath.Path()
|
fileContexts := fileContextsOptionalPath.Path()
|
||||||
|
|
||||||
unsignedOutputFile := android.PathForModuleOut(ctx, a.ModuleBase.Name()+apexSuffix+".unsigned")
|
unsignedOutputFile := android.PathForModuleOut(ctx, ctx.ModuleName()+apexSuffix+".unsigned")
|
||||||
|
|
||||||
filesToCopy := []android.Path{}
|
filesToCopy := []android.Path{}
|
||||||
for _, f := range a.filesInfo {
|
for _, f := range a.filesInfo {
|
||||||
@@ -596,10 +611,11 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
|
|||||||
implicitInputs = append(implicitInputs, cannedFsConfig, manifest, fileContexts, keyFile)
|
implicitInputs = append(implicitInputs, cannedFsConfig, manifest, fileContexts, keyFile)
|
||||||
outHostBinDir := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "bin").String()
|
outHostBinDir := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "bin").String()
|
||||||
prebuiltSdkToolsBinDir := filepath.Join("prebuilts", "sdk", "tools", runtime.GOOS, "bin")
|
prebuiltSdkToolsBinDir := filepath.Join("prebuilts", "sdk", "tools", runtime.GOOS, "bin")
|
||||||
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
|
ctx.Build(pctx, android.BuildParams{
|
||||||
Rule: apexRule,
|
Rule: apexRule,
|
||||||
Implicits: implicitInputs,
|
Implicits: implicitInputs,
|
||||||
Output: unsignedOutputFile,
|
Output: unsignedOutputFile,
|
||||||
|
Description: "apex",
|
||||||
Args: map[string]string{
|
Args: map[string]string{
|
||||||
"tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir,
|
"tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir,
|
||||||
"image_dir": android.PathForModuleOut(ctx, "image").String(),
|
"image_dir": android.PathForModuleOut(ctx, "image").String(),
|
||||||
@@ -611,7 +627,34 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
a.outputFile = android.PathForModuleOut(ctx, a.ModuleBase.Name()+apexSuffix)
|
var abis []string
|
||||||
|
for _, target := range ctx.MultiTargets() {
|
||||||
|
abis = append(abis, target.Arch.Abi[0])
|
||||||
|
}
|
||||||
|
abis = android.FirstUniqueStrings(abis)
|
||||||
|
|
||||||
|
apexProtoFile := android.PathForModuleOut(ctx, ctx.ModuleName()+".pb"+apexSuffix)
|
||||||
|
bundleModuleFile := android.PathForModuleOut(ctx, ctx.ModuleName()+"-base.zip")
|
||||||
|
a.bundleModuleFile = bundleModuleFile
|
||||||
|
|
||||||
|
ctx.Build(pctx, android.BuildParams{
|
||||||
|
Rule: apexProtoConvertRule,
|
||||||
|
Input: unsignedOutputFile,
|
||||||
|
Output: apexProtoFile,
|
||||||
|
Description: "apex proto convert",
|
||||||
|
})
|
||||||
|
|
||||||
|
ctx.Build(pctx, android.BuildParams{
|
||||||
|
Rule: apexBundleRule,
|
||||||
|
Input: apexProtoFile,
|
||||||
|
Output: bundleModuleFile,
|
||||||
|
Description: "apex bundle module",
|
||||||
|
Args: map[string]string{
|
||||||
|
"abi": strings.Join(abis, "."),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
a.outputFile = android.PathForModuleOut(ctx, ctx.ModuleName()+apexSuffix)
|
||||||
ctx.Build(pctx, android.BuildParams{
|
ctx.Build(pctx, android.BuildParams{
|
||||||
Rule: java.Signapk,
|
Rule: java.Signapk,
|
||||||
Description: "signapk",
|
Description: "signapk",
|
||||||
@@ -627,10 +670,10 @@ func (a *apexBundle) buildFlattenedApex(ctx android.ModuleContext) {
|
|||||||
// For flattened APEX, do nothing but make sure that manifest.json file is also copied along
|
// For flattened APEX, do nothing but make sure that manifest.json file is also copied along
|
||||||
// with other ordinary files.
|
// with other ordinary files.
|
||||||
manifest := android.PathForModuleSrc(ctx, proptools.StringDefault(a.properties.Manifest, "manifest.json"))
|
manifest := android.PathForModuleSrc(ctx, proptools.StringDefault(a.properties.Manifest, "manifest.json"))
|
||||||
a.filesInfo = append(a.filesInfo, apexFile{manifest, a.Name() + ".manifest.json", android.Common, ".", etc})
|
a.filesInfo = append(a.filesInfo, apexFile{manifest, ctx.ModuleName() + ".manifest.json", android.Common, ".", etc})
|
||||||
|
|
||||||
for _, fi := range a.filesInfo {
|
for _, fi := range a.filesInfo {
|
||||||
dir := filepath.Join("apex", a.Name(), fi.installDir)
|
dir := filepath.Join("apex", ctx.ModuleName(), fi.installDir)
|
||||||
ctx.InstallFile(android.PathForModuleInstall(ctx, dir), fi.builtFile.Base(), fi.builtFile)
|
ctx.InstallFile(android.PathForModuleInstall(ctx, dir), fi.builtFile.Base(), fi.builtFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -684,6 +727,8 @@ func (a *apexBundle) AndroidMk() android.AndroidMkData {
|
|||||||
fmt.Fprintln(w, "LOCAL_INSTALLED_MODULE_STEM :=", name+apexSuffix)
|
fmt.Fprintln(w, "LOCAL_INSTALLED_MODULE_STEM :=", name+apexSuffix)
|
||||||
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", String(a.properties.Key))
|
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", String(a.properties.Key))
|
||||||
fmt.Fprintln(w, "include $(BUILD_PREBUILT)")
|
fmt.Fprintln(w, "include $(BUILD_PREBUILT)")
|
||||||
|
|
||||||
|
fmt.Fprintln(w, "ALL_MODULES.$(LOCAL_MODULE).BUNDLE :=", a.bundleModuleFile.String())
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user