Fix symlinks from APEX to partitions
Previously, the symlink optimization for APEXes assumed that the target of the symlinks are in the system partition. The assumption however doesn't hold always because the file that was added to the APEX might be with system_ext_specific: true or vendor: true. Bug: 265598720 Test: m nothing Change-Id: Ieb9a6769320c0ec697a88c0cae977e7d65288362
This commit is contained in:
@@ -502,6 +502,7 @@ type Module interface {
|
|||||||
InstallInRoot() bool
|
InstallInRoot() bool
|
||||||
InstallInVendor() bool
|
InstallInVendor() bool
|
||||||
InstallForceOS() (*OsType, *ArchType)
|
InstallForceOS() (*OsType, *ArchType)
|
||||||
|
PartitionTag(DeviceConfig) string
|
||||||
HideFromMake()
|
HideFromMake()
|
||||||
IsHideFromMake() bool
|
IsHideFromMake() bool
|
||||||
IsSkipInstall() bool
|
IsSkipInstall() bool
|
||||||
|
@@ -514,6 +514,7 @@ type apexFile struct {
|
|||||||
// buildFile is put in the installDir inside the APEX.
|
// buildFile is put in the installDir inside the APEX.
|
||||||
builtFile android.Path
|
builtFile android.Path
|
||||||
installDir string
|
installDir string
|
||||||
|
partition string
|
||||||
customStem string
|
customStem string
|
||||||
symlinks []string // additional symlinks
|
symlinks []string // additional symlinks
|
||||||
|
|
||||||
@@ -553,6 +554,7 @@ func newApexFile(ctx android.BaseModuleContext, builtFile android.Path, androidM
|
|||||||
}
|
}
|
||||||
if module != nil {
|
if module != nil {
|
||||||
ret.moduleDir = ctx.OtherModuleDir(module)
|
ret.moduleDir = ctx.OtherModuleDir(module)
|
||||||
|
ret.partition = module.PartitionTag(ctx.DeviceConfig())
|
||||||
ret.requiredModuleNames = module.RequiredModuleNames()
|
ret.requiredModuleNames = module.RequiredModuleNames()
|
||||||
ret.targetRequiredModuleNames = module.TargetRequiredModuleNames()
|
ret.targetRequiredModuleNames = module.TargetRequiredModuleNames()
|
||||||
ret.hostRequiredModuleNames = module.HostRequiredModuleNames()
|
ret.hostRequiredModuleNames = module.HostRequiredModuleNames()
|
||||||
|
@@ -7122,7 +7122,10 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
|
|||||||
cc_library {
|
cc_library {
|
||||||
name: "mylib",
|
name: "mylib",
|
||||||
srcs: ["mylib.cpp"],
|
srcs: ["mylib.cpp"],
|
||||||
shared_libs: ["myotherlib"],
|
shared_libs: [
|
||||||
|
"myotherlib",
|
||||||
|
"myotherlib_ext",
|
||||||
|
],
|
||||||
system_shared_libs: [],
|
system_shared_libs: [],
|
||||||
stl: "none",
|
stl: "none",
|
||||||
apex_available: [
|
apex_available: [
|
||||||
@@ -7146,6 +7149,20 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
|
|||||||
min_sdk_version: "current",
|
min_sdk_version: "current",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cc_library {
|
||||||
|
name: "myotherlib_ext",
|
||||||
|
srcs: ["mylib.cpp"],
|
||||||
|
system_shared_libs: [],
|
||||||
|
system_ext_specific: true,
|
||||||
|
stl: "none",
|
||||||
|
apex_available: [
|
||||||
|
"myapex",
|
||||||
|
"myapex.updatable",
|
||||||
|
"//apex_available:platform",
|
||||||
|
],
|
||||||
|
min_sdk_version: "current",
|
||||||
|
}
|
||||||
|
|
||||||
java_library {
|
java_library {
|
||||||
name: "myjar",
|
name: "myjar",
|
||||||
srcs: ["foo/bar/MyClass.java"],
|
srcs: ["foo/bar/MyClass.java"],
|
||||||
@@ -7186,12 +7203,15 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
|
|||||||
t.Errorf("%q is not found", file)
|
t.Errorf("%q is not found", file)
|
||||||
}
|
}
|
||||||
|
|
||||||
ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
|
ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
|
||||||
for _, f := range files {
|
for _, f := range files {
|
||||||
if f.path == file {
|
if f.path == file {
|
||||||
if !f.isLink {
|
if !f.isLink {
|
||||||
t.Errorf("%q is not a symlink", file)
|
t.Errorf("%q is not a symlink", file)
|
||||||
}
|
}
|
||||||
|
if f.src != target {
|
||||||
|
t.Errorf("expected symlink target to be %q, got %q", target, f.src)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7205,23 +7225,27 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
|
|||||||
ensureRealfileExists(t, files, "javalib/myjar.jar")
|
ensureRealfileExists(t, files, "javalib/myjar.jar")
|
||||||
ensureRealfileExists(t, files, "lib64/mylib.so")
|
ensureRealfileExists(t, files, "lib64/mylib.so")
|
||||||
ensureRealfileExists(t, files, "lib64/myotherlib.so")
|
ensureRealfileExists(t, files, "lib64/myotherlib.so")
|
||||||
|
ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
|
||||||
|
|
||||||
files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
|
files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
|
||||||
ensureRealfileExists(t, files, "javalib/myjar.jar")
|
ensureRealfileExists(t, files, "javalib/myjar.jar")
|
||||||
ensureRealfileExists(t, files, "lib64/mylib.so")
|
ensureRealfileExists(t, files, "lib64/mylib.so")
|
||||||
ensureRealfileExists(t, files, "lib64/myotherlib.so")
|
ensureRealfileExists(t, files, "lib64/myotherlib.so")
|
||||||
|
ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
|
||||||
|
|
||||||
// For bundled build, symlink to the system for the non-updatable APEXes only
|
// For bundled build, symlink to the system for the non-updatable APEXes only
|
||||||
ctx = testApex(t, bp)
|
ctx = testApex(t, bp)
|
||||||
files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
|
files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
|
||||||
ensureRealfileExists(t, files, "javalib/myjar.jar")
|
ensureRealfileExists(t, files, "javalib/myjar.jar")
|
||||||
ensureRealfileExists(t, files, "lib64/mylib.so")
|
ensureRealfileExists(t, files, "lib64/mylib.so")
|
||||||
ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
|
ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
|
||||||
|
ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
|
||||||
|
|
||||||
files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
|
files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
|
||||||
ensureRealfileExists(t, files, "javalib/myjar.jar")
|
ensureRealfileExists(t, files, "javalib/myjar.jar")
|
||||||
ensureRealfileExists(t, files, "lib64/mylib.so")
|
ensureRealfileExists(t, files, "lib64/mylib.so")
|
||||||
ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
|
ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
|
||||||
|
ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
|
func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
|
||||||
|
@@ -476,8 +476,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
|
|||||||
// Copy the built file to the directory. But if the symlink optimization is turned
|
// Copy the built file to the directory. But if the symlink optimization is turned
|
||||||
// on, place a symlink to the corresponding file in /system partition instead.
|
// on, place a symlink to the corresponding file in /system partition instead.
|
||||||
if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() {
|
if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() {
|
||||||
// TODO(jiyong): pathOnDevice should come from fi.module, not being calculated here
|
pathOnDevice := filepath.Join("/", fi.partition, fi.path())
|
||||||
pathOnDevice := filepath.Join("/system", fi.path())
|
|
||||||
copyCommands = append(copyCommands, "ln -sfn "+pathOnDevice+" "+destPath)
|
copyCommands = append(copyCommands, "ln -sfn "+pathOnDevice+" "+destPath)
|
||||||
} else {
|
} else {
|
||||||
// Copy the file into APEX
|
// Copy the file into APEX
|
||||||
@@ -941,8 +940,7 @@ func (a *apexBundle) buildFlattenedApex(ctx android.ModuleContext) {
|
|||||||
dir := filepath.Join("apex", bundleName, fi.installDir)
|
dir := filepath.Join("apex", bundleName, fi.installDir)
|
||||||
installDir := android.PathForModuleInstall(ctx, dir)
|
installDir := android.PathForModuleInstall(ctx, dir)
|
||||||
if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() {
|
if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() {
|
||||||
// TODO(jiyong): pathOnDevice should come from fi.module, not being calculated here
|
pathOnDevice := filepath.Join("/", fi.partition, fi.path())
|
||||||
pathOnDevice := filepath.Join("/system", fi.path())
|
|
||||||
installedSymlinks = append(installedSymlinks,
|
installedSymlinks = append(installedSymlinks,
|
||||||
ctx.InstallAbsoluteSymlink(installDir, fi.stem(), pathOnDevice))
|
ctx.InstallAbsoluteSymlink(installDir, fi.stem(), pathOnDevice))
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user