Process.java revision 4444dcd0adc7e035cca030b90ed91f0cff9a772b
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.
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param zygoteArgs Additional arguments to supply to the zygote process.
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4713f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws RuntimeException on fatal start failure
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4763f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final ProcessStartResult start(final String processClass,
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  int uid, int gid, int[] gids,
4795b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
4805b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
48183d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
48210e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                                  String[] zygoteArgs) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
48410e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            return startViaZygote(processClass, niceName, uid, gid, gids,
4854444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    debugFlags, mountExternal, targetSdkVersion, seInfo,
4864444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    null, /* zygoteAbi TODO: Replace this with the real ABI */
4874444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    zygoteArgs);
48810e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        } catch (ZygoteStartFailedEx ex) {
48910e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            Log.e(LOG_TAG,
49010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                    "Starting VM process through Zygote failed");
49110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            throw new RuntimeException(
49210e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                    "Starting VM process through Zygote failed", ex);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** retry interval for opening a zygote socket */
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ZYGOTE_RETRY_MILLIS = 500;
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5004444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * Queries the zygote for the list of ABIS it supports.
5014444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     *
5024444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * @throws ZygoteStartFailedEx if the query failed.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5044444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static String getAbiList(BufferedWriter writer, DataInputStream inputStream)
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ZygoteStartFailedEx {
5064444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        try {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5084444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            // Each query starts with the argument count (1 in this case)
5094444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.write("1");
5104444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            // ... followed by a new-line.
5114444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.newLine();
5124444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            // ... followed by our only argument.
5134444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.write("--query-abi-list");
5144444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.newLine();
5154444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.flush();
5164444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
5174444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            // The response is a length prefixed stream of ASCII bytes.
5184444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            int numBytes = inputStream.readInt();
5194444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            byte[] bytes = new byte[numBytes];
5204444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            inputStream.readFully(bytes);
5214444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
5224444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return new String(bytes, StandardCharsets.US_ASCII);
5234444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        } catch (IOException ioe) {
5244444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            throw new ZygoteStartFailedEx(ioe);
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends an argument list to the zygote process, which starts a new child
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and returns the child's pid. Please note: the present implementation
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * replaces newlines in the argument list with spaces.
5324444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     *
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ZygoteStartFailedEx if process start failed for any reason
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5354444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static ProcessStartResult zygoteSendArgsAndGetResult(
5364444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            ZygoteState zygoteState, ArrayList<String> args)
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ZygoteStartFailedEx {
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * See com.android.internal.os.ZygoteInit.readArgumentList()
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Presently the wire format to the zygote process is:
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * a) a count of arguments (argc, in essence)
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * b) a number of newline-separated argument strings equal to count
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * After the zygote process reads these it will write the pid of
5463f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown             * the child or -1 on failure, followed by boolean to
5473f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown             * indicate whether a wrapper process was used.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
5494444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            final BufferedWriter writer = zygoteState.writer;
5504444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            final DataInputStream inputStream = zygoteState.inputStream;
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5524444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.write(Integer.toString(args.size()));
5534444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.newLine();
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sz = args.size();
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < sz; i++) {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String arg = args.get(i);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (arg.indexOf('\n') >= 0) {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new ZygoteStartFailedEx(
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "embedded newlines not allowed");
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5624444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                writer.write(arg);
5634444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                writer.newLine();
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5664444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            writer.flush();
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Should there be a timeout on this?
5693f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            ProcessStartResult result = new ProcessStartResult();
5704444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            result.pid = inputStream.readInt();
5713f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            if (result.pid < 0) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ZygoteStartFailedEx("fork() failed");
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5744444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            result.usingWrapper = inputStream.readBoolean();
5753f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            return result;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException ex) {
5774444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            zygoteState.close();
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ZygoteStartFailedEx(ex);
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts a new process via the zygote mechanism.
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param processClass Class name whose static main() to run
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param niceName 'nice' process name to appear in ps
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uid a POSIX uid that the new process should setuid() to
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gid a POSIX gid that the new process shuold setgid() to
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gids null-ok; a list of supplementary group IDs that the
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new process should setgroup() to.
591e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param debugFlags Additional flags.
592e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param targetSdkVersion The target SDK version for the app.
593bd19b9ee305c11d8aa3cbb105bf2d3a6b06389b5Stephen Smalley     * @param seInfo null-ok SELinux information for the new process.
5944444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * @param abi the ABI the process should use.
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param extraArgs Additional arguments to supply to the zygote process.
5963f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ZygoteStartFailedEx if process start failed for any reason
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5993f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    private static ProcessStartResult startViaZygote(final String processClass,
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final int uid, final int gid,
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final int[] gids,
6035b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
6045b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
60583d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
6064444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                                  String abi,
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  String[] extraArgs)
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  throws ZygoteStartFailedEx {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(Process.class) {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<String> argsForZygote = new ArrayList<String>();
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // --runtime-init, --setuid=, --setgid=,
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // and --setgroups= must go first
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--runtime-init");
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--setuid=" + uid);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--setgid=" + gid);
617ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes            if ((debugFlags & Zygote.DEBUG_ENABLE_JNI_LOGGING) != 0) {
618ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes                argsForZygote.add("--enable-jni-logging");
619ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes            }
62023085b781e145ed684e7270af1d5ced6800b8effBen Cheng            if ((debugFlags & Zygote.DEBUG_ENABLE_SAFEMODE) != 0) {
62123085b781e145ed684e7270af1d5ced6800b8effBen Cheng                argsForZygote.add("--enable-safemode");
62223085b781e145ed684e7270af1d5ced6800b8effBen Cheng            }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_DEBUGGER) != 0) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-debugger");
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_CHECKJNI) != 0) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-checkjni");
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-assert");
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6322bca868361b41ff6a8228824cbecadc4c5deb44eJeff Sharkey            if (mountExternal == Zygote.MOUNT_EXTERNAL_MULTIUSER) {
6335b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                argsForZygote.add("--mount-external-multiuser");
634e217ee4d7a8223289a1af7363627c69956c46d41Jeff Sharkey            } else if (mountExternal == Zygote.MOUNT_EXTERNAL_MULTIUSER_ALL) {
635e217ee4d7a8223289a1af7363627c69956c46d41Jeff Sharkey                argsForZygote.add("--mount-external-multiuser-all");
6365b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey            }
637e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes            argsForZygote.add("--target-sdk-version=" + targetSdkVersion);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //TODO optionally enable debuger
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //argsForZygote.add("--enable-debugger");
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // --setgroups is a comma-separated list
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gids != null && gids.length > 0) {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                StringBuilder sb = new StringBuilder();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append("--setgroups=");
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sz = gids.length;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < sz; i++) {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (i != 0) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(',');
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(gids[i]);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add(sb.toString());
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (niceName != null) {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--nice-name=" + niceName);
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66283d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley            if (seInfo != null) {
66383d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                argsForZygote.add("--seinfo=" + seInfo);
66483d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley            }
66583d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add(processClass);
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (extraArgs != null) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (String arg : extraArgs) {
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    argsForZygote.add(arg);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6744444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6774444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
6784444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    /**
6794444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * Returns the number of times we attempt a connection to the zygote. We
6804444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * sleep for {@link #ZYGOTE_RETRY_MILLIS} milliseconds between each try.
6814444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     *
6824444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * This could probably be removed, see TODO in {@code ZygoteState#connect}.
6834444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     */
6844444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static int getNumTries(ZygoteState state) {
6854444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // Retry 10 times for the first connection to each zygote.
6864444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (state == null) {
6874444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return 11;
6884444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
6894444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
6904444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // This means the connection has already been established, but subsequently
6914444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // closed, possibly due to an IOException. We retry just once if that's the
6924444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // case.
6934444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        return 1;
6944444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    }
6954444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
6964444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    /**
6974444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * Tries to open socket to Zygote process if not already open. If
6984444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     * already open, does nothing.  May block and retry.
6994444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     */
7004444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    private static ZygoteState openZygoteSocketIfNeeded(String abi) throws ZygoteStartFailedEx {
7014444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (primaryZygoteState == null || primaryZygoteState.isClosed()) {
7024444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            primaryZygoteState = ZygoteState.connect(ZYGOTE_SOCKET, getNumTries(primaryZygoteState));
7034444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7044444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7054444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // TODO: Revert this temporary change. This is required to test
7064444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // and submit this change ahead of the package manager changes
7074444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // that supply this abi.
7084444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (abi == null) {
7094444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return primaryZygoteState;
7104444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7114444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7124444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (primaryZygoteState.matches(abi)) {
7134444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return primaryZygoteState;
7144444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7154444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7164444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        // The primary zygote didn't match. Try the secondary.
7174444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (secondaryZygoteState == null || secondaryZygoteState.isClosed()) {
7184444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            secondaryZygoteState = ZygoteState.connect(SECONDARY_ZYGOTE_SOCKET,
7194444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    getNumTries(secondaryZygoteState));
7204444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7214444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7224444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        if (secondaryZygoteState.matches(abi)) {
7234444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath            return secondaryZygoteState;
7244444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        }
7254444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7264444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath        throw new ZygoteStartFailedEx("Unsupported zygote ABI: " + abi);
7274444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    }
7284444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns elapsed milliseconds of the time this process has run.
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return  Returns the number of milliseconds this process has return.
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getElapsedCpuTime();
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of this process, which can be used with
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #killProcess} and {@link #sendSignal}.
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    public static final int myPid() {
740406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao        return Libcore.os.getpid();
741406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
74480b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     * Returns the identifier of this process' parent.
74580b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     * @hide
74680b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     */
7472a805f930463ece57bc0d0fd8dee7f5d50681b22Elliott Hughes    public static final int myPpid() {
7482a805f930463ece57bc0d0fd8dee7f5d50681b22Elliott Hughes        return Libcore.os.getppid();
7492a805f930463ece57bc0d0fd8dee7f5d50681b22Elliott Hughes    }
75080b12fcaaec458377d966803c3a61504f0897ea1Romain Guy
75180b12fcaaec458377d966803c3a61504f0897ea1Romain Guy    /**
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of the calling thread, which be used with
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}.
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7556d4b1e24aef5b74b40de4d8f6e63c21874ce8e3aElliott Hughes    public static final int myTid() {
7566d4b1e24aef5b74b40de4d8f6e63c21874ce8e3aElliott Hughes        return Libcore.os.gettid();
7576d4b1e24aef5b74b40de4d8f6e63c21874ce8e3aElliott Hughes    }
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7607d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * Returns the identifier of this process's uid.  This is the kernel uid
7617d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * that the process is running under, which is the identity of its
7627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * app-specific sandbox.  It is different from {@link #myUserHandle} in that
7637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * a uid identifies a specific app sandbox in a specific user.
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
765406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    public static final int myUid() {
766406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao        return Libcore.os.getuid();
767406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
77079af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn     * Returns this process's user handle.  This is the
7717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * user the process is running under.  It is distinct from
7727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * {@link #myUid()} in that a particular user will have multiple
7737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * distinct apps running under it each with their own uid.
7747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     */
77579af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public static final UserHandle myUserHandle() {
77679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn        return new UserHandle(UserHandle.getUserId(myUid()));
7777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
7787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
7797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    /**
780a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Returns whether the current process is in an isolated sandbox.
781a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
782a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
783a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final boolean isIsolated() {
784f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        int uid = UserHandle.getAppId(myUid());
785a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn        return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID;
786a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    }
787a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
788a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the UID assigned to a particular user name, or -1 if there is
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a uid.
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getUidForName(String name);
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the GID assigned to a particular user name, or -1 if there is
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a gid.
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getGidForName(String name);
801819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
802819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    /**
803819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * Returns a uid for a currently running process.
804819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @param pid the process id
805819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @return the uid of the process, or -1 if the process is not running.
806819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @hide pending API council review
807819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     */
808819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public static final int getUidForPid(int pid) {
809819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        String[] procStatusLabels = { "Uid:" };
810819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        long[] procStatusValues = new long[1];
811819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        procStatusValues[0] = -1;
812819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
813819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        return (int) procStatusValues[0];
814819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    }
815819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
817ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * Returns the parent process id for a currently running process.
818ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @param pid the process id
819ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @return the parent process id of the process, or -1 if the process is not running.
820ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @hide
821ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     */
822ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    public static final int getParentPid(int pid) {
823ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        String[] procStatusLabels = { "PPid:" };
824ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        long[] procStatusValues = new long[1];
825ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        procStatusValues[0] = -1;
826ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
827ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        return (int) procStatusValues[0];
828ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    }
829ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown
830ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    /**
83107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Returns the thread group leader id for a currently running thread.
83207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @param tid the thread id
83307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @return the thread group leader id of the thread, or -1 if the thread is not running.
83407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     *         This is same as what getpid(2) would return if called by tid.
83507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
83607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     */
83707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int getThreadGroupLeader(int tid) {
83807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        String[] procStatusLabels = { "Tgid:" };
83907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        long[] procStatusValues = new long[1];
84007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        procStatusValues[0] = -1;
84107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        Process.readProcLines("/proc/" + tid + "/status", procStatusLabels, procStatusValues);
84207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        return (int) procStatusValues[0];
84307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    }
84407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
84507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of a thread, based on Linux priorities.
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int tid, int priority)
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
860e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
861e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
862160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * Call with 'false' to cause future calls to {@link #setThreadPriority(int)} to
863160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * throw an exception if passed a background-level thread priority.  This is only
864160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * effective if the JNI layer is built with GUARD_THREAD_PRIORITY defined to 1.
865160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     *
866160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * @hide
867160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     */
868160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    public static final native void setCanSelfBackground(boolean backgroundOk);
869160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate
870160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    /**
871e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * Sets the scheduling group for a thread.
872e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
873f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param tid The identifier of the thread to change.
874f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this thread from THREAD_GROUP_*.
875e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     *
876e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
877e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * <var>tid</var> does not exist.
878e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws SecurityException Throws SecurityException if your process does
879e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * not have permission to modify the given thread, or to use the given
880e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * priority.
881f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * If the thread is a thread group leader, that is it's gettid() == getpid(),
882f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * then the other threads in the same thread group are _not_ affected.
883e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
884e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    public static final native void setThreadGroup(int tid, int group)
885e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat            throws IllegalArgumentException, SecurityException;
886f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
8873e458241d9930465a20a861ecb42744355d48e48San Mehat    /**
8883e458241d9930465a20a861ecb42744355d48e48San Mehat     * Sets the scheduling group for a process and all child threads
8893e458241d9930465a20a861ecb42744355d48e48San Mehat     * @hide
890f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param pid The identifier of the process to change.
891f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this process from THREAD_GROUP_*.
8923e458241d9930465a20a861ecb42744355d48e48San Mehat     *
8933e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
8943e458241d9930465a20a861ecb42744355d48e48San Mehat     * <var>tid</var> does not exist.
8953e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws SecurityException Throws SecurityException if your process does
8963e458241d9930465a20a861ecb42744355d48e48San Mehat     * not have permission to modify the given thread, or to use the given
8973e458241d9930465a20a861ecb42744355d48e48San Mehat     * priority.
898f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     *
899f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_DEFAULT means to move all non-background priority
900f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads to the foreground scheduling group, but to leave background
901f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * priority threads alone.  group == THREAD_GROUP_BG_NONINTERACTIVE moves all
902f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads, regardless of priority, to the background scheduling group.
903f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_FOREGROUND is not allowed.
9043e458241d9930465a20a861ecb42744355d48e48San Mehat     */
9053e458241d9930465a20a861ecb42744355d48e48San Mehat    public static final native void setProcessGroup(int pid, int group)
9063e458241d9930465a20a861ecb42744355d48e48San Mehat            throws IllegalArgumentException, SecurityException;
9079e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey
9089e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey    /**
9099e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     * Return the scheduling group of requested process.
9109e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     *
9119e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     * @hide
9129e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     */
9139e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey    public static final native int getProcessGroup(int pid)
9149e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey            throws IllegalArgumentException, SecurityException;
9159e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of the calling thread, based on Linux priorities.  See
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)} for more information.
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setThreadPriority(int, int)
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int priority)
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current priority of a thread, based on Linux priorities.
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the current priority, as a Linux priority level,
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from -20 for highest scheduling priority to 19 for lowest scheduling
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getThreadPriority(int tid)
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException;
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9506793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Set the scheduling policy and priority of a thread, based on Linux.
9516793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
9526793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param tid The identifier of the thread/process to change.
9536793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param policy A Linux scheduling policy such as SCHED_OTHER etc.
9546793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param priority A Linux priority level in a range appropriate for the given policy.
9556793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
9566793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws IllegalArgumentException Throws IllegalArgumentException if
9576793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy.
9586793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws SecurityException Throws SecurityException if your process does
9596793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * not have permission to modify the given thread, or to use the given
9606793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * scheduling policy or priority.
9616793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
9626793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * {@hide}
9636793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
9646793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final native void setThreadScheduler(int tid, int policy, int priority)
9656793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten            throws IllegalArgumentException;
9666793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
9676793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determine whether the current environment supports multiple processes.
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the system can run in multiple processes, else
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * false if everything is running in a single process.
97210e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     *
97310e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     * @deprecated This method always returns true.  Do not use.
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
97510e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    @Deprecated
97610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    public static final boolean supportsProcesses() {
97710e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        return true;
97810e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the out-of-memory badness adjustment for a process.
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The process identifier to set.
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param amt Adjustment value -- linux allows -16 to +15.
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the underlying system supports this
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         feature, else false.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean setOomAdj(int pid, int amt);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9945534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * Adjust the swappiness level for a process.
9955534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
9965534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @param pid The process identifier to set.
9975534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @param is_increased Whether swappiness should be increased or default.
9985534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
9995534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @return Returns true if the underlying system supports this
10005534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *         feature, else false.
10015534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
10025534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * {@hide}
10035534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     */
10045534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand    public static final native boolean setSwappiness(int pid, boolean is_increased);
10055534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand
10065534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand    /**
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change this process's argv[0] parameter.  This can be useful to show
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * more descriptive information in things like the 'ps' command.
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The new name of this process.
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setArgV0(String text);
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Kill the process with the given PID.
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that, though this API allows us to request to
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * kill any process based on its PID, the kernel will
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still impose standard restrictions on which PIDs you
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are actually able to kill.  Typically this means only
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the process running the caller's packages/application
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and any additional processes created by that app; packages
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sharing a common UID will also be able to kill each
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other's processes.
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final void killProcess(int pid) {
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendSignal(pid, SIGNAL_KILL);
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setUid(int uid);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setGid(int uid);
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send a signal to the given process.
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The pid of the target process.
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param signal The signal to send.
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void sendSignal(int pid, int signal);
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1045906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
1046906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
1047906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
1048906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
1049906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
1050906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
1051906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final void killProcessQuiet(int pid) {
1052906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn        sendSignalQuiet(pid, SIGNAL_KILL);
1053906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    }
1054906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
1055906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
1056906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
1057906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
1058906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
1059906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
1060906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
1061906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final native void sendSignalQuiet(int pid, int signal);
1062906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10640bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen    public static final native long getFreeMemory();
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
106759325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    public static final native long getTotalMemory();
106859325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn
106959325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    /** @hide */
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void readProcLines(String path,
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] reqFields, long[] outSizes);
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int[] getPids(String path, int[] lastArray);
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_TERM_MASK = 0xff;
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_ZERO_TERM = 0;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_SPACE_TERM = (int)' ';
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
1083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final int PROC_TAB_TERM = (int)'\t';
1084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_COMBINE = 0x100;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_PARENS = 0x200;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
108913ac041b9f21043bc7c848a743be618bfd7a67e9Dianne Hackborn    public static final int PROC_QUOTES = 0x400;
109013ac041b9f21043bc7c848a743be618bfd7a67e9Dianne Hackborn    /** @hide */
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_STRING = 0x1000;
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_LONG = 0x2000;
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_FLOAT = 0x4000;
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean readProcFile(String file, int[] format,
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outStrings, long[] outLongs, float[] outFloats);
1100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1101c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
1102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final native boolean parseProcLine(byte[] buffer, int startIndex,
1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            int endIndex, int[] format, String[] outStrings, long[] outLongs, float[] outFloats);
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1105f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    /** @hide */
1106f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    public static final native int[] getPidsForCommands(String[] cmds);
1107f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the total Pss value for a given process, in bytes.
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid the process to the Pss for
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the total Pss value for the given process in bytes,
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  or -1 if the value cannot be determined
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getPss(int pid);
11173f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
11183f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    /**
11193f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * Specifies the outcome of having started a process.
11203f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @hide
11213f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     */
11223f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final class ProcessStartResult {
11233f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
11243f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * The PID of the newly started process.
11253f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * Always >= 0.  (If the start failed, an exception will have been thrown instead.)
11263f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
11273f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public int pid;
11283f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
11293f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
11303f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * True if the process was started with a wrapper attached.
11313f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
11323f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public boolean usingWrapper;
11333f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1135