From 081e525ff6f0d9d252954b8e926550f25e230409 Mon Sep 17 00:00:00 2001 From: Howard Chen Date: Thu, 11 May 2023 13:52:01 +0800 Subject: [PATCH] Ignore the reboot to normal intent when DSU is locked This feature provides the application with the ability to lock the device into DSU mode, allowing only authorized users to exit. Bug: 275484855 Test: manual testing with a slot name ends with ".lock" Change-Id: Ie00fd897daf2dfb11c2c792887a0e95ee164cea3 --- .../android/os/image/DynamicSystemManager.java | 12 ++++++++++++ .../android/os/image/IDynamicSystemService.aidl | 6 ++++++ .../DynamicSystemInstallationService.java | 5 ++++- .../com/android/server/DynamicSystemService.java | 15 ++++++++++++--- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/core/java/android/os/image/DynamicSystemManager.java b/core/java/android/os/image/DynamicSystemManager.java index 9610b16a312cb..536795bafb1c9 100644 --- a/core/java/android/os/image/DynamicSystemManager.java +++ b/core/java/android/os/image/DynamicSystemManager.java @@ -285,4 +285,16 @@ public class DynamicSystemManager { throw new RuntimeException(e.toString()); } } + + /** + * Returns the active DSU slot + */ + @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM) + public String getActiveDsuSlot() { + try { + return mService.getActiveDsuSlot(); + } catch (RemoteException e) { + throw new RuntimeException(e.toString()); + } + } } diff --git a/core/java/android/os/image/IDynamicSystemService.aidl b/core/java/android/os/image/IDynamicSystemService.aidl index 755368a85c403..0280ebbd87aba 100644 --- a/core/java/android/os/image/IDynamicSystemService.aidl +++ b/core/java/android/os/image/IDynamicSystemService.aidl @@ -145,4 +145,10 @@ interface IDynamicSystemService */ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM") long suggestScratchSize(); + + /** + * Get the active DSU slot + */ + @EnforcePermission("MANAGE_DYNAMIC_SYSTEM") + String getActiveDsuSlot(); } diff --git a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java index 5e42f705cf4ba..e78de4957e221 100644 --- a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java +++ b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java @@ -423,7 +423,10 @@ public class DynamicSystemInstallationService extends Service Log.e(TAG, "It's already running in normal system."); return; } - + if (mDynSystem.getActiveDsuSlot().endsWith(".lock")) { + Log.e(TAG, "Ignore the reboot intent for a locked DSU slot"); + return; + } if (!mDynSystem.setEnable(/* enable = */ false, /* oneShot = */ false)) { Log.e(TAG, "Failed to disable DynamicSystem."); diff --git a/services/core/java/com/android/server/DynamicSystemService.java b/services/core/java/com/android/server/DynamicSystemService.java index b0c1d05b0dd49..cbacee6ba72c5 100644 --- a/services/core/java/com/android/server/DynamicSystemService.java +++ b/services/core/java/com/android/server/DynamicSystemService.java @@ -226,9 +226,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub { IGsiService gsiService = getGsiService(); if (enable) { try { - if (mDsuSlot == null) { - mDsuSlot = gsiService.getActiveDsuSlot(); - } + getActiveDsuSlot(); GsiServiceCallback callback = new GsiServiceCallback(); synchronized (callback) { gsiService.enableGsiAsync(oneShot, mDsuSlot, callback); @@ -287,4 +285,15 @@ public class DynamicSystemService extends IDynamicSystemService.Stub { return getGsiService().suggestScratchSize(); } + + @Override + @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM) + public String getActiveDsuSlot() throws RemoteException { + super.getActiveDsuSlot_enforcePermission(); + + if (mDsuSlot == null) { + mDsuSlot = getGsiService().getActiveDsuSlot(); + } + return mDsuSlot; + } }