diff --git a/apex/apex.go b/apex/apex.go index 51c85baa2..3026b609c 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -531,9 +531,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 @@ -1256,8 +1256,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 { diff --git a/apex/prebuilt.go b/apex/prebuilt.go index ba5a46669..d089c285d 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -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, " && ")) + } }, }, }} diff --git a/apex/vndk.go b/apex/vndk.go index 1f52d1161..f2e913eb3 100644 --- a/apex/vndk.go +++ b/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 }