Process.java revision ff0c470833b2cb4130a30895093630242d5f238d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.LocalSocket;
20973b4663b0b5ee62006522bf4742af076096e548Narayan Kamathimport android.net.LocalSocketAddress;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
22973b4663b0b5ee62006522bf4742af076096e548Narayan Kamathimport com.android.internal.os.Zygote;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.DataInputStream;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter;
274444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamathimport java.nio.charset.StandardCharsets;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
294444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamathimport java.util.Arrays;
304444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamathimport java.util.List;
31406ec15647b7664cadadde41dbaaa10e298c582bJeff Haoimport libcore.io.Libcore;
32406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*package*/ class ZygoteStartFailedEx extends Exception {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Something prevented the zygote process startup from happening normally
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZygoteStartFailedEx() {};
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZygoteStartFailedEx(String s) {super(s);}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZygoteStartFailedEx(Throwable cause) {super(cause);}
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tools for managing OS processes.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Process {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOG_TAG = "Process";
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ZYGOTE_SOCKET = "zygote";
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
514444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static final String SECONDARY_ZYGOTE_SOCKET = "zygote_secondary";
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the UID/GID under which system code runs.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SYSTEM_UID = 1000;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the UID/GID under which the telephony code runs.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PHONE_UID = 1001;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
64854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     * Defines the UID/GID for the user shell.
65854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     * @hide
66854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     */
67854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn    public static final int SHELL_UID = 2000;
68854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
69854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn    /**
70d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     * Defines the UID/GID for the log group.
71d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     * @hide
72d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     */
73d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood    public static final int LOG_UID = 1007;
74d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood
75d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood    /**
76d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     * Defines the UID/GID for the WIFI supplicant process.
77d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     * @hide
78d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     */
79d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    public static final int WIFI_UID = 1010;
80d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani
81d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    /**
828b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     * Defines the UID/GID for the mediaserver process.
838b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     * @hide
848b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     */
858b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten    public static final int MEDIA_UID = 1013;
868b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten
878b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten    /**
885294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     * Defines the UID/GID for the DRM process.
895294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     * @hide
905294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     */
915294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey    public static final int DRM_UID = 1019;
925294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey
935294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey    /**
9426993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     * Defines the UID/GID for the group that controls VPN services.
9526993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     * @hide
9626993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     */
9726993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root    public static final int VPN_UID = 1016;
9826993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root
9926993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root    /**
100cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     * Defines the UID/GID for the NFC service process.
101cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     * @hide
102cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     */
103a5cb9f42174a52afbeb7e33dab64282f52f8cedbNick Pelly    public static final int NFC_UID = 1027;
104cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly
105cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly    /**
1061abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     * Defines the UID/GID for the Bluetooth service process.
1071abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     * @hide
1081abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     */
1091abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh    public static final int BLUETOOTH_UID = 1002;
1101abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh
1111abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh    /**
112dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     * Defines the GID for the group that allows write access to the internal media storage.
113dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     * @hide
114dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     */
115dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood    public static final int MEDIA_RW_GID = 1023;
116dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood
117dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood    /**
118184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey     * Access to installed package details
119184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey     * @hide
120184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey     */
121184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey    public static final int PACKAGE_INFO_GID = 1032;
122184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey
123184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey    /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the start of a range of UIDs (and GIDs), going from this
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to applications.
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FIRST_APPLICATION_UID = 10000;
129184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Last of application-specific UIDs starting at
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #FIRST_APPLICATION_UID}.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13421fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn    public static final int LAST_APPLICATION_UID = 19999;
135a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
136a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
137a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * First uid used for fully isolated sandboxed processes (with no permissions of their own)
138a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
139a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
140a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final int FIRST_ISOLATED_UID = 99000;
141a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
142a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
143a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Last uid used for fully isolated sandboxed processes (with no permissions of their own)
144a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
145a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
146a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final int LAST_ISOLATED_UID = 99999;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
149e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * First gid for applications to share resources. Used when forward-locking
150e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * is enabled but all UserHandles need to be able to read the resources.
151e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * @hide
152e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     */
153e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    public static final int FIRST_SHARED_APPLICATION_GID = 50000;
154e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root
155e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    /**
156e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * Last gid for applications to share resources. Used when forward-locking
157e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * is enabled but all UserHandles need to be able to read the resources.
158e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * @hide
159e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     */
160e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    public static final int LAST_SHARED_APPLICATION_GID = 59999;
161e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root
162e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    /**
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of application threads.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_DEFAULT = 0;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***************************************
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ** Keep in sync with utils/threads.h **
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***************************************
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lowest available thread priority.  Only for those who really, really
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * don't want to run if anything else is happening.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_LOWEST = 19;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority background threads.  This gives your thread a slightly
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lower than normal priority, so that it will have less chance of impacting
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the responsiveness of the user interface.
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_BACKGROUND = 10;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of threads that are currently running a user interface
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the user is interacting with.  Applications can not normally
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority; the system will automatically adjust your
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application threads as the user moves through the UI.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_FOREGROUND = -2;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of system display threads, involved in updating
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user interface.  Applications can not
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normally change to this priority.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_DISPLAY = -4;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of the most important display threads, for compositing
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the screen and retrieving input events.  Applications can not normally
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority.
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of audio threads.  Applications can not normally
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_AUDIO = -16;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of the most important audio threads.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applications can not normally change to this priority.
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_URGENT_AUDIO = -19;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Minimum increment to make a priority more favorable.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Minimum increment to make a priority less favorable.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
254e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
2556793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Default scheduling policy
2566793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2576793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2586793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_OTHER = 0;
2596793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2606793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2616793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * First-In First-Out scheduling policy
2626793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2636793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2646793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_FIFO = 1;
2656793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2666793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2676793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Round-Robin scheduling policy
2686793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2696793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2706793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_RR = 2;
2716793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2726793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2736793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Batch scheduling policy
2746793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2756793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2766793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_BATCH = 3;
2776793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2786793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2796793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Idle scheduling policy
2806793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2816793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2826793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_IDLE = 5;
2836793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
284f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // Keep in sync with SP_* constants of enum type SchedPolicy
285f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // declared in system/core/include/cutils/sched_policy.h,
286f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // except THREAD_GROUP_DEFAULT does not correspond to any SP_* value.
287f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
2886793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
289f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Default thread group -
290f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * has meaning with setProcessGroup() only, cannot be used with setThreadGroup().
291f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * When used with setProcessGroup(), the group of each thread in the process
292f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * is conditionally changed based on that thread's current priority, as follows:
293f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads with priority numerically less than THREAD_PRIORITY_BACKGROUND
294f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * are moved to foreground thread group.  All other threads are left unchanged.
295e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
296e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
297f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    public static final int THREAD_GROUP_DEFAULT = -1;
298e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
299e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
300f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Background thread group - All threads in
301e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * this group are scheduled with a reduced share of the CPU.
302f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Value is same as constant SP_BACKGROUND of enum SchedPolicy.
303f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * FIXME rename to THREAD_GROUP_BACKGROUND.
304e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
305e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
306f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    public static final int THREAD_GROUP_BG_NONINTERACTIVE = 0;
307e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
308e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
309f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Foreground thread group - All threads in
310f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * this group are scheduled with a normal share of the CPU.
311f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Value is same as constant SP_FOREGROUND of enum SchedPolicy.
312f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Not used at this level.
313e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
314e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     **/
315f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    private static final int THREAD_GROUP_FOREGROUND = 1;
316e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
31707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
31807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * System thread group.
31907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
32007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
32107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_SYSTEM = 2;
32207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
32307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
32407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Application audio thread group.
32507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
32607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
32707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_AUDIO_APP = 3;
32807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
32907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
33007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * System audio thread group.
33107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
33207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
33307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_AUDIO_SYS = 4;
33407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_QUIT = 3;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_KILL = 9;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_USR1 = 10;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3394444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    /**
3404444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * State for communicating with the zygote process.
3414444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     */
3424444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    static class ZygoteState {
3434444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        final LocalSocket socket;
3444444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        final DataInputStream inputStream;
3454444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        final BufferedWriter writer;
3464444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        final List<String> abiList;
3474444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
3484444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        boolean mClosed;
3494444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
3504444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        private ZygoteState(LocalSocket socket, DataInputStream inputStream,
3514444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                BufferedWriter writer, List<String> abiList) {
3524444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            this.socket = socket;
3534444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            this.inputStream = inputStream;
3544444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            this.writer = writer;
3554444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            this.abiList = abiList;
3564444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
3574444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
3584444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        static ZygoteState connect(String socketAddress, int tries) throws ZygoteStartFailedEx {
3594444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            LocalSocket zygoteSocket = null;
3604444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            DataInputStream zygoteInputStream = null;
3614444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            BufferedWriter zygoteWriter = null;
3624444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
3634444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            /*
3644444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath             * See bug #811181: Sometimes runtime can make it up before zygote.
3654444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath             * Really, we'd like to do something better to avoid this condition,
3664444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath             * but for now just wait a bit...
3674444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath             *
3684444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath             * TODO: This bug was filed in 2007. Get rid of this code. The zygote
3694444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath             * forks the system_server so it shouldn't be possible for the zygote
3704444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath             * socket to be brought up after the system_server is.
3714444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath             */
3724444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            for (int i = 0; i < tries; i++) {
3734444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                if (i > 0) {
3744444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    try {
3754444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                        Log.i("Zygote", "Zygote not up yet, sleeping...");
3764444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                        Thread.sleep(ZYGOTE_RETRY_MILLIS);
3774444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    } catch (InterruptedException ex) {
3784444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                        throw new ZygoteStartFailedEx(ex);
3794444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    }
3804444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                }
3814444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
3824444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                try {
3834444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    zygoteSocket = new LocalSocket();
3844444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    zygoteSocket.connect(new LocalSocketAddress(socketAddress,
3854444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                            LocalSocketAddress.Namespace.RESERVED));
3864444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
3874444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    zygoteInputStream = new DataInputStream(zygoteSocket.getInputStream());
3884444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
3894444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    zygoteWriter = new BufferedWriter(new OutputStreamWriter(
3904444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                            zygoteSocket.getOutputStream()), 256);
3914444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    break;
3924444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                } catch (IOException ex) {
3934444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    if (zygoteSocket != null) {
3944444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                        try {
3954444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                            zygoteSocket.close();
3964444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                        } catch (IOException ex2) {
3974444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                            Log.e(LOG_TAG,"I/O exception on close after exception", ex2);
3984444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                        }
3994444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    }
4004444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4014444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    zygoteSocket = null;
4024444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                }
4034444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            }
4044444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4054444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            if (zygoteSocket == null) {
4064444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                throw new ZygoteStartFailedEx("connect failed");
4074444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            }
4084444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4094444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            String abiListString = getAbiList(zygoteWriter, zygoteInputStream);
4104444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            Log.i("Zygote", "Process: zygote socket opened, supported ABIS: " + abiListString);
4114444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4124444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return new ZygoteState(zygoteSocket, zygoteInputStream, zygoteWriter,
4134444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    Arrays.asList(abiListString.split(",")));
4144444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
4154444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4164444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        boolean matches(String abi) {
4174444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return abiList.contains(abi);
4184444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
4194444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4204444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        void close() {
4214444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            try {
4224444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                socket.close();
4234444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            } catch (IOException ex) {
4244444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                Log.e(LOG_TAG,"I/O exception on routine close", ex);
4254444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            }
4264444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4274444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            mClosed = true;
4284444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
4294444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4304444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        boolean isClosed() {
4314444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return mClosed;
4324444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
4334444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    }
4344444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
4354444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    /**
4364444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * The state of the connection to the primary zygote.
4374444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     */
4384444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    static ZygoteState primaryZygoteState;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4404444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    /**
4414444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * The state of the connection to the secondary zygote.
4424444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     */
4434444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    static ZygoteState secondaryZygoteState;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start a new process.
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If processes are enabled, a new process is created and the
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * static main() function of a <var>processClass</var> is executed there.
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The process will continue running after this function returns.
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If processes are not enabled, a new thread in the caller's
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process is created and main() of <var>processClass</var> called there.
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The niceName parameter, if not an empty string, is a custom name to
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * give to the process instead of using processClass.  This allows you to
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * make easily identifyable processes even if you are using the same base
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>processClass</var> to start them.
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param processClass The class to use as the process's main entry
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     point.
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param niceName A more readable name to use for the process.
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uid The user-id under which the process will run.
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gid The group-id under which the process will run.
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gids Additional group-ids associated with the process.
466e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param debugFlags Additional flags.
467e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param targetSdkVersion The target SDK version for the app.
468bd19b9ee305c11d8aa3cbb105bf2d3a6b06389b5Stephen Smalley     * @param seInfo null-ok SELinux information for the new process.
469ff0c470833b2cb4130a30895093630242d5f238dRamin Zaghi     * @param abi non-null the ABI this app should be started with.
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param zygoteArgs Additional arguments to supply to the zygote process.
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4723f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws RuntimeException on fatal start failure
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4773f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final ProcessStartResult start(final String processClass,
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  int uid, int gid, int[] gids,
4805b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
4815b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
48283d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
483ff0c470833b2cb4130a30895093630242d5f238dRamin Zaghi                                  String abi,
48410e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                                  String[] zygoteArgs) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
48610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            return startViaZygote(processClass, niceName, uid, gid, gids,
4874444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    debugFlags, mountExternal, targetSdkVersion, seInfo,
488ff0c470833b2cb4130a30895093630242d5f238dRamin Zaghi                    abi, zygoteArgs);
48910e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        } catch (ZygoteStartFailedEx ex) {
49010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            Log.e(LOG_TAG,
49110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                    "Starting VM process through Zygote failed");
49210e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            throw new RuntimeException(
49310e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                    "Starting VM process through Zygote failed", ex);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** retry interval for opening a zygote socket */
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ZYGOTE_RETRY_MILLIS = 500;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5014444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * Queries the zygote for the list of ABIS it supports.
5024444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     *
5034444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * @throws ZygoteStartFailedEx if the query failed.
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5054444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static String getAbiList(BufferedWriter writer, DataInputStream inputStream)
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ZygoteStartFailedEx {
5074444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        try {
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5094444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            // Each query starts with the argument count (1 in this case)
5104444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.write("1");
5114444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            // ... followed by a new-line.
5124444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.newLine();
5134444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            // ... followed by our only argument.
5144444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.write("--query-abi-list");
5154444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.newLine();
5164444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.flush();
5174444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
5184444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            // The response is a length prefixed stream of ASCII bytes.
5194444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            int numBytes = inputStream.readInt();
5204444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            byte[] bytes = new byte[numBytes];
5214444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            inputStream.readFully(bytes);
5224444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
5234444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return new String(bytes, StandardCharsets.US_ASCII);
5244444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        } catch (IOException ioe) {
5254444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            throw new ZygoteStartFailedEx(ioe);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends an argument list to the zygote process, which starts a new child
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and returns the child's pid. Please note: the present implementation
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * replaces newlines in the argument list with spaces.
5334444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     *
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ZygoteStartFailedEx if process start failed for any reason
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5364444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static ProcessStartResult zygoteSendArgsAndGetResult(
5374444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            ZygoteState zygoteState, ArrayList<String> args)
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ZygoteStartFailedEx {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * See com.android.internal.os.ZygoteInit.readArgumentList()
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Presently the wire format to the zygote process is:
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * a) a count of arguments (argc, in essence)
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * b) a number of newline-separated argument strings equal to count
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * After the zygote process reads these it will write the pid of
5473f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown             * the child or -1 on failure, followed by boolean to
5483f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown             * indicate whether a wrapper process was used.
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
5504444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            final BufferedWriter writer = zygoteState.writer;
5514444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            final DataInputStream inputStream = zygoteState.inputStream;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5534444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.write(Integer.toString(args.size()));
5544444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.newLine();
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sz = args.size();
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < sz; i++) {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String arg = args.get(i);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (arg.indexOf('\n') >= 0) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new ZygoteStartFailedEx(
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "embedded newlines not allowed");
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5634444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                writer.write(arg);
5644444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                writer.newLine();
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5674444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.flush();
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Should there be a timeout on this?
5703f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            ProcessStartResult result = new ProcessStartResult();
5714444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            result.pid = inputStream.readInt();
5723f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            if (result.pid < 0) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ZygoteStartFailedEx("fork() failed");
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5754444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            result.usingWrapper = inputStream.readBoolean();
5763f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            return result;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException ex) {
5784444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            zygoteState.close();
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ZygoteStartFailedEx(ex);
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts a new process via the zygote mechanism.
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param processClass Class name whose static main() to run
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param niceName 'nice' process name to appear in ps
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uid a POSIX uid that the new process should setuid() to
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gid a POSIX gid that the new process shuold setgid() to
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gids null-ok; a list of supplementary group IDs that the
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new process should setgroup() to.
592e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param debugFlags Additional flags.
593e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param targetSdkVersion The target SDK version for the app.
594bd19b9ee305c11d8aa3cbb105bf2d3a6b06389b5Stephen Smalley     * @param seInfo null-ok SELinux information for the new process.
5954444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * @param abi the ABI the process should use.
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param extraArgs Additional arguments to supply to the zygote process.
5973f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ZygoteStartFailedEx if process start failed for any reason
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6003f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    private static ProcessStartResult startViaZygote(final String processClass,
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final int uid, final int gid,
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final int[] gids,
6045b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
6055b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
60683d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
6074444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                                  String abi,
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  String[] extraArgs)
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  throws ZygoteStartFailedEx {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(Process.class) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<String> argsForZygote = new ArrayList<String>();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // --runtime-init, --setuid=, --setgid=,
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // and --setgroups= must go first
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--runtime-init");
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--setuid=" + uid);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--setgid=" + gid);
618ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes            if ((debugFlags & Zygote.DEBUG_ENABLE_JNI_LOGGING) != 0) {
619ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes                argsForZygote.add("--enable-jni-logging");
620ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes            }
62123085b781e145ed684e7270af1d5ced6800b8effBen Cheng            if ((debugFlags & Zygote.DEBUG_ENABLE_SAFEMODE) != 0) {
62223085b781e145ed684e7270af1d5ced6800b8effBen Cheng                argsForZygote.add("--enable-safemode");
62323085b781e145ed684e7270af1d5ced6800b8effBen Cheng            }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_DEBUGGER) != 0) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-debugger");
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_CHECKJNI) != 0) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-checkjni");
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-assert");
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6332bca868361b41ff6a8228824cbecadc4c5deb44eJeff Sharkey            if (mountExternal == Zygote.MOUNT_EXTERNAL_MULTIUSER) {
6345b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                argsForZygote.add("--mount-external-multiuser");
635e217ee4d7a8223289a1af7363627c69956c46d41Jeff Sharkey            } else if (mountExternal == Zygote.MOUNT_EXTERNAL_MULTIUSER_ALL) {
636e217ee4d7a8223289a1af7363627c69956c46d41Jeff Sharkey                argsForZygote.add("--mount-external-multiuser-all");
6375b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey            }
638e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes            argsForZygote.add("--target-sdk-version=" + targetSdkVersion);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //TODO optionally enable debuger
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //argsForZygote.add("--enable-debugger");
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // --setgroups is a comma-separated list
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gids != null && gids.length > 0) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                StringBuilder sb = new StringBuilder();
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append("--setgroups=");
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sz = gids.length;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < sz; i++) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (i != 0) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(',');
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(gids[i]);
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add(sb.toString());
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (niceName != null) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--nice-name=" + niceName);
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66383d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley            if (seInfo != null) {
66483d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                argsForZygote.add("--seinfo=" + seInfo);
66583d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley            }
66683d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add(processClass);
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (extraArgs != null) {
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (String arg : extraArgs) {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    argsForZygote.add(arg);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6754444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6784444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
6794444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    /**
6804444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * Returns the number of times we attempt a connection to the zygote. We
6814444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * sleep for {@link #ZYGOTE_RETRY_MILLIS} milliseconds between each try.
6824444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     *
6834444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * This could probably be removed, see TODO in {@code ZygoteState#connect}.
6844444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     */
6854444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static int getNumTries(ZygoteState state) {
6864444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // Retry 10 times for the first connection to each zygote.
6874444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (state == null) {
6884444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return 11;
6894444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
6904444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
6914444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // This means the connection has already been established, but subsequently
6924444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // closed, possibly due to an IOException. We retry just once if that's the
6934444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // case.
6944444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        return 1;
6954444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    }
6964444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
6974444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    /**
6984444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * Tries to open socket to Zygote process if not already open. If
6994444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * already open, does nothing.  May block and retry.
7004444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     */
7014444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static ZygoteState openZygoteSocketIfNeeded(String abi) throws ZygoteStartFailedEx {
7024444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (primaryZygoteState == null || primaryZygoteState.isClosed()) {
7034444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            primaryZygoteState = ZygoteState.connect(ZYGOTE_SOCKET, getNumTries(primaryZygoteState));
7044444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7054444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7064444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (primaryZygoteState.matches(abi)) {
7074444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return primaryZygoteState;
7084444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7094444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7104444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // The primary zygote didn't match. Try the secondary.
7114444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (secondaryZygoteState == null || secondaryZygoteState.isClosed()) {
7124444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            secondaryZygoteState = ZygoteState.connect(SECONDARY_ZYGOTE_SOCKET,
7134444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    getNumTries(secondaryZygoteState));
7144444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7154444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7164444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (secondaryZygoteState.matches(abi)) {
7174444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return secondaryZygoteState;
7184444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7194444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7204444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        throw new ZygoteStartFailedEx("Unsupported zygote ABI: " + abi);
7214444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    }
7224444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns elapsed milliseconds of the time this process has run.
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return  Returns the number of milliseconds this process has return.
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getElapsedCpuTime();
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of this process, which can be used with
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #killProcess} and {@link #sendSignal}.
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
733406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    public static final int myPid() {
734406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao        return Libcore.os.getpid();
735406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
73880b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     * Returns the identifier of this process' parent.
73980b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     * @hide
74080b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     */
7412a805f930463ece57bc0d0fd8dee7f5d50681b22Elliott Hughes    public static final int myPpid() {
7422a805f930463ece57bc0d0fd8dee7f5d50681b22Elliott Hughes        return Libcore.os.getppid();
7432a805f930463ece57bc0d0fd8dee7f5d50681b22Elliott Hughes    }
74480b12fcaaec458377d966803c3a61504f0897ea1Romain Guy
74580b12fcaaec458377d966803c3a61504f0897ea1Romain Guy    /**
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of the calling thread, which be used with
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}.
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7496d4b1e24aef5b74b40de4d8f6e63c21874ce8e3aElliott Hughes    public static final int myTid() {
7506d4b1e24aef5b74b40de4d8f6e63c21874ce8e3aElliott Hughes        return Libcore.os.gettid();
7516d4b1e24aef5b74b40de4d8f6e63c21874ce8e3aElliott Hughes    }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * Returns the identifier of this process's uid.  This is the kernel uid
7557d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * that the process is running under, which is the identity of its
7567d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * app-specific sandbox.  It is different from {@link #myUserHandle} in that
7577d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * a uid identifies a specific app sandbox in a specific user.
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
759406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    public static final int myUid() {
760406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao        return Libcore.os.getuid();
761406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76479af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn     * Returns this process's user handle.  This is the
7657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * user the process is running under.  It is distinct from
7667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * {@link #myUid()} in that a particular user will have multiple
7677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * distinct apps running under it each with their own uid.
7687d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     */
76979af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public static final UserHandle myUserHandle() {
77079af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn        return new UserHandle(UserHandle.getUserId(myUid()));
7717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
7727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
7737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    /**
774a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Returns whether the current process is in an isolated sandbox.
775a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
776a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
777a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final boolean isIsolated() {
778f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        int uid = UserHandle.getAppId(myUid());
779a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn        return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID;
780a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    }
781a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
782a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the UID assigned to a particular user name, or -1 if there is
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a uid.
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getUidForName(String name);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the GID assigned to a particular user name, or -1 if there is
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a gid.
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getGidForName(String name);
795819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
796819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    /**
797819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * Returns a uid for a currently running process.
798819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @param pid the process id
799819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @return the uid of the process, or -1 if the process is not running.
800819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @hide pending API council review
801819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     */
802819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public static final int getUidForPid(int pid) {
803819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        String[] procStatusLabels = { "Uid:" };
804819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        long[] procStatusValues = new long[1];
805819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        procStatusValues[0] = -1;
806819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
807819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        return (int) procStatusValues[0];
808819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    }
809819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
811ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * Returns the parent process id for a currently running process.
812ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @param pid the process id
813ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @return the parent process id of the process, or -1 if the process is not running.
814ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @hide
815ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     */
816ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    public static final int getParentPid(int pid) {
817ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        String[] procStatusLabels = { "PPid:" };
818ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        long[] procStatusValues = new long[1];
819ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        procStatusValues[0] = -1;
820ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
821ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        return (int) procStatusValues[0];
822ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    }
823ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown
824ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    /**
82507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Returns the thread group leader id for a currently running thread.
82607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @param tid the thread id
82707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @return the thread group leader id of the thread, or -1 if the thread is not running.
82807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     *         This is same as what getpid(2) would return if called by tid.
82907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
83007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     */
83107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int getThreadGroupLeader(int tid) {
83207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        String[] procStatusLabels = { "Tgid:" };
83307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        long[] procStatusValues = new long[1];
83407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        procStatusValues[0] = -1;
83507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        Process.readProcLines("/proc/" + tid + "/status", procStatusLabels, procStatusValues);
83607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        return (int) procStatusValues[0];
83707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    }
83807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
83907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of a thread, based on Linux priorities.
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int tid, int priority)
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
854e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
855e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
856160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * Call with 'false' to cause future calls to {@link #setThreadPriority(int)} to
857160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * throw an exception if passed a background-level thread priority.  This is only
858160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * effective if the JNI layer is built with GUARD_THREAD_PRIORITY defined to 1.
859160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     *
860160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * @hide
861160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     */
862160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    public static final native void setCanSelfBackground(boolean backgroundOk);
863160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate
864160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    /**
865e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * Sets the scheduling group for a thread.
866e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
867f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param tid The identifier of the thread to change.
868f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this thread from THREAD_GROUP_*.
869e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     *
870e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
871e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * <var>tid</var> does not exist.
872e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws SecurityException Throws SecurityException if your process does
873e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * not have permission to modify the given thread, or to use the given
874e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * priority.
875f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * If the thread is a thread group leader, that is it's gettid() == getpid(),
876f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * then the other threads in the same thread group are _not_ affected.
877e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
878e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    public static final native void setThreadGroup(int tid, int group)
879e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat            throws IllegalArgumentException, SecurityException;
880f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
8813e458241d9930465a20a861ecb42744355d48e48San Mehat    /**
8823e458241d9930465a20a861ecb42744355d48e48San Mehat     * Sets the scheduling group for a process and all child threads
8833e458241d9930465a20a861ecb42744355d48e48San Mehat     * @hide
884f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param pid The identifier of the process to change.
885f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this process from THREAD_GROUP_*.
8863e458241d9930465a20a861ecb42744355d48e48San Mehat     *
8873e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
8883e458241d9930465a20a861ecb42744355d48e48San Mehat     * <var>tid</var> does not exist.
8893e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws SecurityException Throws SecurityException if your process does
8903e458241d9930465a20a861ecb42744355d48e48San Mehat     * not have permission to modify the given thread, or to use the given
8913e458241d9930465a20a861ecb42744355d48e48San Mehat     * priority.
892f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     *
893f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_DEFAULT means to move all non-background priority
894f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads to the foreground scheduling group, but to leave background
895f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * priority threads alone.  group == THREAD_GROUP_BG_NONINTERACTIVE moves all
896f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads, regardless of priority, to the background scheduling group.
897f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_FOREGROUND is not allowed.
8983e458241d9930465a20a861ecb42744355d48e48San Mehat     */
8993e458241d9930465a20a861ecb42744355d48e48San Mehat    public static final native void setProcessGroup(int pid, int group)
9003e458241d9930465a20a861ecb42744355d48e48San Mehat            throws IllegalArgumentException, SecurityException;
9019e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey
9029e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey    /**
9039e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     * Return the scheduling group of requested process.
9049e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     *
9059e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     * @hide
9069e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     */
9079e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey    public static final native int getProcessGroup(int pid)
9089e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey            throws IllegalArgumentException, SecurityException;
9099e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of the calling thread, based on Linux priorities.  See
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)} for more information.
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setThreadPriority(int, int)
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int priority)
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current priority of a thread, based on Linux priorities.
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the current priority, as a Linux priority level,
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from -20 for highest scheduling priority to 19 for lowest scheduling
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getThreadPriority(int tid)
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9446793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Set the scheduling policy and priority of a thread, based on Linux.
9456793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
9466793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param tid The identifier of the thread/process to change.
9476793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param policy A Linux scheduling policy such as SCHED_OTHER etc.
9486793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param priority A Linux priority level in a range appropriate for the given policy.
9496793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
9506793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws IllegalArgumentException Throws IllegalArgumentException if
9516793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy.
9526793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws SecurityException Throws SecurityException if your process does
9536793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * not have permission to modify the given thread, or to use the given
9546793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * scheduling policy or priority.
9556793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
9566793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * {@hide}
9576793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
9586793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final native void setThreadScheduler(int tid, int policy, int priority)
9596793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten            throws IllegalArgumentException;
9606793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
9616793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determine whether the current environment supports multiple processes.
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the system can run in multiple processes, else
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * false if everything is running in a single process.
96610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     *
96710e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     * @deprecated This method always returns true.  Do not use.
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
96910e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    @Deprecated
97010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    public static final boolean supportsProcesses() {
97110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        return true;
97210e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the out-of-memory badness adjustment for a process.
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The process identifier to set.
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param amt Adjustment value -- linux allows -16 to +15.
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the underlying system supports this
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         feature, else false.
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean setOomAdj(int pid, int amt);
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9885534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * Adjust the swappiness level for a process.
9895534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
9905534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @param pid The process identifier to set.
9915534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @param is_increased Whether swappiness should be increased or default.
9925534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
9935534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @return Returns true if the underlying system supports this
9945534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *         feature, else false.
9955534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
9965534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * {@hide}
9975534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     */
9985534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand    public static final native boolean setSwappiness(int pid, boolean is_increased);
9995534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand
10005534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand    /**
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change this process's argv[0] parameter.  This can be useful to show
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * more descriptive information in things like the 'ps' command.
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The new name of this process.
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setArgV0(String text);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Kill the process with the given PID.
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that, though this API allows us to request to
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * kill any process based on its PID, the kernel will
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still impose standard restrictions on which PIDs you
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are actually able to kill.  Typically this means only
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the process running the caller's packages/application
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and any additional processes created by that app; packages
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sharing a common UID will also be able to kill each
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other's processes.
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final void killProcess(int pid) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendSignal(pid, SIGNAL_KILL);
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setUid(int uid);
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setGid(int uid);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send a signal to the given process.
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The pid of the target process.
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param signal The signal to send.
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void sendSignal(int pid, int signal);
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
1040906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
1041906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
1042906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
1043906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
1044906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
1045906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final void killProcessQuiet(int pid) {
1046906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn        sendSignalQuiet(pid, SIGNAL_KILL);
1047906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    }
1048906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
1049906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
1050906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
1051906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
1052906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
1053906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
1054906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
1055906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final native void sendSignalQuiet(int pid, int signal);
1056906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10580bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen    public static final native long getFreeMemory();
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
106159325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    public static final native long getTotalMemory();
106259325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn
106359325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    /** @hide */
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void readProcLines(String path,
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] reqFields, long[] outSizes);
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int[] getPids(String path, int[] lastArray);
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_TERM_MASK = 0xff;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_ZERO_TERM = 0;
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_SPACE_TERM = (int)' ';
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
1077c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final int PROC_TAB_TERM = (int)'\t';
1078c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_COMBINE = 0x100;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_PARENS = 0x200;
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
108313ac041b9f21043bc7c848a743be618bfd7a67e9Dianne Hackborn    public static final int PROC_QUOTES = 0x400;
108413ac041b9f21043bc7c848a743be618bfd7a67e9Dianne Hackborn    /** @hide */
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_STRING = 0x1000;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_LONG = 0x2000;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_FLOAT = 0x4000;
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean readProcFile(String file, int[] format,
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outStrings, long[] outLongs, float[] outFloats);
1094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
1096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final native boolean parseProcLine(byte[] buffer, int startIndex,
1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            int endIndex, int[] format, String[] outStrings, long[] outLongs, float[] outFloats);
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    /** @hide */
1100f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    public static final native int[] getPidsForCommands(String[] cmds);
1101f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the total Pss value for a given process, in bytes.
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid the process to the Pss for
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the total Pss value for the given process in bytes,
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  or -1 if the value cannot be determined
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getPss(int pid);
11113f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
11123f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    /**
11133f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * Specifies the outcome of having started a process.
11143f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @hide
11153f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     */
11163f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final class ProcessStartResult {
11173f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
11183f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * The PID of the newly started process.
11193f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * Always >= 0.  (If the start failed, an exception will have been thrown instead.)
11203f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
11213f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public int pid;
11223f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
11233f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
11243f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * True if the process was started with a wrapper attached.
11253f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
11263f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public boolean usingWrapper;
11273f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1129