From 389443cedadb2312571712ed37ba0dde2e4fe102 Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Fri, 15 Mar 2019 08:21:27 +0900 Subject: [PATCH] Initialize the NetworkStack before WiFi The NetworkStack needs to be marked as start requested before any client can use it from the system server, so it knows to queue requests until it actually comes up. This fixes a bug introduced in commit: I93315ad31925bd436e21d1eabb21d5967e6aae60 where a client trying to use the network stack in the system server before ActivityManager.systemReady() could block and eventually timeout, resulting in a null INetworkStackConnector. Test: booted, WiFi working Bug: 128620654 Change-Id: Ieca2657373eba78195b387fb266fa0424fce8ada --- services/java/com/android/server/SystemServer.java | 8 ++++++++ services/net/java/android/net/NetworkStackClient.java | 11 +++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index d33d7f57df9a6..4125b92437199 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1118,6 +1118,14 @@ public final class SystemServer { mSystemServiceManager.startService(ClipboardService.class); traceEnd(); + traceBeginAndSlog("InitNetworkStackClient"); + try { + NetworkStackClient.getInstance().init(); + } catch (Throwable e) { + reportWtf("initializing NetworkStackClient", e); + } + traceEnd(); + traceBeginAndSlog("StartNetworkManagementService"); try { networkManagement = NetworkManagementService.create(context); diff --git a/services/net/java/android/net/NetworkStackClient.java b/services/net/java/android/net/NetworkStackClient.java index a8f4a77a91b47..fe447fc09e30c 100644 --- a/services/net/java/android/net/NetworkStackClient.java +++ b/services/net/java/android/net/NetworkStackClient.java @@ -164,6 +164,15 @@ public class NetworkStackClient { } } + /** + * Initialize the network stack. Should be called only once on device startup, before any + * client attempts to use the network stack. + */ + public void init() { + log("Network stack init"); + mNetworkStackStartRequested = true; + } + /** * Start the network stack. Should be called only once on device startup. * @@ -174,8 +183,6 @@ public class NetworkStackClient { */ public void start(Context context) { log("Starting network stack"); - mNetworkStackStartRequested = true; - final PackageManager pm = context.getPackageManager(); // Try to bind in-process if the device was shipped with an in-process version