ART: Refactor runtime apex checker
Use composition instead of inheritance to allow for better
customization of multilib behavior.
Test: art/build/apex/runtests.sh
Change-Id: Ie83995fe82ce912cd856b24cabb40582cba218d2
diff --git a/build/apex/art_apex_test.py b/build/apex/art_apex_test.py
index b686152..16fa74a 100755
--- a/build/apex/art_apex_test.py
+++ b/build/apex/art_apex_test.py
@@ -183,6 +183,8 @@
def error_count(self):
return self._errors
+ def reset_errors(self):
+ self._errors = 0
def is_file(self, file):
fs_object = self._provider.get(file)
@@ -255,45 +257,45 @@
def check_java_library(self, file):
return self.check_file('javalib/%s' % (file))
-class ReleaseChecker(Checker):
- def __init__(self, provider):
- super().__init__(provider)
+class ReleaseChecker:
+ def __init__(self, checker):
+ self._checker = checker
def __str__(self):
return 'Release Checker'
def run(self):
# Check that the mounted image contains an APEX manifest.
- self.check_file('apex_manifest.json')
+ self._checker.check_file('apex_manifest.json')
# Check that the mounted image contains ART base binaries.
- self.check_multilib_binary('dalvikvm')
- self.check_binary('dex2oat')
- self.check_binary('dexoptanalyzer')
- self.check_binary('profman')
+ self._checker.check_multilib_binary('dalvikvm')
+ self._checker.check_binary('dex2oat')
+ self._checker.check_binary('dexoptanalyzer')
+ self._checker.check_binary('profman')
# oatdump is only in device apex's due to build rules
# TODO: Check for it when it is also built for host.
- # self.check_binary('oatdump')
+ # self._checker.check_binary('oatdump')
# Check that the mounted image contains Android Runtime libraries.
- self.check_library('libart-compiler.so')
- self.check_library('libart-dexlayout.so')
- self.check_library('libart.so')
- self.check_library('libartbase.so')
- self.check_library('libartpalette.so')
- self.check_no_library('libartpalette-system.so')
- self.check_library('libdexfile.so')
- self.check_library('libdexfile_external.so')
- self.check_library('libopenjdkjvm.so')
- self.check_library('libopenjdkjvmti.so')
- self.check_library('libprofile.so')
+ self._checker.check_library('libart-compiler.so')
+ self._checker.check_library('libart-dexlayout.so')
+ self._checker.check_library('libart.so')
+ self._checker.check_library('libartbase.so')
+ self._checker.check_library('libartpalette.so')
+ self._checker.check_no_library('libartpalette-system.so')
+ self._checker.check_library('libdexfile.so')
+ self._checker.check_library('libdexfile_external.so')
+ self._checker.check_library('libopenjdkjvm.so')
+ self._checker.check_library('libopenjdkjvmti.so')
+ self._checker.check_library('libprofile.so')
# Check that the mounted image contains Android Core libraries.
# Note: host vs target libs are checked elsewhere.
- self.check_library('libjavacore.so')
- self.check_library('libopenjdk.so')
- self.check_library('libziparchive.so')
+ self._checker.check_library('libjavacore.so')
+ self._checker.check_library('libopenjdk.so')
+ self._checker.check_library('libziparchive.so')
# Check that the mounted image contains additional required libraries.
- self.check_library('libadbconnection.so')
+ self._checker.check_library('libadbconnection.so')
# TODO: Should we check for other libraries, such as:
#
@@ -309,76 +311,76 @@
#
# ?
- self.check_java_library('core-oj.jar')
- self.check_java_library('core-libart.jar')
- self.check_java_library('okhttp.jar')
- self.check_java_library('bouncycastle.jar')
- self.check_java_library('apache-xml.jar')
+ self._checker.check_java_library('core-oj.jar')
+ self._checker.check_java_library('core-libart.jar')
+ self._checker.check_java_library('okhttp.jar')
+ self._checker.check_java_library('bouncycastle.jar')
+ self._checker.check_java_library('apache-xml.jar')
-class ReleaseTargetChecker(Checker):
- def __init__(self, provider):
- super().__init__(provider)
+class ReleaseTargetChecker:
+ def __init__(self, checker):
+ self._checker = checker
def __str__(self):
return 'Release (Target) Checker'
def run(self):
# Check that the mounted image contains Android Core libraries.
- self.check_library('libexpat.so')
- self.check_library('libz.so')
+ self._checker.check_library('libexpat.so')
+ self._checker.check_library('libz.so')
-class ReleaseHostChecker(Checker):
- def __init__(self, provider):
- super().__init__(provider)
+class ReleaseHostChecker:
+ def __init__(self, checker):
+ self._checker = checker;
def __str__(self):
return 'Release (Host) Checker'
def run(self):
# Check that the mounted image contains Android Core libraries.
- self.check_library('libexpat-host.so')
- self.check_library('libz-host.so')
+ self._checker.check_library('libexpat-host.so')
+ self._checker.check_library('libz-host.so')
-class DebugChecker(Checker):
- def __init__(self, provider):
- super().__init__(provider)
+class DebugChecker:
+ def __init__(self, checker):
+ self._checker = checker
def __str__(self):
return 'Debug Checker'
def run(self):
# Check that the mounted image contains ART tools binaries.
- self.check_binary('dexdiag')
- self.check_binary('dexdump')
- self.check_binary('dexlist')
+ self._checker.check_binary('dexdiag')
+ self._checker.check_binary('dexdump')
+ self._checker.check_binary('dexlist')
# Check that the mounted image contains ART debug binaries.
# TODO(b/123427238): This should probably be dex2oatd, fix!
- self.check_binary('dex2oatd32')
- self.check_binary('dexoptanalyzerd')
- self.check_binary('profmand')
+ self._checker.check_binary('dex2oatd32')
+ self._checker.check_binary('dexoptanalyzerd')
+ self._checker.check_binary('profmand')
# Check that the mounted image contains Android Runtime debug libraries.
- self.check_library('libartbased.so')
- self.check_library('libartd-compiler.so')
- self.check_library('libartd-dexlayout.so')
- self.check_library('libartd.so')
- self.check_library('libdexfiled.so')
- self.check_library('libopenjdkjvmd.so')
- self.check_library('libopenjdkjvmtid.so')
- self.check_library('libprofiled.so')
+ self._checker.check_library('libartbased.so')
+ self._checker.check_library('libartd-compiler.so')
+ self._checker.check_library('libartd-dexlayout.so')
+ self._checker.check_library('libartd.so')
+ self._checker.check_library('libdexfiled.so')
+ self._checker.check_library('libopenjdkjvmd.so')
+ self._checker.check_library('libopenjdkjvmtid.so')
+ self._checker.check_library('libprofiled.so')
# Check that the mounted image contains Android Core debug libraries.
- self.check_library('libopenjdkd.so')
+ self._checker.check_library('libopenjdkd.so')
# Check that the mounted image contains additional required debug libraries.
- self.check_library('libadbconnectiond.so')
+ self._checker.check_library('libadbconnectiond.so')
-class DebugTargetChecker(Checker):
- def __init__(self, provider):
- super().__init__(provider)
+class DebugTargetChecker:
+ def __init__(self, checker):
+ self._checker = checker
def __str__(self):
return 'Debug (Target) Checker'
def run(self):
# Check for files pulled in from debug target-only oatdump.
- self.check_binary('oatdump')
- self.check_single_library('libart-disassembler.so')
+ self._checker.check_binary('oatdump')
+ self._checker.check_single_library('libart-disassembler.so')
def print_list(provider):
def print_list_impl(provider, path):
@@ -462,26 +464,28 @@
return 0
checkers = []
+ base_checker = Checker(apex_provider)
- checkers.append(ReleaseChecker(apex_provider))
+ checkers.append(ReleaseChecker(base_checker))
if args.host:
- checkers.append(ReleaseHostChecker(apex_provider))
+ checkers.append(ReleaseHostChecker(base_checker))
else:
- checkers.append(ReleaseTargetChecker(apex_provider))
+ checkers.append(ReleaseTargetChecker(base_checker))
if args.debug:
- checkers.append(DebugChecker(apex_provider))
+ checkers.append(DebugChecker(base_checker))
if args.debug and not args.host:
- checkers.append(DebugTargetChecker(apex_provider))
+ checkers.append(DebugTargetChecker(base_checker))
failed = False
for checker in checkers:
logging.info('%s...', checker)
checker.run()
- if checker.error_count() > 0:
+ if base_checker.error_count() > 0:
logging.error('%s FAILED', checker)
failed = True
else:
logging.info('%s SUCCEEDED', checker)
+ base_checker.reset_errors()
return 1 if failed else 0