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.LocalSocketAddress;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.LocalSocket;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport dalvik.system.Zygote;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.DataInputStream;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*package*/ class ZygoteStartFailedEx extends Exception {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Something prevented the zygote process startup from happening normally
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZygoteStartFailedEx() {};
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZygoteStartFailedEx(String s) {super(s);}
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZygoteStartFailedEx(Throwable cause) {super(cause);}
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tools for managing OS processes.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Process {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOG_TAG = "Process";
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ZYGOTE_SOCKET = "zygote";
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Name of a process for running the platform's media services.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String ANDROID_SHARED_MEDIA = "com.android.process.media";
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Name of the process that Google content providers can share.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String GOOGLE_SHARED_APP_CONTENT = "com.google.process.content";
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the UID/GID under which system code runs.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SYSTEM_UID = 1000;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the UID/GID under which the telephony code runs.
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PHONE_UID = 1001;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
71854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     * Defines the UID/GID for the user shell.
72854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     * @hide
73854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     */
74854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn    public static final int SHELL_UID = 2000;
75854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
76854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn    /**
77d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     * Defines the UID/GID for the log group.
78d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     * @hide
79d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     */
80d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood    public static final int LOG_UID = 1007;
81d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood
82d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood    /**
83d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     * Defines the UID/GID for the WIFI supplicant process.
84d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     * @hide
85d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     */
86d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    public static final int WIFI_UID = 1010;
87d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani
88d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    /**
898b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     * Defines the UID/GID for the mediaserver process.
908b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     * @hide
918b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     */
928b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten    public static final int MEDIA_UID = 1013;
938b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten
948b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten    /**
955294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     * Defines the UID/GID for the DRM process.
965294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     * @hide
975294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     */
985294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey    public static final int DRM_UID = 1019;
995294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey
1005294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey    /**
10158fd98accbff409601587b3357f2b3acf370f606Mike Lockwood     * Defines the GID for the group that allows write access to the SD card.
10258fd98accbff409601587b3357f2b3acf370f606Mike Lockwood     * @hide
10358fd98accbff409601587b3357f2b3acf370f606Mike Lockwood     */
10458fd98accbff409601587b3357f2b3acf370f606Mike Lockwood    public static final int SDCARD_RW_GID = 1015;
10558fd98accbff409601587b3357f2b3acf370f606Mike Lockwood
10658fd98accbff409601587b3357f2b3acf370f606Mike Lockwood    /**
10726993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     * Defines the UID/GID for the group that controls VPN services.
10826993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     * @hide
10926993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     */
11026993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root    public static final int VPN_UID = 1016;
11126993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root
11226993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root    /**
113cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     * Defines the UID/GID for the NFC service process.
114cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     * @hide
115cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     */
116a5cb9f42174a52afbeb7e33dab64282f52f8cedbNick Pelly    public static final int NFC_UID = 1027;
117cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly
118cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly    /**
1191abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     * Defines the UID/GID for the Bluetooth service process.
1201abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     * @hide
1211abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     */
1221abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh    public static final int BLUETOOTH_UID = 1002;
1231abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh
1241abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh    /**
125dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     * Defines the GID for the group that allows write access to the internal media storage.
126dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     * @hide
127dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     */
128dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood    public static final int MEDIA_RW_GID = 1023;
129dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood
130dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood    /**
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the start of a range of UIDs (and GIDs), going from this
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to applications.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FIRST_APPLICATION_UID = 10000;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Last of application-specific UIDs starting at
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #FIRST_APPLICATION_UID}.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn    public static final int LAST_APPLICATION_UID = 19999;
141a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
142a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
143a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * First uid used for fully isolated sandboxed processes (with no permissions of their own)
144a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
145a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
146a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final int FIRST_ISOLATED_UID = 99000;
147a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
148a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
149a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Last uid used for fully isolated sandboxed processes (with no permissions of their own)
150a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
151a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
152a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final int LAST_ISOLATED_UID = 99999;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
155e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * First gid for applications to share resources. Used when forward-locking
156e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * is enabled but all UserHandles need to be able to read the resources.
157e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * @hide
158e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     */
159e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    public static final int FIRST_SHARED_APPLICATION_GID = 50000;
160e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root
161e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    /**
162e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * Last gid for applications to share resources. Used when forward-locking
163e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * is enabled but all UserHandles need to be able to read the resources.
164e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * @hide
165e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     */
166e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    public static final int LAST_SHARED_APPLICATION_GID = 59999;
167e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root
168e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    /**
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines a secondary group id for access to the bluetooth hardware.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int BLUETOOTH_GID = 2000;
172e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of application threads.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_DEFAULT = 0;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***************************************
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ** Keep in sync with utils/threads.h **
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***************************************
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lowest available thread priority.  Only for those who really, really
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * don't want to run if anything else is happening.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_LOWEST = 19;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority background threads.  This gives your thread a slightly
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lower than normal priority, so that it will have less chance of impacting
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the responsiveness of the user interface.
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_BACKGROUND = 10;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of threads that are currently running a user interface
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the user is interacting with.  Applications can not normally
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority; the system will automatically adjust your
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application threads as the user moves through the UI.
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_FOREGROUND = -2;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of system display threads, involved in updating
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user interface.  Applications can not
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normally change to this priority.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_DISPLAY = -4;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of the most important display threads, for compositing
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the screen and retrieving input events.  Applications can not normally
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority.
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of audio threads.  Applications can not normally
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_AUDIO = -16;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of the most important audio threads.
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applications can not normally change to this priority.
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_URGENT_AUDIO = -19;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Minimum increment to make a priority more favorable.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Minimum increment to make a priority less favorable.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
265e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
2666793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Default scheduling policy
2676793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2686793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2696793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_OTHER = 0;
2706793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2716793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2726793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * First-In First-Out scheduling policy
2736793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2746793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2756793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_FIFO = 1;
2766793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2776793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2786793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Round-Robin scheduling policy
2796793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2806793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2816793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_RR = 2;
2826793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2836793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2846793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Batch scheduling policy
2856793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2866793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2876793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_BATCH = 3;
2886793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2896793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2906793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Idle scheduling policy
2916793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2926793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2936793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_IDLE = 5;
2946793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
295f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // Keep in sync with SP_* constants of enum type SchedPolicy
296f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // declared in system/core/include/cutils/sched_policy.h,
297f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // except THREAD_GROUP_DEFAULT does not correspond to any SP_* value.
298f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
2996793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
300f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Default thread group -
301f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * has meaning with setProcessGroup() only, cannot be used with setThreadGroup().
302f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * When used with setProcessGroup(), the group of each thread in the process
303f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * is conditionally changed based on that thread's current priority, as follows:
304f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads with priority numerically less than THREAD_PRIORITY_BACKGROUND
305f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * are moved to foreground thread group.  All other threads are left unchanged.
306e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
307e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
308f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    public static final int THREAD_GROUP_DEFAULT = -1;
309e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
310e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
311f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Background thread group - All threads in
312e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * this group are scheduled with a reduced share of the CPU.
313f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Value is same as constant SP_BACKGROUND of enum SchedPolicy.
314f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * FIXME rename to THREAD_GROUP_BACKGROUND.
315e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
316e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
317f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    public static final int THREAD_GROUP_BG_NONINTERACTIVE = 0;
318e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
319e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
320f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Foreground thread group - All threads in
321f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * this group are scheduled with a normal share of the CPU.
322f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Value is same as constant SP_FOREGROUND of enum SchedPolicy.
323f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Not used at this level.
324e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
325e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     **/
326f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    private static final int THREAD_GROUP_FOREGROUND = 1;
327e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
32807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
32907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * System thread group.
33007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
33107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
33207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_SYSTEM = 2;
33307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
33407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
33507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Application audio thread group.
33607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
33707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
33807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_AUDIO_APP = 3;
33907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
34007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
34107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * System audio thread group.
34207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
34307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
34407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_AUDIO_SYS = 4;
34507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_QUIT = 3;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_KILL = 9;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_USR1 = 10;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // State for communicating with zygote process
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static LocalSocket sZygoteSocket;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static DataInputStream sZygoteInputStream;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static BufferedWriter sZygoteWriter;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** true if previous zygote open failed */
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean sPreviousZygoteOpenFailed;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start a new process.
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If processes are enabled, a new process is created and the
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * static main() function of a <var>processClass</var> is executed there.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The process will continue running after this function returns.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If processes are not enabled, a new thread in the caller's
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process is created and main() of <var>processClass</var> called there.
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The niceName parameter, if not an empty string, is a custom name to
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * give to the process instead of using processClass.  This allows you to
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * make easily identifyable processes even if you are using the same base
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>processClass</var> to start them.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param processClass The class to use as the process's main entry
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     point.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param niceName A more readable name to use for the process.
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uid The user-id under which the process will run.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gid The group-id under which the process will run.
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gids Additional group-ids associated with the process.
380e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param debugFlags Additional flags.
381e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param targetSdkVersion The target SDK version for the app.
38283d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley     * @param seInfo null-ok SE Android information for the new process.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param zygoteArgs Additional arguments to supply to the zygote process.
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3853f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws RuntimeException on fatal start failure
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3903f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final ProcessStartResult start(final String processClass,
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  int uid, int gid, int[] gids,
3935b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
3945b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
39583d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
39610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                                  String[] zygoteArgs) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
39810e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            return startViaZygote(processClass, niceName, uid, gid, gids,
3995b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                    debugFlags, mountExternal, targetSdkVersion, seInfo, zygoteArgs);
40010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        } catch (ZygoteStartFailedEx ex) {
40110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            Log.e(LOG_TAG,
40210e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                    "Starting VM process through Zygote failed");
40310e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            throw new RuntimeException(
40410e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                    "Starting VM process through Zygote failed", ex);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** retry interval for opening a zygote socket */
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ZYGOTE_RETRY_MILLIS = 500;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tries to open socket to Zygote process if not already open. If
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * already open, does nothing.  May block and retry.
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void openZygoteSocketIfNeeded()
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ZygoteStartFailedEx {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int retryCount;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sPreviousZygoteOpenFailed) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * If we've failed before, expect that we'll fail again and
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * don't pause for retries.
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retryCount = 0;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retryCount = 10;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * See bug #811181: Sometimes runtime can make it up before zygote.
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Really, we'd like to do something better to avoid this condition,
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * but for now just wait a bit...
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int retry = 0
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ; (sZygoteSocket == null) && (retry < (retryCount + 1))
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ; retry++ ) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (retry > 0) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i("Zygote", "Zygote not up yet, sleeping...");
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Thread.sleep(ZYGOTE_RETRY_MILLIS);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException ex) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // should never happen
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteSocket = new LocalSocket();
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET,
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        LocalSocketAddress.Namespace.RESERVED));
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteInputStream
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        = new DataInputStream(sZygoteSocket.getInputStream());
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteWriter =
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new BufferedWriter(
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            new OutputStreamWriter(
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sZygoteSocket.getOutputStream()),
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            256);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i("Zygote", "Process: zygote socket opened");
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sPreviousZygoteOpenFailed = false;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException ex) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sZygoteSocket != null) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sZygoteSocket.close();
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException ex2) {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(LOG_TAG,"I/O exception on close after exception",
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ex2);
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteSocket = null;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sZygoteSocket == null) {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sPreviousZygoteOpenFailed = true;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ZygoteStartFailedEx("connect failed");
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends an argument list to the zygote process, which starts a new child
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and returns the child's pid. Please note: the present implementation
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * replaces newlines in the argument list with spaces.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args argument list
4923f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ZygoteStartFailedEx if process start failed for any reason
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4953f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    private static ProcessStartResult zygoteSendArgsAndGetResult(ArrayList<String> args)
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ZygoteStartFailedEx {
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        openZygoteSocketIfNeeded();
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * See com.android.internal.os.ZygoteInit.readArgumentList()
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Presently the wire format to the zygote process is:
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * a) a count of arguments (argc, in essence)
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * b) a number of newline-separated argument strings equal to count
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * After the zygote process reads these it will write the pid of
5073f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown             * the child or -1 on failure, followed by boolean to
5083f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown             * indicate whether a wrapper process was used.
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sZygoteWriter.write(Integer.toString(args.size()));
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sZygoteWriter.newLine();
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sz = args.size();
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < sz; i++) {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String arg = args.get(i);
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (arg.indexOf('\n') >= 0) {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new ZygoteStartFailedEx(
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "embedded newlines not allowed");
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteWriter.write(arg);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteWriter.newLine();
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sZygoteWriter.flush();
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Should there be a timeout on this?
5283f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            ProcessStartResult result = new ProcessStartResult();
5293f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            result.pid = sZygoteInputStream.readInt();
5303f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            if (result.pid < 0) {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ZygoteStartFailedEx("fork() failed");
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5333f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            result.usingWrapper = sZygoteInputStream.readBoolean();
5343f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            return result;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException ex) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sZygoteSocket != null) {
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sZygoteSocket.close();
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException ex2) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // we're going to fail anyway
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG,"I/O exception on routine close", ex2);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sZygoteSocket = null;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ZygoteStartFailedEx(ex);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts a new process via the zygote mechanism.
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param processClass Class name whose static main() to run
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param niceName 'nice' process name to appear in ps
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uid a POSIX uid that the new process should setuid() to
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gid a POSIX gid that the new process shuold setgid() to
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gids null-ok; a list of supplementary group IDs that the
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new process should setgroup() to.
560e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param debugFlags Additional flags.
561e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param targetSdkVersion The target SDK version for the app.
56283d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley     * @param seInfo null-ok SE Android information for the new process.
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param extraArgs Additional arguments to supply to the zygote process.
5643f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ZygoteStartFailedEx if process start failed for any reason
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5673f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    private static ProcessStartResult startViaZygote(final String processClass,
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final int uid, final int gid,
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final int[] gids,
5715b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
5725b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
57383d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  String[] extraArgs)
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  throws ZygoteStartFailedEx {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(Process.class) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<String> argsForZygote = new ArrayList<String>();
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // --runtime-init, --setuid=, --setgid=,
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // and --setgroups= must go first
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--runtime-init");
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--setuid=" + uid);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--setgid=" + gid);
584ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes            if ((debugFlags & Zygote.DEBUG_ENABLE_JNI_LOGGING) != 0) {
585ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes                argsForZygote.add("--enable-jni-logging");
586ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes            }
58723085b781e145ed684e7270af1d5ced6800b8effBen Cheng            if ((debugFlags & Zygote.DEBUG_ENABLE_SAFEMODE) != 0) {
58823085b781e145ed684e7270af1d5ced6800b8effBen Cheng                argsForZygote.add("--enable-safemode");
58923085b781e145ed684e7270af1d5ced6800b8effBen Cheng            }
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_DEBUGGER) != 0) {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-debugger");
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_CHECKJNI) != 0) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-checkjni");
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-assert");
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5992bca868361b41ff6a8228824cbecadc4c5deb44eJeff Sharkey            if (mountExternal == Zygote.MOUNT_EXTERNAL_MULTIUSER) {
6005b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                argsForZygote.add("--mount-external-multiuser");
601e217ee4d7a8223289a1af7363627c69956c46d41Jeff Sharkey            } else if (mountExternal == Zygote.MOUNT_EXTERNAL_MULTIUSER_ALL) {
602e217ee4d7a8223289a1af7363627c69956c46d41Jeff Sharkey                argsForZygote.add("--mount-external-multiuser-all");
6035b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey            }
604e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes            argsForZygote.add("--target-sdk-version=" + targetSdkVersion);
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //TODO optionally enable debuger
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //argsForZygote.add("--enable-debugger");
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // --setgroups is a comma-separated list
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gids != null && gids.length > 0) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                StringBuilder sb = new StringBuilder();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append("--setgroups=");
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sz = gids.length;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < sz; i++) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (i != 0) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(',');
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(gids[i]);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add(sb.toString());
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (niceName != null) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--nice-name=" + niceName);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62983d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley            if (seInfo != null) {
63083d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                argsForZygote.add("--seinfo=" + seInfo);
63183d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley            }
63283d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add(processClass);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (extraArgs != null) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (String arg : extraArgs) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    argsForZygote.add(arg);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6413f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            return zygoteSendArgsAndGetResult(argsForZygote);
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns elapsed milliseconds of the time this process has run.
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return  Returns the number of milliseconds this process has return.
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getElapsedCpuTime();
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of this process, which can be used with
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #killProcess} and {@link #sendSignal}.
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int myPid();
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of the calling thread, which be used with
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}.
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int myTid();
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * Returns the identifier of this process's uid.  This is the kernel uid
6657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * that the process is running under, which is the identity of its
6667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * app-specific sandbox.  It is different from {@link #myUserHandle} in that
6677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * a uid identifies a specific app sandbox in a specific user.
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int myUid();
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
67279af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn     * Returns this process's user handle.  This is the
6737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * user the process is running under.  It is distinct from
6747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * {@link #myUid()} in that a particular user will have multiple
6757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * distinct apps running under it each with their own uid.
6767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     */
67779af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public static final UserHandle myUserHandle() {
67879af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn        return new UserHandle(UserHandle.getUserId(myUid()));
6797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
6807d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
6817d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    /**
682a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Returns whether the current process is in an isolated sandbox.
683a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
684a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
685a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final boolean isIsolated() {
686f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        int uid = UserHandle.getAppId(myUid());
687a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn        return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID;
688a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    }
689a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
690a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the UID assigned to a particular user name, or -1 if there is
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a uid.
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getUidForName(String name);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the GID assigned to a particular user name, or -1 if there is
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a gid.
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getGidForName(String name);
703819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
704819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    /**
705819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * Returns a uid for a currently running process.
706819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @param pid the process id
707819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @return the uid of the process, or -1 if the process is not running.
708819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @hide pending API council review
709819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     */
710819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public static final int getUidForPid(int pid) {
711819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        String[] procStatusLabels = { "Uid:" };
712819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        long[] procStatusValues = new long[1];
713819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        procStatusValues[0] = -1;
714819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
715819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        return (int) procStatusValues[0];
716819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    }
717819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * Returns the parent process id for a currently running process.
720ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @param pid the process id
721ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @return the parent process id of the process, or -1 if the process is not running.
722ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @hide
723ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     */
724ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    public static final int getParentPid(int pid) {
725ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        String[] procStatusLabels = { "PPid:" };
726ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        long[] procStatusValues = new long[1];
727ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        procStatusValues[0] = -1;
728ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
729ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        return (int) procStatusValues[0];
730ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    }
731ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown
732ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    /**
73307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Returns the thread group leader id for a currently running thread.
73407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @param tid the thread id
73507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @return the thread group leader id of the thread, or -1 if the thread is not running.
73607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     *         This is same as what getpid(2) would return if called by tid.
73707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
73807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     */
73907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int getThreadGroupLeader(int tid) {
74007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        String[] procStatusLabels = { "Tgid:" };
74107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        long[] procStatusValues = new long[1];
74207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        procStatusValues[0] = -1;
74307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        Process.readProcLines("/proc/" + tid + "/status", procStatusLabels, procStatusValues);
74407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        return (int) procStatusValues[0];
74507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    }
74607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
74707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of a thread, based on Linux priorities.
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int tid, int priority)
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
762e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
763e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
764160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * Call with 'false' to cause future calls to {@link #setThreadPriority(int)} to
765160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * throw an exception if passed a background-level thread priority.  This is only
766160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * effective if the JNI layer is built with GUARD_THREAD_PRIORITY defined to 1.
767160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     *
768160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * @hide
769160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     */
770160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    public static final native void setCanSelfBackground(boolean backgroundOk);
771160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate
772160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    /**
773e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * Sets the scheduling group for a thread.
774e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
775f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param tid The identifier of the thread to change.
776f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this thread from THREAD_GROUP_*.
777e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     *
778e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
779e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * <var>tid</var> does not exist.
780e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws SecurityException Throws SecurityException if your process does
781e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * not have permission to modify the given thread, or to use the given
782e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * priority.
783f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * If the thread is a thread group leader, that is it's gettid() == getpid(),
784f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * then the other threads in the same thread group are _not_ affected.
785e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
786e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    public static final native void setThreadGroup(int tid, int group)
787e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat            throws IllegalArgumentException, SecurityException;
788f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
7893e458241d9930465a20a861ecb42744355d48e48San Mehat    /**
7903e458241d9930465a20a861ecb42744355d48e48San Mehat     * Sets the scheduling group for a process and all child threads
7913e458241d9930465a20a861ecb42744355d48e48San Mehat     * @hide
792f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param pid The identifier of the process to change.
793f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this process from THREAD_GROUP_*.
7943e458241d9930465a20a861ecb42744355d48e48San Mehat     *
7953e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
7963e458241d9930465a20a861ecb42744355d48e48San Mehat     * <var>tid</var> does not exist.
7973e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws SecurityException Throws SecurityException if your process does
7983e458241d9930465a20a861ecb42744355d48e48San Mehat     * not have permission to modify the given thread, or to use the given
7993e458241d9930465a20a861ecb42744355d48e48San Mehat     * priority.
800f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     *
801f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_DEFAULT means to move all non-background priority
802f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads to the foreground scheduling group, but to leave background
803f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * priority threads alone.  group == THREAD_GROUP_BG_NONINTERACTIVE moves all
804f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads, regardless of priority, to the background scheduling group.
805f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_FOREGROUND is not allowed.
8063e458241d9930465a20a861ecb42744355d48e48San Mehat     */
8073e458241d9930465a20a861ecb42744355d48e48San Mehat    public static final native void setProcessGroup(int pid, int group)
8083e458241d9930465a20a861ecb42744355d48e48San Mehat            throws IllegalArgumentException, SecurityException;
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of the calling thread, based on Linux priorities.  See
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)} for more information.
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setThreadPriority(int, int)
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int priority)
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current priority of a thread, based on Linux priorities.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the current priority, as a Linux priority level,
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from -20 for highest scheduling priority to 19 for lowest scheduling
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getThreadPriority(int tid)
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException;
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8446793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Set the scheduling policy and priority of a thread, based on Linux.
8456793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8466793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param tid The identifier of the thread/process to change.
8476793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param policy A Linux scheduling policy such as SCHED_OTHER etc.
8486793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param priority A Linux priority level in a range appropriate for the given policy.
8496793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8506793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws IllegalArgumentException Throws IllegalArgumentException if
8516793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy.
8526793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws SecurityException Throws SecurityException if your process does
8536793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * not have permission to modify the given thread, or to use the given
8546793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * scheduling policy or priority.
8556793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8566793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * {@hide}
8576793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
8586793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final native void setThreadScheduler(int tid, int policy, int priority)
8596793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten            throws IllegalArgumentException;
8606793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
8616793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determine whether the current environment supports multiple processes.
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the system can run in multiple processes, else
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * false if everything is running in a single process.
86610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     *
86710e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     * @deprecated This method always returns true.  Do not use.
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
86910e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    @Deprecated
87010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    public static final boolean supportsProcesses() {
87110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        return true;
87210e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    }
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the out-of-memory badness adjustment for a process.
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The process identifier to set.
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param amt Adjustment value -- linux allows -16 to +15.
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the underlying system supports this
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         feature, else false.
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean setOomAdj(int pid, int amt);
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change this process's argv[0] parameter.  This can be useful to show
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * more descriptive information in things like the 'ps' command.
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The new name of this process.
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setArgV0(String text);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Kill the process with the given PID.
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that, though this API allows us to request to
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * kill any process based on its PID, the kernel will
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still impose standard restrictions on which PIDs you
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are actually able to kill.  Typically this means only
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the process running the caller's packages/application
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and any additional processes created by that app; packages
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sharing a common UID will also be able to kill each
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other's processes.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final void killProcess(int pid) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendSignal(pid, SIGNAL_KILL);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setUid(int uid);
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setGid(int uid);
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send a signal to the given process.
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The pid of the target process.
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param signal The signal to send.
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void sendSignal(int pid, int signal);
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
926906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
927906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
928906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
929906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
930906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
931906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
932906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final void killProcessQuiet(int pid) {
933906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn        sendSignalQuiet(pid, SIGNAL_KILL);
934906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    }
935906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
936906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
937906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
938906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
939906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
940906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
941906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
942906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final native void sendSignalQuiet(int pid, int signal);
943906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9450bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen    public static final native long getFreeMemory();
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
94859325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    public static final native long getTotalMemory();
94959325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn
95059325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    /** @hide */
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void readProcLines(String path,
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] reqFields, long[] outSizes);
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int[] getPids(String path, int[] lastArray);
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_TERM_MASK = 0xff;
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_ZERO_TERM = 0;
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_SPACE_TERM = (int)' ';
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final int PROC_TAB_TERM = (int)'\t';
965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_COMBINE = 0x100;
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_PARENS = 0x200;
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_STRING = 0x1000;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_LONG = 0x2000;
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_FLOAT = 0x4000;
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean readProcFile(String file, int[] format,
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outStrings, long[] outLongs, float[] outFloats);
979c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
980c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
981c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final native boolean parseProcLine(byte[] buffer, int startIndex,
982c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            int endIndex, int[] format, String[] outStrings, long[] outLongs, float[] outFloats);
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
984f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    /** @hide */
985f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    public static final native int[] getPidsForCommands(String[] cmds);
986f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the total Pss value for a given process, in bytes.
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid the process to the Pss for
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the total Pss value for the given process in bytes,
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  or -1 if the value cannot be determined
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getPss(int pid);
9963f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
9973f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    /**
9983f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * Specifies the outcome of having started a process.
9993f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @hide
10003f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     */
10013f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final class ProcessStartResult {
10023f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
10033f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * The PID of the newly started process.
10043f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * Always >= 0.  (If the start failed, an exception will have been thrown instead.)
10053f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
10063f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public int pid;
10073f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
10083f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
10093f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * True if the process was started with a wrapper attached.
10103f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
10113f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public boolean usingWrapper;
10123f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    }
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1014