VNDK APEX contains related *.libraries.txt files
These files were highly coupled with vndk version, so having them inside
the corresponding VNDK APEX is reasonable.
These files are used by linkerconfig and libnativeloader. In the future,
they reference these files from and VNDK APEX.
Bug: 141450808
Test: m com.android.vndk.current
Change-Id: I055a979d2636ddd8844a0afff81f6ba441f7965e
diff --git a/apex/apex.go b/apex/apex.go
index 4e6827f..08ba293 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -249,6 +249,9 @@
if vndkApex, ok := vndkApexList[vndkVersion]; ok {
mctx.AddReverseDependency(mctx.Module(), sharedLibTag, vndkApex)
}
+ } else if a, ok := mctx.Module().(*apexBundle); ok && a.vndkApex {
+ vndkVersion := proptools.StringDefault(a.vndkProperties.Vndk_version, "current")
+ mctx.AddDependency(mctx.Module(), prebuiltTag, cc.VndkLibrariesTxtModules(vndkVersion)...)
}
}
@@ -975,7 +978,7 @@
return
}
-func getCopyManifestForPrebuiltEtc(prebuilt *android.PrebuiltEtc) (fileToCopy android.Path, dirInApex string) {
+func getCopyManifestForPrebuiltEtc(prebuilt android.PrebuiltEtcModule) (fileToCopy android.Path, dirInApex string) {
dirInApex = filepath.Join("etc", prebuilt.SubDir())
fileToCopy = prebuilt.OutputFile()
return
@@ -1131,7 +1134,7 @@
ctx.PropertyErrorf("java_libs", "%q of type %q is not supported", depName, ctx.OtherModuleType(child))
}
case prebuiltTag:
- if prebuilt, ok := child.(*android.PrebuiltEtc); ok {
+ if prebuilt, ok := child.(android.PrebuiltEtcModule); ok {
fileToCopy, dirInApex := getCopyManifestForPrebuiltEtc(prebuilt)
filesInfo = append(filesInfo, apexFile{fileToCopy, depName, dirInApex, etc, prebuilt, nil})
return true
diff --git a/apex/apex_test.go b/apex/apex_test.go
index 77c1fb0..d6b5a04 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -17,6 +17,7 @@
import (
"io/ioutil"
"os"
+ "path"
"reflect"
"sort"
"strings"
@@ -117,6 +118,7 @@
ctx.RegisterModuleType("cc_test", android.ModuleFactoryAdaptor(cc.TestFactory))
ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(cc.LlndkLibraryFactory))
ctx.RegisterModuleType("vndk_prebuilt_shared", android.ModuleFactoryAdaptor(cc.VndkPrebuiltSharedFactory))
+ ctx.RegisterModuleType("vndk_libraries_txt", android.ModuleFactoryAdaptor(cc.VndkLibrariesTxtFactory))
ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(cc.ToolchainLibraryFactory))
ctx.RegisterModuleType("prebuilt_etc", android.ModuleFactoryAdaptor(android.PrebuiltEtcFactory))
ctx.RegisterModuleType("sh_binary", android.ModuleFactoryAdaptor(android.ShBinaryFactory))
@@ -298,6 +300,7 @@
"framework/aidl/a.aidl": nil,
"build/make/core/proguard.flags": nil,
"build/make/core/proguard_basic_keeps.flags": nil,
+ "dummy.txt": nil,
}
for _, handler := range handlers {
@@ -1319,7 +1322,18 @@
apexRule := ctx.ModuleForTests(moduleName, "android_common_"+moduleName+"_image").Rule("apexRule")
copyCmds := apexRule.Args["copy_commands"]
imageApexDir := "/image.apex/"
- dstFiles := []string{}
+ var failed bool
+ var surplus []string
+ filesMatched := make(map[string]bool)
+ addContent := func(content string) {
+ for _, expected := range files {
+ if matched, _ := path.Match(expected, content); matched {
+ filesMatched[expected] = true
+ return
+ }
+ }
+ surplus = append(surplus, content)
+ }
for _, cmd := range strings.Split(copyCmds, "&&") {
cmd = strings.TrimSpace(cmd)
if cmd == "" {
@@ -1338,42 +1352,26 @@
t.Fatal("copyCmds should copy a file to image.apex/", cmd)
}
dstFile := dst[index+len(imageApexDir):]
- dstFiles = append(dstFiles, dstFile)
+ addContent(dstFile)
default:
t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
}
}
- sort.Strings(dstFiles)
- sort.Strings(files)
- missing := []string{}
- surplus := []string{}
- i := 0
- j := 0
- for i < len(dstFiles) && j < len(files) {
- if dstFiles[i] == files[j] {
- i++
- j++
- } else if dstFiles[i] < files[j] {
- surplus = append(surplus, dstFiles[i])
- i++
- } else {
- missing = append(missing, files[j])
- j++
- }
- }
- if i < len(dstFiles) {
- surplus = append(surplus, dstFiles[i:]...)
- }
- if j < len(files) {
- missing = append(missing, files[j:]...)
- }
- failed := false
if len(surplus) > 0 {
+ sort.Strings(surplus)
t.Log("surplus files", surplus)
failed = true
}
- if len(missing) > 0 {
+
+ if len(files) > len(filesMatched) {
+ var missing []string
+ for _, expected := range files {
+ if !filesMatched[expected] {
+ missing = append(missing, expected)
+ }
+ }
+ sort.Strings(missing)
t.Log("missing files", missing)
failed = true
}
@@ -1418,13 +1416,18 @@
system_shared_libs: [],
stl: "none",
}
- `)
+ `+vndkLibrariesTxtFiles("current"))
ensureExactContents(t, ctx, "myapex", []string{
"lib/libvndk.so",
"lib/libvndksp.so",
"lib64/libvndk.so",
"lib64/libvndksp.so",
+ "etc/llndk.libraries.VER.txt",
+ "etc/vndkcore.libraries.VER.txt",
+ "etc/vndksp.libraries.VER.txt",
+ "etc/vndkprivate.libraries.VER.txt",
+ "etc/vndkcorevariant.libraries.VER.txt",
})
}
@@ -1469,18 +1472,44 @@
system_shared_libs: [],
stl: "none",
}
- `, withFiles(map[string][]byte{
- "libvndk.so": nil,
- "libvndk.arm.so": nil,
- }))
+ `+vndkLibrariesTxtFiles("current"),
+ withFiles(map[string][]byte{
+ "libvndk.so": nil,
+ "libvndk.arm.so": nil,
+ }))
ensureExactContents(t, ctx, "myapex", []string{
"lib/libvndk.so",
"lib/libvndk.arm.so",
"lib64/libvndk.so",
+ "etc/*",
})
}
+func vndkLibrariesTxtFiles(vers ...string) (result string) {
+ for _, v := range vers {
+ if v == "current" {
+ for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkcorevariant"} {
+ result += `
+ vndk_libraries_txt {
+ name: "` + txt + `.libraries.txt",
+ }
+ `
+ }
+ } else {
+ for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
+ result += `
+ prebuilt_etc {
+ name: "` + txt + `.libraries.` + v + `.txt",
+ src: "dummy.txt",
+ }
+ `
+ }
+ }
+ }
+ return
+}
+
func TestVndkApexVersion(t *testing.T) {
ctx, _ := testApex(t, `
apex_vndk {
@@ -1530,17 +1559,19 @@
srcs: ["libvndk27_x86_64.so"],
},
},
- }
- `, withFiles(map[string][]byte{
- "libvndk27_arm.so": nil,
- "libvndk27_arm64.so": nil,
- "libvndk27_x86.so": nil,
- "libvndk27_x86_64.so": nil,
- }))
+ }
+ `+vndkLibrariesTxtFiles("27"),
+ withFiles(map[string][]byte{
+ "libvndk27_arm.so": nil,
+ "libvndk27_arm64.so": nil,
+ "libvndk27_x86.so": nil,
+ "libvndk27_x86_64.so": nil,
+ }))
ensureExactContents(t, ctx, "myapex_v27", []string{
"lib/libvndk27_arm.so",
"lib64/libvndk27_arm64.so",
+ "etc/*",
})
}
@@ -1607,7 +1638,7 @@
name: "myapex.key",
public_key: "testkey.avbpubkey",
private_key: "testkey.pem",
- }`)
+ }`+vndkLibrariesTxtFiles("28", "current"))
assertApexName := func(expected, moduleName string) {
bundle := ctx.ModuleForTests(moduleName, "android_common_"+moduleName+"_image").Module().(*apexBundle)
@@ -1647,18 +1678,20 @@
system_shared_libs: [],
stl: "none",
}
- `, withTargets(map[android.OsType][]android.Target{
- android.Android: []android.Target{
- {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
- {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
- {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm64", NativeBridgeRelativePath: "x86_64"},
- {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm", NativeBridgeRelativePath: "x86"},
- },
- }))
+ `+vndkLibrariesTxtFiles("current"),
+ withTargets(map[android.OsType][]android.Target{
+ android.Android: []android.Target{
+ {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
+ {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
+ {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm64", NativeBridgeRelativePath: "x86_64"},
+ {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm", NativeBridgeRelativePath: "x86"},
+ },
+ }))
ensureExactContents(t, ctx, "myapex", []string{
"lib/libvndk.so",
"lib64/libvndk.so",
+ "etc/*",
})
}
@@ -1693,8 +1726,7 @@
}
func TestVndkApexWithBinder32(t *testing.T) {
- ctx, _ := testApex(t,
- `
+ ctx, _ := testApex(t, `
apex_vndk {
name: "myapex_v27",
key: "myapex.key",
@@ -1738,7 +1770,7 @@
}
},
}
- `,
+ `+vndkLibrariesTxtFiles("27"),
withFiles(map[string][]byte{
"libvndk27.so": nil,
"libvndk27binder32.so": nil,
@@ -1753,6 +1785,7 @@
ensureExactContents(t, ctx, "myapex_v27", []string{
"lib/libvndk27binder32.so",
+ "etc/*",
})
}