Relax startup scripts to devices not supporting nfc

This also extends apk_masseur.py with an option to store the dex compressed.

Change-Id: I4695acc9d7f41f4020225f54cdea93de384dce72
diff --git a/tools/startup/adb_utils.py b/tools/startup/adb_utils.py
index 6ce19ab..0a4ae59 100755
--- a/tools/startup/adb_utils.py
+++ b/tools/startup/adb_utils.py
@@ -41,10 +41,14 @@
     OFF_UNLOCKED = 2
     ON_LOCKED = 3
     ON_UNLOCKED = 4
+    UNKNOWN = 5
 
     def is_off(self):
         return self == ScreenState.OFF_LOCKED or self == ScreenState.OFF_UNLOCKED
 
+    def is_off_or_unknown(self):
+        return self.is_off() or self.is_unknown()
+
     def is_on(self):
         return self == ScreenState.ON_LOCKED or self == ScreenState.ON_UNLOCKED
 
@@ -54,6 +58,15 @@
     def is_on_and_unlocked(self):
         return self == ScreenState.ON_UNLOCKED
 
+    def is_on_and_unlocked_or_unknown(self):
+        return self.is_on_and_unlocked() or self.is_unknown()
+
+    def is_on_or_unknown(self):
+        return self.is_on() or self.is_unknown()
+
+    def is_unknown(self):
+        return self == ScreenState.UNKNOWN
+
 
 def broadcast(action, component, device_id=None):
     print('Sending broadcast %s' % action)
@@ -147,13 +160,13 @@
 def ensure_screen_on(device_id=None):
     if get_screen_state(device_id).is_off():
         toggle_screen(device_id)
-    assert get_screen_state(device_id).is_on()
+    assert get_screen_state(device_id).is_on_or_unknown()
 
 
 def ensure_screen_off(device_id=None):
     if get_screen_state(device_id).is_on():
         toggle_screen(device_id)
-    assert get_screen_state(device_id).is_off()
+    assert get_screen_state(device_id).is_off_or_unknown()
 
 
 def force_compilation(app_id, device_id=None):
@@ -243,7 +256,11 @@
 
 def get_screen_state(device_id=None):
     cmd = create_adb_cmd('shell dumpsys nfc', device_id)
-    stdout = subprocess.check_output(cmd).decode('utf-8').strip()
+    process_result = subprocess.run(cmd, capture_output=True)
+    stderr = process_result.stderr.decode('utf-8')
+    if "Can't find service: nfc" in stderr:
+        return ScreenState.UNKNOWN
+    stdout = process_result.stdout.decode('utf-8').strip()
     screen_state_value = None
     for line in stdout.splitlines():
         if line.startswith('mScreenState='):
@@ -480,6 +497,8 @@
 def unlock(device_id=None, device_pin=None):
     ensure_screen_on(device_id)
     screen_state = get_screen_state(device_id)
+    if screen_state.is_unknown():
+        return
     assert screen_state.is_on(), 'was %s' % screen_state
     if screen_state.is_on_and_locked():
         if device_pin is not None: