From ce2436302a2e06d4fa53096cc230a6c5a9bfa2b4 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Fri, 17 Feb 2023 18:22:25 +0900 Subject: [PATCH] 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 --- android/module.go | 1 + apex/apex.go | 2 ++ apex/apex_test.go | 32 ++++++++++++++++++++++++++++---- apex/builder.go | 6 ++---- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/android/module.go b/android/module.go index 681f724b0..97c97068f 100644 --- a/android/module.go +++ b/android/module.go @@ -502,6 +502,7 @@ type Module interface { InstallInRoot() bool InstallInVendor() bool InstallForceOS() (*OsType, *ArchType) + PartitionTag(DeviceConfig) string HideFromMake() IsHideFromMake() bool IsSkipInstall() bool diff --git a/apex/apex.go b/apex/apex.go index 8a8b19d0a..b77568dd3 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -514,6 +514,7 @@ type apexFile struct { // buildFile is put in the installDir inside the APEX. builtFile android.Path installDir string + partition string customStem string symlinks []string // additional symlinks @@ -553,6 +554,7 @@ func newApexFile(ctx android.BaseModuleContext, builtFile android.Path, androidM } if module != nil { ret.moduleDir = ctx.OtherModuleDir(module) + ret.partition = module.PartitionTag(ctx.DeviceConfig()) ret.requiredModuleNames = module.RequiredModuleNames() ret.targetRequiredModuleNames = module.TargetRequiredModuleNames() ret.hostRequiredModuleNames = module.HostRequiredModuleNames() diff --git a/apex/apex_test.go b/apex/apex_test.go index eec24b050..faf82b32c 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -7122,7 +7122,10 @@ func TestSymlinksFromApexToSystem(t *testing.T) { cc_library { name: "mylib", srcs: ["mylib.cpp"], - shared_libs: ["myotherlib"], + shared_libs: [ + "myotherlib", + "myotherlib_ext", + ], system_shared_libs: [], stl: "none", apex_available: [ @@ -7146,6 +7149,20 @@ func TestSymlinksFromApexToSystem(t *testing.T) { 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 { name: "myjar", srcs: ["foo/bar/MyClass.java"], @@ -7186,12 +7203,15 @@ func TestSymlinksFromApexToSystem(t *testing.T) { 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 { if f.path == file { if !f.isLink { 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 } } @@ -7205,23 +7225,27 @@ func TestSymlinksFromApexToSystem(t *testing.T) { ensureRealfileExists(t, files, "javalib/myjar.jar") ensureRealfileExists(t, files, "lib64/mylib.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") ensureRealfileExists(t, files, "javalib/myjar.jar") ensureRealfileExists(t, files, "lib64/mylib.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 ctx = testApex(t, bp) files = getFiles(t, ctx, "myapex", "android_common_myapex_image") ensureRealfileExists(t, files, "javalib/myjar.jar") 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") ensureRealfileExists(t, files, "javalib/myjar.jar") 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) { diff --git a/apex/builder.go b/apex/builder.go index 93ff80d70..a62f63c61 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -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 // on, place a symlink to the corresponding file in /system partition instead. if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() { - // TODO(jiyong): pathOnDevice should come from fi.module, not being calculated here - pathOnDevice := filepath.Join("/system", fi.path()) + pathOnDevice := filepath.Join("/", fi.partition, fi.path()) copyCommands = append(copyCommands, "ln -sfn "+pathOnDevice+" "+destPath) } else { // Copy the file into APEX @@ -941,8 +940,7 @@ func (a *apexBundle) buildFlattenedApex(ctx android.ModuleContext) { dir := filepath.Join("apex", bundleName, fi.installDir) installDir := android.PathForModuleInstall(ctx, dir) if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() { - // TODO(jiyong): pathOnDevice should come from fi.module, not being calculated here - pathOnDevice := filepath.Join("/system", fi.path()) + pathOnDevice := filepath.Join("/", fi.partition, fi.path()) installedSymlinks = append(installedSymlinks, ctx.InstallAbsoluteSymlink(installDir, fi.stem(), pathOnDevice)) } else {