Revert "Remove apex.apex_name"

This reverts commit df26332d50.

Reason for revert: DroidMonitor-triggered revert due to breakage https://android-build.googleplex.com/builds/quarterdeck?branch=git_tm-qpr-dev-plus-aosp&target=aosp_sunfish-userdebug&lkgb=9578804&lkbb=9579062&fkbb=9578931, bug b/268301897

Change-Id: I819a416286cda63a6fa8d3d6b4343c86638b4dc9
BUG: 268301897
This commit is contained in:
Marco Loaiza
2023-02-08 10:14:01 +00:00
committed by Gerrit Code Review
parent df26332d50
commit d1209a89c7
4 changed files with 71 additions and 21 deletions

View File

@@ -24,6 +24,8 @@ import (
"android/soong/cc" "android/soong/cc"
"android/soong/java" "android/soong/java"
"android/soong/rust" "android/soong/rust"
"github.com/google/blueprint/proptools"
) )
func (a *apexBundle) AndroidMk() android.AndroidMkData { func (a *apexBundle) AndroidMk() android.AndroidMkData {
@@ -72,15 +74,12 @@ func (a *apexBundle) fullModuleName(apexBundleName string, fi *apexFile) string
return fi.androidMkModuleName + "." + apexBundleName + a.suffix return fi.androidMkModuleName + "." + apexBundleName + a.suffix
} }
func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, moduleDir string, func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, apexName, moduleDir string,
apexAndroidMkData android.AndroidMkData) []string { apexAndroidMkData android.AndroidMkData) []string {
// apexBundleName comes from the 'name' property or soong module. // apexBundleName comes from the 'name' property; apexName comes from 'apex_name' property.
// apexName comes from 'name' property of apex_manifest.
// An apex is installed to /system/apex/<apexBundleName> and is activated at /apex/<apexName> // An apex is installed to /system/apex/<apexBundleName> and is activated at /apex/<apexName>
// In many cases, the two names are the same, but could be different in general. // In many cases, the two names are the same, but could be different in general.
// However, symbol files for apex files are installed under /apex/<apexBundleName> to avoid
// conflicts between two apexes with the same apexName.
moduleNames := []string{} moduleNames := []string{}
apexType := a.properties.ApexType apexType := a.properties.ApexType
@@ -91,6 +90,11 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, moduleDir st
return moduleNames return moduleNames
} }
// b/162366062. Prevent GKI APEXes to emit make rules to avoid conflicts.
if strings.HasPrefix(apexName, "com.android.gki.") && apexType != flattenedApex {
return moduleNames
}
seenDataOutPaths := make(map[string]bool) seenDataOutPaths := make(map[string]bool)
for _, fi := range a.filesInfo { for _, fi := range a.filesInfo {
@@ -127,15 +131,15 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, moduleDir st
if fi.module != nil && fi.module.Owner() != "" { if fi.module != nil && fi.module.Owner() != "" {
fmt.Fprintln(w, "LOCAL_MODULE_OWNER :=", fi.module.Owner()) fmt.Fprintln(w, "LOCAL_MODULE_OWNER :=", fi.module.Owner())
} }
// /apex/<apexBundleName>/{lib|framework|...} // /apex/<apex_name>/{lib|framework|...}
pathForSymbol := filepath.Join("$(PRODUCT_OUT)", "apex", apexBundleName, fi.installDir) pathWhenActivated := filepath.Join("$(PRODUCT_OUT)", "apex", apexName, fi.installDir)
var modulePath string var modulePath string
if apexType == flattenedApex { if apexType == flattenedApex {
// /system/apex/<apexBundleName>/{lib|framework|...} // /system/apex/<name>/{lib|framework|...}
modulePath = filepath.Join(a.installDir.String(), apexBundleName, fi.installDir) modulePath = filepath.Join(a.installDir.String(), apexBundleName, fi.installDir)
fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", modulePath) fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", modulePath)
if a.primaryApexType { if a.primaryApexType {
fmt.Fprintln(w, "LOCAL_SOONG_SYMBOL_PATH :=", pathForSymbol) fmt.Fprintln(w, "LOCAL_SOONG_SYMBOL_PATH :=", pathWhenActivated)
} }
android.AndroidMkEmitAssignList(w, "LOCAL_MODULE_SYMLINKS", fi.symlinks) android.AndroidMkEmitAssignList(w, "LOCAL_MODULE_SYMLINKS", fi.symlinks)
newDataPaths := []android.DataPath{} newDataPaths := []android.DataPath{}
@@ -148,8 +152,8 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, moduleDir st
} }
android.AndroidMkEmitAssignList(w, "LOCAL_TEST_DATA", android.AndroidMkDataPaths(newDataPaths)) android.AndroidMkEmitAssignList(w, "LOCAL_TEST_DATA", android.AndroidMkDataPaths(newDataPaths))
} else { } else {
modulePath = pathForSymbol modulePath = pathWhenActivated
fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", modulePath) fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", pathWhenActivated)
// For non-flattend APEXes, the merged notice file is attached to the APEX itself. // For non-flattend APEXes, the merged notice file is attached to the APEX itself.
// We don't need to have notice file for the individual modules in it. Otherwise, // We don't need to have notice file for the individual modules in it. Otherwise,
@@ -307,7 +311,8 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData {
moduleNames := []string{} moduleNames := []string{}
apexType := a.properties.ApexType apexType := a.properties.ApexType
if a.installable() { if a.installable() {
moduleNames = a.androidMkForFiles(w, name, moduleDir, data) apexName := proptools.StringDefault(a.properties.Apex_name, name)
moduleNames = a.androidMkForFiles(w, name, apexName, moduleDir, data)
} }
if apexType == flattenedApex { if apexType == flattenedApex {

View File

@@ -94,6 +94,10 @@ type apexBundleProperties struct {
// a default one is automatically generated. // a default one is automatically generated.
AndroidManifest *string `android:"path"` AndroidManifest *string `android:"path"`
// Canonical name of this APEX bundle. Used to determine the path to the activated APEX on
// device (/apex/<apex_name>). If unspecified, follows the name property.
Apex_name *string
// Determines the file contexts file for setting the security contexts to files in this APEX // Determines the file contexts file for setting the security contexts to files in this APEX
// bundle. For platform APEXes, this should points to a file under /system/sepolicy Default: // bundle. For platform APEXes, this should points to a file under /system/sepolicy Default:
// /system/sepolicy/apex/<module_name>_file_contexts. // /system/sepolicy/apex/<module_name>_file_contexts.
@@ -1033,7 +1037,7 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) {
// This is the main part of this mutator. Mark the collected dependencies that they need to // This is the main part of this mutator. Mark the collected dependencies that they need to
// be built for this apexBundle. // be built for this apexBundle.
apexVariationName := mctx.ModuleName() // could be com.android.foo apexVariationName := proptools.StringDefault(a.properties.Apex_name, mctx.ModuleName()) // could be com.android.foo
a.properties.ApexVariationName = apexVariationName a.properties.ApexVariationName = apexVariationName
apexInfo := android.ApexInfo{ apexInfo := android.ApexInfo{
ApexVariationName: apexVariationName, ApexVariationName: apexVariationName,

View File

@@ -4105,11 +4105,52 @@ func TestDependenciesInApexManifest(t *testing.T) {
ensureListEmpty(t, requireNativeLibs) ensureListEmpty(t, requireNativeLibs)
} }
func TestApexName(t *testing.T) {
ctx := testApex(t, `
apex {
name: "myapex",
key: "myapex.key",
apex_name: "com.android.myapex",
native_shared_libs: ["mylib"],
updatable: false,
}
apex_key {
name: "myapex.key",
public_key: "testkey.avbpubkey",
private_key: "testkey.pem",
}
cc_library {
name: "mylib",
srcs: ["mylib.cpp"],
system_shared_libs: [],
stl: "none",
apex_available: [
"//apex_available:platform",
"myapex",
],
}
`)
module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
apexBundle := module.Module().(*apexBundle)
data := android.AndroidMkDataForTest(t, ctx, apexBundle)
name := apexBundle.BaseModuleName()
prefix := "TARGET_"
var builder strings.Builder
data.Custom(&builder, name, prefix, "", data)
androidMk := builder.String()
ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
}
func TestOverrideApexManifestDefaultVersion(t *testing.T) { func TestOverrideApexManifestDefaultVersion(t *testing.T) {
ctx := testApex(t, ` ctx := testApex(t, `
apex { apex {
name: "myapex", name: "myapex",
key: "myapex.key", key: "myapex.key",
apex_name: "com.android.myapex",
native_shared_libs: ["mylib"], native_shared_libs: ["mylib"],
updatable: false, updatable: false,
} }
@@ -4134,7 +4175,7 @@ func TestOverrideApexManifestDefaultVersion(t *testing.T) {
"OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234", "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
})) }))
module := ctx.ModuleForTests("myapex", "android_common_myapex_image") module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
apexManifestRule := module.Rule("apexManifestRule") apexManifestRule := module.Rule("apexManifestRule")
ensureContains(t, apexManifestRule.Args["default_version"], "1234") ensureContains(t, apexManifestRule.Args["default_version"], "1234")
} }

View File

@@ -446,7 +446,7 @@ func markManifestTestOnly(ctx android.ModuleContext, androidManifestFile android
func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
apexType := a.properties.ApexType apexType := a.properties.ApexType
suffix := apexType.suffix() suffix := apexType.suffix()
apexName := a.BaseModuleName() apexName := proptools.StringDefault(a.properties.Apex_name, a.BaseModuleName())
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////
// Step 1: copy built files to appropriate directories under the image directory // Step 1: copy built files to appropriate directories under the image directory
@@ -461,7 +461,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
// TODO(jiyong): use the RuleBuilder // TODO(jiyong): use the RuleBuilder
var copyCommands []string var copyCommands []string
var implicitInputs []android.Path var implicitInputs []android.Path
apexDir := android.PathForModuleInPartitionInstall(ctx, "apex", apexName) pathWhenActivated := android.PathForModuleInPartitionInstall(ctx, "apex", apexName)
for _, fi := range a.filesInfo { for _, fi := range a.filesInfo {
destPath := imageDir.Join(ctx, fi.path()).String() destPath := imageDir.Join(ctx, fi.path()).String()
// Prepare the destination path // Prepare the destination path
@@ -491,12 +491,12 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
fmt.Sprintf("unzip -qDD -d %s %s", destPathDir, fmt.Sprintf("unzip -qDD -d %s %s", destPathDir,
fi.module.(*java.AndroidAppSet).PackedAdditionalOutputs().String())) fi.module.(*java.AndroidAppSet).PackedAdditionalOutputs().String()))
if installSymbolFiles { if installSymbolFiles {
installedPath = ctx.InstallFileWithExtraFilesZip(apexDir.Join(ctx, fi.installDir), installedPath = ctx.InstallFileWithExtraFilesZip(pathWhenActivated.Join(ctx, fi.installDir),
fi.stem(), fi.builtFile, fi.module.(*java.AndroidAppSet).PackedAdditionalOutputs()) fi.stem(), fi.builtFile, fi.module.(*java.AndroidAppSet).PackedAdditionalOutputs())
} }
} else { } else {
if installSymbolFiles { if installSymbolFiles {
installedPath = ctx.InstallFile(apexDir.Join(ctx, fi.installDir), fi.stem(), fi.builtFile) installedPath = ctx.InstallFile(pathWhenActivated.Join(ctx, fi.installDir), fi.stem(), fi.builtFile)
} }
} }
implicitInputs = append(implicitInputs, fi.builtFile) implicitInputs = append(implicitInputs, fi.builtFile)
@@ -510,7 +510,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
symlinkDest := imageDir.Join(ctx, symlinkPath).String() symlinkDest := imageDir.Join(ctx, symlinkPath).String()
copyCommands = append(copyCommands, "ln -sfn "+filepath.Base(destPath)+" "+symlinkDest) copyCommands = append(copyCommands, "ln -sfn "+filepath.Base(destPath)+" "+symlinkDest)
if installSymbolFiles { if installSymbolFiles {
installedSymlink := ctx.InstallSymlink(apexDir.Join(ctx, filepath.Dir(symlinkPath)), filepath.Base(symlinkPath), installedPath) installedSymlink := ctx.InstallSymlink(pathWhenActivated.Join(ctx, filepath.Dir(symlinkPath)), filepath.Base(symlinkPath), installedPath)
implicitInputs = append(implicitInputs, installedSymlink) implicitInputs = append(implicitInputs, installedSymlink)
} }
} }
@@ -537,8 +537,8 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
} }
implicitInputs = append(implicitInputs, a.manifestPbOut) implicitInputs = append(implicitInputs, a.manifestPbOut)
if installSymbolFiles { if installSymbolFiles {
installedManifest := ctx.InstallFile(apexDir, "apex_manifest.pb", a.manifestPbOut) installedManifest := ctx.InstallFile(pathWhenActivated, "apex_manifest.pb", a.manifestPbOut)
installedKey := ctx.InstallFile(apexDir, "apex_pubkey", a.publicKeyFile) installedKey := ctx.InstallFile(pathWhenActivated, "apex_pubkey", a.publicKeyFile)
implicitInputs = append(implicitInputs, installedManifest, installedKey) implicitInputs = append(implicitInputs, installedManifest, installedKey)
} }