From 7565fcc71bf41c6cff52e6635e329521a1e0b47e Mon Sep 17 00:00:00 2001 From: Po-Chien Hsueh Date: Thu, 11 Apr 2019 16:36:54 +0800 Subject: [PATCH] Retry getting DynamicSystem service DynamicSystemService might not be ready even sysprop init.svc.gsid is "running". Move connect() into retry loop. Bug: 130336119 Test: boot the device and check logcat Change-Id: Iab5065bf139abcf6c19dcc3553f8a3ca1642e7b3 --- .../android/server/DynamicSystemService.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/DynamicSystemService.java b/services/core/java/com/android/server/DynamicSystemService.java index 99bbcf890a0a4..f1882c5f641e1 100644 --- a/services/core/java/com/android/server/DynamicSystemService.java +++ b/services/core/java/com/android/server/DynamicSystemService.java @@ -47,7 +47,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub implements private static IGsiService connect(DeathRecipient recipient) throws RemoteException { IBinder binder = ServiceManager.getService("gsiservice"); if (binder == null) { - throw new RemoteException(NO_SERVICE_ERROR); + return null; } /** * The init will restart gsiservice if it crashed and the proxy object will need to be @@ -68,26 +68,31 @@ public class DynamicSystemService extends IDynamicSystemService.Stub implements private IGsiService getGsiService() throws RemoteException { checkPermission(); + if (!"running".equals(SystemProperties.get("init.svc.gsid"))) { SystemProperties.set("ctl.start", "gsid"); - for (int sleepMs = 64; sleepMs <= (GSID_ROUGH_TIMEOUT_MS << 1); sleepMs <<= 1) { - try { - Thread.sleep(sleepMs); - } catch (InterruptedException e) { - Slog.e(TAG, "Interrupted when waiting for GSID"); - break; + } + + for (int sleepMs = 64; sleepMs <= (GSID_ROUGH_TIMEOUT_MS << 1); sleepMs <<= 1) { + synchronized (this) { + if (mGsiService == null) { + mGsiService = connect(this); } - if ("running".equals(SystemProperties.get("init.svc.gsid"))) { - break; + if (mGsiService != null) { + return mGsiService; } } - } - synchronized (this) { - if (mGsiService == null) { - mGsiService = connect(this); + + try { + Slog.d(TAG, "GsiService is not ready, wait for " + sleepMs + "ms"); + Thread.sleep(sleepMs); + } catch (InterruptedException e) { + Slog.e(TAG, "Interrupted when waiting for GSID"); + return null; } - return mGsiService; } + + throw new RemoteException(NO_SERVICE_ERROR); } private void checkPermission() {