Fix: a module with sub_dir can't be placed in APEX
This change fixes the bug that when a module is defined with sub_dir, then build breaks when the module is included in an APEX. This was happening because, for example when we have a prebuilt_etc module having sub_dir set to "foo/bar", then only etc/foo/bar is added to the canned_fs_config file and other intermediate directories (etc, etc/foo) are not added. e2fsdroid however expects that every directories to be listed. Fixing the problem by adding parent directories when adding a directory to canned_fs_config. Bug: 120600179 Test: m (a new test case added to apex_test) Change-Id: If712ff65761a7e1e3216371bb2eb7acf9cb5dc9e
This commit is contained in:
10
apex/apex.go
10
apex/apex.go
@@ -684,8 +684,14 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
|
||||
} else {
|
||||
readOnlyPaths = append(readOnlyPaths, pathInApex)
|
||||
}
|
||||
if !android.InList(f.installDir, executablePaths) {
|
||||
executablePaths = append(executablePaths, f.installDir)
|
||||
dir := f.installDir
|
||||
for !android.InList(dir, executablePaths) && dir != "" {
|
||||
executablePaths = append(executablePaths, dir)
|
||||
dir, _ = filepath.Split(dir) // move up to the parent
|
||||
if len(dir) > 0 {
|
||||
// remove trailing slash
|
||||
dir = dir[:len(dir)-1]
|
||||
}
|
||||
}
|
||||
}
|
||||
sort.Strings(readOnlyPaths)
|
||||
|
@@ -40,6 +40,7 @@ func testApex(t *testing.T, bp string) *android.TestContext {
|
||||
ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory))
|
||||
ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(cc.ObjectFactory))
|
||||
ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(cc.ToolchainLibraryFactory))
|
||||
ctx.RegisterModuleType("prebuilt_etc", android.ModuleFactoryAdaptor(android.PrebuiltEtcFactory))
|
||||
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
||||
ctx.BottomUp("link", cc.LinkageMutator).Parallel()
|
||||
ctx.BottomUp("version", cc.VersionMutator).Parallel()
|
||||
@@ -94,6 +95,7 @@ func testApex(t *testing.T, bp string) *android.TestContext {
|
||||
"apex_manifest.json": nil,
|
||||
"system/sepolicy/apex/myapex-file_contexts": nil,
|
||||
"mylib.cpp": nil,
|
||||
"myprebuilt": nil,
|
||||
})
|
||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||
android.FailIfErrored(t, errs)
|
||||
@@ -415,3 +417,33 @@ func TestApexWithSystemLibsStubs(t *testing.T) {
|
||||
ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
|
||||
ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
|
||||
}
|
||||
|
||||
func TestFilesInSubDir(t *testing.T) {
|
||||
ctx := testApex(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
prebuilts: ["myetc"],
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
prebuilt_etc {
|
||||
name: "myetc",
|
||||
src: "myprebuilt",
|
||||
sub_dir: "foo/bar",
|
||||
}
|
||||
`)
|
||||
|
||||
generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
|
||||
dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
|
||||
|
||||
// Ensure that etc, etc/foo, and etc/foo/bar are all listed
|
||||
ensureListContains(t, dirs, "etc")
|
||||
ensureListContains(t, dirs, "etc/foo")
|
||||
ensureListContains(t, dirs, "etc/foo/bar")
|
||||
}
|
||||
|
Reference in New Issue
Block a user