From bbfd15a9570cca6d0afbb0359dca2dd402e75611 Mon Sep 17 00:00:00 2001 From: William Hester Date: Mon, 6 May 2019 16:23:47 -0700 Subject: [PATCH] Start THM outside of the frp block Starting TestHarnessModeService outside of the FRP block will allow OEMs to provide their own implementation of PersistentDataBlockManagerInternal in LocalServices, which will allow them to satisfy all CTS requirements even without supporting Factory Reset Protection. Bug: 131439285 Test: make && adb shell cmd testharness enable Change-Id: If3ea192a22105716cab1dbed832f8c20b51058b7 (cherry picked from commit 87ac4ea4a586457f84a9534526486ace4152b635) --- .../testharness/TestHarnessModeService.java | 34 +++++++++++++++---- .../java/com/android/server/SystemServer.java | 8 ++--- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java index 0b0ff660cc01a..fcf87ee2a4b82 100644 --- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java +++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java @@ -105,9 +105,8 @@ public class TestHarnessModeService extends SystemService { */ private void setUpTestHarnessMode() { Slog.d(TAG, "Setting up test harness mode"); - byte[] testHarnessModeData = getPersistentDataBlock().getTestHarnessModeData(); - if (testHarnessModeData == null || testHarnessModeData.length == 0) { - // There's no data to apply, so leave it as-is. + byte[] testHarnessModeData = getTestHarnessModeData(); + if (testHarnessModeData == null) { return; } // If there is data, we should set the device as provisioned, so that we skip the setup @@ -125,9 +124,8 @@ public class TestHarnessModeService extends SystemService { private void completeTestHarnessModeSetup() { Slog.d(TAG, "Completing Test Harness Mode setup."); - byte[] testHarnessModeData = getPersistentDataBlock().getTestHarnessModeData(); - if (testHarnessModeData == null || testHarnessModeData.length == 0) { - // There's no data to apply, so leave it as-is. + byte[] testHarnessModeData = getTestHarnessModeData(); + if (testHarnessModeData == null) { return; } try { @@ -145,6 +143,21 @@ public class TestHarnessModeService extends SystemService { } } + private byte[] getTestHarnessModeData() { + PersistentDataBlockManagerInternal blockManager = getPersistentDataBlock(); + if (blockManager == null) { + Slog.e(TAG, "Failed to start Test Harness Mode; no implementation of " + + "PersistentDataBlockManagerInternal was bound!"); + return null; + } + byte[] testHarnessModeData = blockManager.getTestHarnessModeData(); + if (testHarnessModeData == null || testHarnessModeData.length == 0) { + // There's no data to apply, so leave it as-is. + return null; + } + return testHarnessModeData; + } + private void configureSettings() { ContentResolver cr = getContext().getContentResolver(); @@ -309,7 +322,14 @@ public class TestHarnessModeService extends SystemService { byte[] adbTempKeysBytes = getBytesFromFile(adbTempKeys); PersistentData persistentData = new PersistentData(adbKeysBytes, adbTempKeysBytes); - getPersistentDataBlock().setTestHarnessModeData(persistentData.toBytes()); + PersistentDataBlockManagerInternal blockManager = getPersistentDataBlock(); + if (blockManager == null) { + Slog.e(TAG, "Failed to enable Test Harness Mode. No implementation of " + + "PersistentDataBlockManagerInternal was bound."); + getErrPrintWriter().println("Failed to enable Test Harness Mode"); + return 1; + } + blockManager.setTestHarnessModeData(persistentData.toBytes()); } catch (IOException e) { Slog.e(TAG, "Failed to store ADB keys.", e); getErrPrintWriter().println("Failed to enable Test Harness Mode"); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 4ac8342e6e607..b94795fe0b454 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1206,12 +1206,12 @@ public final class SystemServer { traceBeginAndSlog("StartPersistentDataBlock"); mSystemServiceManager.startService(PersistentDataBlockService.class); traceEnd(); - - traceBeginAndSlog("StartTestHarnessMode"); - mSystemServiceManager.startService(TestHarnessModeService.class); - traceEnd(); } + traceBeginAndSlog("StartTestHarnessMode"); + mSystemServiceManager.startService(TestHarnessModeService.class); + traceEnd(); + if (hasPdb || OemLockService.isHalPresent()) { // Implementation depends on pdb or the OemLock HAL traceBeginAndSlog("StartOemLockService");