Add compat symlinks for prebuilt_apex
When prebuilt_apex overrides/replaces other apex, the same symlinks need to be created as well. Bug: 143192278 Test: 1. add prebuilt_apex with vndk apex with overrides set as ["com.android.vndk.current"] 2. m <prebuilt apex> 3. check if vndk symlinks are created Change-Id: I8ee9c981ea9c7202ccf5143b3f43e6848773cd63
This commit is contained in:
parent
17cf0ab3bc
commit
002ab687ac
|
@ -522,9 +522,9 @@ type apexBundle struct {
|
|||
manifestJsonOut android.WritablePath
|
||||
manifestPbOut android.WritablePath
|
||||
|
||||
// list of commands to create symlinks for backward compatibility
|
||||
// list of commands to create symlinks for backward compatibility.
|
||||
// these commands will be attached as LOCAL_POST_INSTALL_CMD to
|
||||
// apex package itself(for unflattened build) or apex_manifest.json(for flattened build)
|
||||
// apex package itself(for unflattened build) or apex_manifest(for flattened build)
|
||||
// so that compat symlinks are always installed regardless of TARGET_FLATTEN_APEX setting.
|
||||
compatSymlinks []string
|
||||
|
||||
|
@ -1236,8 +1236,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||
a.buildUnflattenedApex(ctx)
|
||||
}
|
||||
|
||||
apexName := proptools.StringDefault(a.properties.Apex_name, a.Name())
|
||||
a.compatSymlinks = makeCompatSymlinks(apexName, ctx)
|
||||
a.compatSymlinks = makeCompatSymlinks(a.BaseModuleName(), ctx)
|
||||
}
|
||||
|
||||
func newApexBundle() *apexBundle {
|
||||
|
|
|
@ -33,6 +33,10 @@ type Prebuilt struct {
|
|||
installDir android.InstallPath
|
||||
installFilename string
|
||||
outputApex android.WritablePath
|
||||
|
||||
// list of commands to create symlinks for backward compatibility.
|
||||
// these commands will be attached as LOCAL_POST_INSTALL_CMD
|
||||
compatSymlinks []string
|
||||
}
|
||||
|
||||
type PrebuiltProperties struct {
|
||||
|
@ -178,7 +182,12 @@ func (p *Prebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||
ctx.InstallFile(p.installDir, p.installFilename, p.inputApex)
|
||||
}
|
||||
|
||||
// TODO(b/143192278): Add compat symlinks for prebuilt_apex
|
||||
// in case that prebuilt_apex replaces source apex (using prefer: prop)
|
||||
p.compatSymlinks = makeCompatSymlinks(p.BaseModuleName(), ctx)
|
||||
// or that prebuilt_apex overrides other apexes (using overrides: prop)
|
||||
for _, overridden := range p.properties.Overrides {
|
||||
p.compatSymlinks = append(p.compatSymlinks, makeCompatSymlinks(overridden, ctx)...)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Prebuilt) AndroidMkEntries() []android.AndroidMkEntries {
|
||||
|
@ -192,6 +201,9 @@ func (p *Prebuilt) AndroidMkEntries() []android.AndroidMkEntries {
|
|||
entries.SetString("LOCAL_MODULE_STEM", p.installFilename)
|
||||
entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", !p.installable())
|
||||
entries.AddStrings("LOCAL_OVERRIDES_MODULES", p.properties.Overrides...)
|
||||
if len(p.compatSymlinks) > 0 {
|
||||
entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(p.compatSymlinks, " && "))
|
||||
}
|
||||
},
|
||||
},
|
||||
}}
|
||||
|
|
20
apex/vndk.go
20
apex/vndk.go
|
@ -105,7 +105,8 @@ func apexVndkDepsMutator(mctx android.BottomUpMutatorContext) {
|
|||
}
|
||||
}
|
||||
|
||||
func makeCompatSymlinks(apexName string, ctx android.ModuleContext) (symlinks []string) {
|
||||
// name is module.BaseModuleName() which is used as LOCAL_MODULE_NAME and also LOCAL_OVERRIDES_*
|
||||
func makeCompatSymlinks(name string, ctx android.ModuleContext) (symlinks []string) {
|
||||
// small helper to add symlink commands
|
||||
addSymlink := func(target, dir, linkName string) {
|
||||
link := filepath.Join(dir, linkName)
|
||||
|
@ -116,9 +117,13 @@ func makeCompatSymlinks(apexName string, ctx android.ModuleContext) (symlinks []
|
|||
// When all hard-coded references are fixed, remove symbolic links
|
||||
// Note that we should keep following symlinks for older VNDKs (<=29)
|
||||
// Since prebuilt vndk libs still depend on system/lib/vndk path
|
||||
if strings.HasPrefix(apexName, vndkApexNamePrefix) {
|
||||
if strings.HasPrefix(name, vndkApexName) {
|
||||
vndkVersion := ctx.DeviceConfig().PlatformVndkVersion()
|
||||
if strings.HasPrefix(name, vndkApexNamePrefix) {
|
||||
vndkVersion = strings.TrimPrefix(name, vndkApexNamePrefix)
|
||||
}
|
||||
// the name of vndk apex is formatted "com.android.vndk.v" + version
|
||||
vndkVersion := strings.TrimPrefix(apexName, vndkApexNamePrefix)
|
||||
apexName := vndkApexNamePrefix + vndkVersion
|
||||
if ctx.Config().Android64() {
|
||||
addSymlink("/apex/"+apexName+"/lib64", "$(TARGET_OUT)/lib64", "vndk-sp-"+vndkVersion)
|
||||
addSymlink("/apex/"+apexName+"/lib64", "$(TARGET_OUT)/lib64", "vndk-"+vndkVersion)
|
||||
|
@ -127,22 +132,25 @@ func makeCompatSymlinks(apexName string, ctx android.ModuleContext) (symlinks []
|
|||
addSymlink("/apex/"+apexName+"/lib", "$(TARGET_OUT)/lib", "vndk-sp-"+vndkVersion)
|
||||
addSymlink("/apex/"+apexName+"/lib", "$(TARGET_OUT)/lib", "vndk-"+vndkVersion)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// http://b/121248172 - create a link from /system/usr/icu to
|
||||
// /apex/com.android.i18n/etc/icu so that apps can find the ICU .dat file.
|
||||
// A symlink can't overwrite a directory and the /system/usr/icu directory once
|
||||
// existed so the required structure must be created whatever we find.
|
||||
if apexName == "com.android.i18n" {
|
||||
addSymlink("/apex/"+apexName+"/etc/icu", "$(TARGET_OUT)/usr", "icu")
|
||||
if name == "com.android.i18n" {
|
||||
addSymlink("/apex/com.android.i18n/etc/icu", "$(TARGET_OUT)/usr", "icu")
|
||||
return
|
||||
}
|
||||
|
||||
// TODO(b/124106384): Clean up compat symlinks for ART binaries.
|
||||
if strings.HasPrefix(apexName, "com.android.art.") {
|
||||
if strings.HasPrefix(name, "com.android.art.") {
|
||||
artBinaries := []string{"dalvikvm", "dex2oat"}
|
||||
for _, b := range artBinaries {
|
||||
addSymlink("/apex/com.android.art/bin/"+b, "$(TARGET_OUT)/bin", b)
|
||||
}
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue