vndk-def: Implement degenerated VNDK for o-release
This commit implements the degenerated directory layout for o-release. This commit also simplifies the output significantly. Test: Run vndk_definition_tool.py against o-release images. Change-Id: I5aad29fa4ff7e819778d26d2e2011af1be61bb58
This commit is contained in:
12
vndk/tools/definition-tool/datasets/minimum_dlopen_deps.txt
Normal file
12
vndk/tools/definition-tool/datasets/minimum_dlopen_deps.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
/system/lib/libEGL.so:/system/lib/libEGL.so
|
||||
/system/lib/libEGL.so:/system/lib/libGLESv1_CM.so
|
||||
/system/lib/libEGL.so:/system/lib/libGLESv2.so
|
||||
/system/lib/libc.so:/system/lib/libc_malloc_debug.so
|
||||
/system/lib/libc.so:/system/lib/libicuuc.so
|
||||
/system/lib/libc.so:/system/lib/libnetd_client.so
|
||||
/system/lib64/libEGL.so:/system/lib64/libEGL.so
|
||||
/system/lib64/libEGL.so:/system/lib64/libGLESv1_CM.so
|
||||
/system/lib64/libEGL.so:/system/lib64/libGLESv2.so
|
||||
/system/lib64/libc.so:/system/lib64/libc_malloc_debug.so
|
||||
/system/lib64/libc.so:/system/lib64/libicuuc.so
|
||||
/system/lib64/libc.so:/system/lib64/libnetd_client.so
|
||||
@@ -132,17 +132,13 @@ class ELFLinkerTest(unittest.TestCase):
|
||||
self.assertEqual(['/system/lib64/libdl.so'],
|
||||
self._get_paths_from_nodes(nodes))
|
||||
|
||||
def test_elf_class(self):
|
||||
def test_elf_class_and_partitions(self):
|
||||
gb = self._create_normal_graph()
|
||||
graph = gb.graph
|
||||
self.assertEqual(6, len(graph.lib32))
|
||||
self.assertEqual(6, len(graph.lib64))
|
||||
|
||||
def test_partitions(self):
|
||||
gb = self._create_normal_graph()
|
||||
graph = gb.graph
|
||||
self.assertEqual(10, len(gb.graph.lib_pt[PT_SYSTEM]))
|
||||
self.assertEqual(2, len(gb.graph.lib_pt[PT_VENDOR]))
|
||||
self.assertEqual(5, len(graph.lib_pt[PT_SYSTEM].lib32))
|
||||
self.assertEqual(5, len(graph.lib_pt[PT_SYSTEM].lib64))
|
||||
self.assertEqual(1, len(graph.lib_pt[PT_VENDOR].lib32))
|
||||
self.assertEqual(1, len(graph.lib_pt[PT_VENDOR].lib64))
|
||||
|
||||
def test_deps(self):
|
||||
gb = self._create_normal_graph()
|
||||
@@ -169,7 +165,7 @@ class ELFLinkerTest(unittest.TestCase):
|
||||
graph = gb.graph
|
||||
|
||||
# Check the unresolved symbols.
|
||||
for lib_set in (graph.lib32, graph.lib64):
|
||||
for lib_set in graph.lib_pt:
|
||||
for lib in lib_set.values():
|
||||
self.assertEqual(set(), lib.unresolved_symbols)
|
||||
|
||||
@@ -237,6 +233,27 @@ class ELFLinkerTest(unittest.TestCase):
|
||||
node = graph.get_lib('/vendor/lib64/libEGL.so')
|
||||
self.assertEqual([], self._get_paths_from_nodes(node.users))
|
||||
|
||||
def test_compute_predefined_fwk_only_rs(self):
|
||||
lib_names = (
|
||||
'libft2',
|
||||
'libmediandk',
|
||||
)
|
||||
|
||||
# Add VNDK-SP libraries.
|
||||
gb = GraphBuilder()
|
||||
for name in lib_names:
|
||||
gb.add_multilib(PT_SYSTEM, name)
|
||||
gb.resolve()
|
||||
|
||||
# Compute FWK-ONLY-RS and check the result.
|
||||
fwk_only_rs = gb.graph.compute_predefined_fwk_only_rs()
|
||||
fwk_only_rs = set(lib.path for lib in fwk_only_rs)
|
||||
|
||||
for lib_dir_name in ('lib', 'lib64'):
|
||||
lib_dir = '/system/' + lib_dir_name
|
||||
for name in lib_names:
|
||||
self.assertIn(os.path.join(lib_dir, name + '.so'), fwk_only_rs)
|
||||
|
||||
def test_compute_predefined_vndk_sp(self):
|
||||
lib_names = (
|
||||
'android.hardware.graphics.allocator@2.0',
|
||||
@@ -288,7 +305,6 @@ class ELFLinkerTest(unittest.TestCase):
|
||||
lib_names = (
|
||||
'libbacktrace',
|
||||
'libblas',
|
||||
'libft2',
|
||||
'liblzma',
|
||||
'libpng',
|
||||
'libunwind',
|
||||
@@ -505,58 +521,6 @@ class ELFLinkerTest(unittest.TestCase):
|
||||
self.assertNotIn(libc_path, sp_ndk_indirect)
|
||||
|
||||
|
||||
def test_find_existing_vndk(self):
|
||||
gb = GraphBuilder()
|
||||
|
||||
libpng32_core, libpng64_core = \
|
||||
gb.add_multilib(PT_SYSTEM, 'libpng', extra_dir='vndk-26')
|
||||
libpng32_fwk, libpng64_fwk = \
|
||||
gb.add_multilib(PT_SYSTEM, 'libpng', extra_dir='vndk-26-ext')
|
||||
|
||||
libjpeg32_core, libjpeg64_core = \
|
||||
gb.add_multilib(PT_SYSTEM, 'libjpeg', extra_dir='vndk-26')
|
||||
libjpeg32_vnd, libjpeg64_vnd = \
|
||||
gb.add_multilib(PT_VENDOR, 'libjpeg', extra_dir='vndk-26-ext')
|
||||
|
||||
gb.resolve()
|
||||
|
||||
vndk_core, vndk_fwk_ext, vndk_vnd_ext = gb.graph.find_existing_vndk()
|
||||
|
||||
expected_vndk_core = {
|
||||
libpng32_core, libpng64_core, libjpeg32_core, libjpeg64_core}
|
||||
expected_vndk_fwk_ext = {libpng32_fwk, libpng64_fwk}
|
||||
expected_vndk_vnd_ext = {libjpeg32_vnd, libjpeg64_vnd}
|
||||
|
||||
self.assertSetEqual(expected_vndk_core, vndk_core)
|
||||
self.assertSetEqual(expected_vndk_fwk_ext, vndk_fwk_ext)
|
||||
self.assertSetEqual(expected_vndk_vnd_ext, vndk_vnd_ext)
|
||||
|
||||
def test_find_existing_vndk_without_version(self):
|
||||
gb = GraphBuilder()
|
||||
|
||||
libpng32_core, libpng64_core = \
|
||||
gb.add_multilib(PT_SYSTEM, 'libpng', extra_dir='vndk')
|
||||
libpng32_fwk, libpng64_fwk = \
|
||||
gb.add_multilib(PT_SYSTEM, 'libpng', extra_dir='vndk-ext')
|
||||
|
||||
libjpeg32_core, libjpeg64_core = \
|
||||
gb.add_multilib(PT_SYSTEM, 'libjpeg', extra_dir='vndk')
|
||||
libjpeg32_vnd, libjpeg64_vnd = \
|
||||
gb.add_multilib(PT_VENDOR, 'libjpeg', extra_dir='vndk-ext')
|
||||
|
||||
gb.resolve()
|
||||
|
||||
vndk_core, vndk_fwk_ext, vndk_vnd_ext = gb.graph.find_existing_vndk()
|
||||
|
||||
expected_vndk_core = {
|
||||
libpng32_core, libpng64_core, libjpeg32_core, libjpeg64_core}
|
||||
expected_vndk_fwk_ext = {libpng32_fwk, libpng64_fwk}
|
||||
expected_vndk_vnd_ext = {libjpeg32_vnd, libjpeg64_vnd}
|
||||
|
||||
self.assertSetEqual(expected_vndk_core, vndk_core)
|
||||
self.assertSetEqual(expected_vndk_fwk_ext, vndk_fwk_ext)
|
||||
self.assertSetEqual(expected_vndk_vnd_ext, vndk_vnd_ext)
|
||||
|
||||
def test_compute_vndk_cap(self):
|
||||
gb = GraphBuilder()
|
||||
|
||||
|
||||
@@ -87,6 +87,12 @@ class GenericRefsTest(unittest.TestCase):
|
||||
|
||||
self.assertTrue(self.ref.is_equivalent_lib(libc_eq))
|
||||
|
||||
def test_has_same_name_lib(self):
|
||||
self.assertTrue(self.ref.has_same_name_lib(
|
||||
MockLib('/vendor/lib/libc.so', {})))
|
||||
self.assertFalse(self.ref.has_same_name_lib(
|
||||
MockLib('/vendor/lib/lib_does_not_exist.so', {})))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -1,197 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
import unittest
|
||||
|
||||
from compat import StringIO
|
||||
from vndk_definition_tool import (ELF, ELFLinker, PT_SYSTEM, PT_VENDOR,
|
||||
GenericRefs, SPLibResult)
|
||||
|
||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
TESTDATA_DIR = os.path.join(SCRIPT_DIR ,'testdata', 'test_vndk')
|
||||
|
||||
class MockBannedLibs(object):
|
||||
def is_banned(self, name):
|
||||
return False
|
||||
|
||||
class ELFLinkerVNDKTest(unittest.TestCase):
|
||||
def _get_paths_from_nodes(self, nodes):
|
||||
return sorted([node.path for node in nodes])
|
||||
|
||||
def _create_graph_gr(self, input_dir, generic_refs_dir):
|
||||
if not generic_refs_dir:
|
||||
generic_refs = None
|
||||
else:
|
||||
generic_refs_dir = os.path.join(TESTDATA_DIR, generic_refs_dir)
|
||||
generic_refs = GenericRefs.create_from_sym_dir(generic_refs_dir)
|
||||
|
||||
input_dir = os.path.join(TESTDATA_DIR, input_dir)
|
||||
|
||||
graph = ELFLinker.create_from_dump(
|
||||
system_dirs=[os.path.join(input_dir, 'system')],
|
||||
vendor_dirs=[os.path.join(input_dir, 'vendor')],
|
||||
generic_refs=generic_refs)
|
||||
|
||||
return (graph, generic_refs)
|
||||
|
||||
def _create_graph_vndk(self, input_dir, generic_refs_dir):
|
||||
graph, generic_refs = self._create_graph_gr(input_dir, generic_refs_dir)
|
||||
|
||||
vndk = graph._compute_vndk(
|
||||
sp_lib=SPLibResult(set(), set(), set(), set(), set(), set()),
|
||||
vndk_customized_for_system=set(),
|
||||
vndk_customized_for_vendor=set(),
|
||||
generic_refs=generic_refs,
|
||||
banned_libs=MockBannedLibs())
|
||||
|
||||
return (graph, vndk)
|
||||
|
||||
def test_compute_vndk(self):
|
||||
graph, vndk = self._create_graph_vndk('pre_treble', None)
|
||||
|
||||
self.assertEqual(['/system/lib/vndk/libcutils.so',
|
||||
'/system/lib64/vndk/libcutils.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_core))
|
||||
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
||||
|
||||
def test_compute_vndk_indirect_no_gr(self):
|
||||
graph, vndk = self._create_graph_vndk('vndk_indirect', None)
|
||||
|
||||
self.assertEqual(['/system/lib/vndk/libcutils.so',
|
||||
'/system/lib64/vndk/libcutils.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_core))
|
||||
self.assertEqual(['/system/lib/vndk/libcutils_dep.so',
|
||||
'/system/lib64/vndk/libcutils_dep.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_indirect))
|
||||
|
||||
def test_compute_vndk_fwk_ext(self):
|
||||
graph, vndk = self._create_graph_vndk('vndk_fwk_ext', 'vndk_gr')
|
||||
|
||||
self.assertEqual(['/system/lib/vndk/libRS.so',
|
||||
'/system/lib/vndk/libcutils.so',
|
||||
'/system/lib64/vndk/libRS.so',
|
||||
'/system/lib64/vndk/libcutils.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_core))
|
||||
self.assertEqual(['/system/lib/vndk-ext/libRS.so',
|
||||
'/system/lib64/vndk-ext/libRS.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
||||
|
||||
def test_compute_vndk_vnd_ext(self):
|
||||
graph, vndk = self._create_graph_vndk('vndk_vnd_ext', 'vndk_gr')
|
||||
|
||||
self.assertEqual(['/system/lib/vndk/libRS.so',
|
||||
'/system/lib/vndk/libcutils.so',
|
||||
'/system/lib64/vndk/libRS.so',
|
||||
'/system/lib64/vndk/libcutils.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_core))
|
||||
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||
self.assertEqual(['/vendor/lib/vndk-ext/libRS.so',
|
||||
'/vendor/lib64/vndk-ext/libRS.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
||||
|
||||
def test_compute_vndk_inward_customization(self):
|
||||
graph, generic_refs = self._create_graph_gr(
|
||||
'vndk_inward_customization', 'vndk_gr')
|
||||
|
||||
# Make sure libjpeg.so was loaded from the input dir.
|
||||
libjpeg_32 = graph.get_lib('/system/lib/libjpeg.so')
|
||||
self.assertIsNotNone(libjpeg_32)
|
||||
libjpeg_64 = graph.get_lib('/system/lib64/libjpeg.so')
|
||||
self.assertIsNotNone(libjpeg_64)
|
||||
|
||||
# Compute vndk sets and move libraries to the correct directories.
|
||||
vndk = graph._compute_vndk(
|
||||
sp_lib=SPLibResult(set(), set(), set(), set(), set(), set()),
|
||||
vndk_customized_for_system=set(),
|
||||
vndk_customized_for_vendor=set(),
|
||||
generic_refs=generic_refs,
|
||||
banned_libs=MockBannedLibs())
|
||||
|
||||
# Check vndk-core libraries.
|
||||
self.assertEqual(['/system/lib/vndk/libRS.so',
|
||||
'/system/lib/vndk/libcutils.so',
|
||||
'/system/lib64/vndk/libRS.so',
|
||||
'/system/lib64/vndk/libcutils.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_core))
|
||||
|
||||
# Check vndk-indirect libraries.
|
||||
self.assertEqual(['/system/lib/vndk/libjpeg.so',
|
||||
'/system/lib64/vndk/libjpeg.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_indirect))
|
||||
|
||||
# Check libjpeg.so (inward-customization) has been renamed.
|
||||
self.assertIsNone(graph.get_lib('/system/lib/libjpeg.so'))
|
||||
self.assertIsNone(graph.get_lib('/system/lib64/libjpeg.so'))
|
||||
self.assertIs(libjpeg_32,
|
||||
graph.get_lib('/system/lib/vndk/libjpeg.so'))
|
||||
self.assertIs(libjpeg_64,
|
||||
graph.get_lib('/system/lib64/vndk/libjpeg.so'))
|
||||
|
||||
# Check the absence of vndk-ext libraries.
|
||||
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
||||
|
||||
def test_compute_vndk_indirect_ext(self):
|
||||
# This test case reveals a corner case that will break vndk-indirect
|
||||
# computation. To reproduce the case, the following condition must be
|
||||
# satisfied:
|
||||
#
|
||||
# 1. libA depends on libB.
|
||||
# 2. libA is a vndk-fwk-ext.
|
||||
# 3. libB is an outward-customized vndk which depends on non-AOSP libC.
|
||||
#
|
||||
# Both AOSP libA and libB will be added to vndk-core. But,
|
||||
# unfortunately, libA will be resolved to libB in vndk-fwk-ext and this
|
||||
# will break the vndk-indirect computation because libC is not in
|
||||
# generic references.
|
||||
|
||||
graph, vndk = self._create_graph_vndk('vndk_indirect_ext',
|
||||
'vndk_indirect_ext_gr')
|
||||
|
||||
self.assertEqual(['/system/lib/vndk/libRS.so',
|
||||
'/system/lib/vndk/libcutils.so',
|
||||
'/system/lib64/vndk/libRS.so',
|
||||
'/system/lib64/vndk/libcutils.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_core))
|
||||
|
||||
self.assertEqual(['/system/lib/vndk/libRS_internal.so',
|
||||
'/system/lib64/vndk/libRS_internal.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_indirect))
|
||||
|
||||
self.assertEqual(['/system/lib/vndk-ext/libRS_internal.so',
|
||||
'/system/lib64/vndk-ext/libRS_internal.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||
|
||||
def test_compute_vndk_ext_deps(self):
|
||||
# This test case reveals a bug in the vndk-core dependencies assertion.
|
||||
# This will happen when libA and libB are added to both vndk-fwk-ext and
|
||||
# vndk-vnd-ext in the first round, libA depends libC, libC depends
|
||||
# libB.
|
||||
|
||||
graph, vndk = self._create_graph_vndk('vndk_ext_dep', 'vndk_ext_dep_gr')
|
||||
|
||||
self.assertEqual(['/system/lib/vndk/libA.so',
|
||||
'/system/lib/vndk/libB.so',
|
||||
'/system/lib/vndk/libC.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_core))
|
||||
|
||||
self.assertEqual(['/system/lib/vndk-ext/libA.so',
|
||||
'/system/lib/vndk-ext/libB.so',
|
||||
'/system/lib/vndk-ext/libC.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||
|
||||
self.assertEqual(['/vendor/lib/vndk-ext/libA.so',
|
||||
'/vendor/lib/vndk-ext/libB.so',
|
||||
'/vendor/lib/vndk-ext/libC.so'],
|
||||
self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user