Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccfffda2 authored by Jooyung Han's avatar Jooyung Han Committed by Gerrit Code Review
Browse files

Merge "Add compat symlinks for prebuilt_apex"

parents 8ea6bc4a 002ab687
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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 {
+13 −1
Original line number Diff line number Diff line
@@ -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, " && "))
				}
			},
		},
	}}
+14 −6
Original line number Diff line number Diff line
@@ -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
}