From 5ac8abf9ca9d77275a8aa432b7df613595d225d2 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Fri, 26 Jan 2018 14:26:53 -0500 Subject: [PATCH] Refactor ZygoteProcess to deal in LocalSocketAddress. Currently ZygoteProcess only uses String names in the RESERVED socket namespace. This CL reworks the class to use LocalSocketAddress, so that other socket namespaces can be used to communicate with zygotes. Bug: 63749735 Test: m (no functional change) Merged-In: I4146f684bfcd78b16500829d02ff54590a8b48f5 Change-Id: I0113a7189530c2e57c48058df542057e855bae42 --- core/java/android/os/ZygoteProcess.java | 36 ++++++++++++++++++------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index 670f7949dd199..4a976403e7a87 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -61,18 +61,27 @@ public class ZygoteProcess { /** * The name of the socket used to communicate with the primary zygote. */ - private final String mSocket; + private final LocalSocketAddress mSocket; /** * The name of the secondary (alternate ABI) zygote socket. */ - private final String mSecondarySocket; + private final LocalSocketAddress mSecondarySocket; public ZygoteProcess(String primarySocket, String secondarySocket) { + this(new LocalSocketAddress(primarySocket, LocalSocketAddress.Namespace.RESERVED), + new LocalSocketAddress(secondarySocket, LocalSocketAddress.Namespace.RESERVED)); + } + + public ZygoteProcess(LocalSocketAddress primarySocket, LocalSocketAddress secondarySocket) { mSocket = primarySocket; mSecondarySocket = secondarySocket; } + public LocalSocketAddress getPrimarySocketAddress() { + return mSocket; + } + /** * State for communicating with the zygote process. */ @@ -92,14 +101,13 @@ public class ZygoteProcess { this.abiList = abiList; } - public static ZygoteState connect(String socketAddress) throws IOException { + public static ZygoteState connect(LocalSocketAddress address) throws IOException { DataInputStream zygoteInputStream = null; BufferedWriter zygoteWriter = null; final LocalSocket zygoteSocket = new LocalSocket(); try { - zygoteSocket.connect(new LocalSocketAddress(socketAddress, - LocalSocketAddress.Namespace.RESERVED)); + zygoteSocket.connect(address); zygoteInputStream = new DataInputStream(zygoteSocket.getInputStream()); @@ -115,8 +123,8 @@ public class ZygoteProcess { } String abiListString = getAbiList(zygoteWriter, zygoteInputStream); - Log.i("Zygote", "Process: zygote socket " + socketAddress + " opened, supported ABIS: " - + abiListString); + Log.i("Zygote", "Process: zygote socket " + address.getNamespace() + "/" + + address.getName() + " opened, supported ABIS: " + abiListString); return new ZygoteState(zygoteSocket, zygoteInputStream, zygoteWriter, Arrays.asList(abiListString.split(","))); @@ -514,9 +522,19 @@ public class ZygoteProcess { * @param socketName The name of the socket to connect to. */ public static void waitForConnectionToZygote(String socketName) { + final LocalSocketAddress address = + new LocalSocketAddress(socketName, LocalSocketAddress.Namespace.RESERVED); + waitForConnectionToZygote(address); + } + + /** + * Try connecting to the Zygote over and over again until we hit a time-out. + * @param address The name of the socket to connect to. + */ + public static void waitForConnectionToZygote(LocalSocketAddress address) { for (int n = 20; n >= 0; n--) { try { - final ZygoteState zs = ZygoteState.connect(socketName); + final ZygoteState zs = ZygoteState.connect(address); zs.close(); return; } catch (IOException ioe) { @@ -529,6 +547,6 @@ public class ZygoteProcess { } catch (InterruptedException ie) { } } - Slog.wtf(LOG_TAG, "Failed to connect to Zygote through socket " + socketName); + Slog.wtf(LOG_TAG, "Failed to connect to Zygote through socket " + address.getName()); } }