Process.java revision 13ac041b9f21043bc7c848a743be618bfd7a67e9
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     * Standard priority of application threads.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_DEFAULT = 0;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***************************************
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ** Keep in sync with utils/threads.h **
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***************************************
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lowest available thread priority.  Only for those who really, really
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * don't want to run if anything else is happening.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_LOWEST = 19;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority background threads.  This gives your thread a slightly
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lower than normal priority, so that it will have less chance of impacting
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the responsiveness of the user interface.
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_BACKGROUND = 10;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of threads that are currently running a user interface
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the user is interacting with.  Applications can not normally
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority; the system will automatically adjust your
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application threads as the user moves through the UI.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_FOREGROUND = -2;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of system display threads, involved in updating
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user interface.  Applications can not
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normally change to this priority.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_DISPLAY = -4;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of the most important display threads, for compositing
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the screen and retrieving input events.  Applications can not normally
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority.
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of audio threads.  Applications can not normally
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority.
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_AUDIO = -16;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of the most important audio threads.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applications can not normally change to this priority.
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_URGENT_AUDIO = -19;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Minimum increment to make a priority more favorable.
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Minimum increment to make a priority less favorable.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
260e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
2616793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Default scheduling policy
2626793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2636793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2646793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_OTHER = 0;
2656793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2666793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2676793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * First-In First-Out scheduling policy
2686793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2696793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2706793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_FIFO = 1;
2716793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2726793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2736793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Round-Robin scheduling policy
2746793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2756793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2766793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_RR = 2;
2776793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2786793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2796793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Batch scheduling policy
2806793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2816793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2826793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_BATCH = 3;
2836793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
2846793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
2856793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Idle scheduling policy
2866793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2876793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
2886793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_IDLE = 5;
2896793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
290f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // Keep in sync with SP_* constants of enum type SchedPolicy
291f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // declared in system/core/include/cutils/sched_policy.h,
292f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // except THREAD_GROUP_DEFAULT does not correspond to any SP_* value.
293f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
2946793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
295f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Default thread group -
296f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * has meaning with setProcessGroup() only, cannot be used with setThreadGroup().
297f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * When used with setProcessGroup(), the group of each thread in the process
298f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * is conditionally changed based on that thread's current priority, as follows:
299f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads with priority numerically less than THREAD_PRIORITY_BACKGROUND
300f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * are moved to foreground thread group.  All other threads are left unchanged.
301e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
302e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
303f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    public static final int THREAD_GROUP_DEFAULT = -1;
304e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
305e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
306f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Background thread group - All threads in
307e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * this group are scheduled with a reduced share of the CPU.
308f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Value is same as constant SP_BACKGROUND of enum SchedPolicy.
309f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * FIXME rename to THREAD_GROUP_BACKGROUND.
310e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
311e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
312f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    public static final int THREAD_GROUP_BG_NONINTERACTIVE = 0;
313e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
314e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
315f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Foreground thread group - All threads in
316f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * this group are scheduled with a normal share of the CPU.
317f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Value is same as constant SP_FOREGROUND of enum SchedPolicy.
318f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Not used at this level.
319e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
320e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     **/
321f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    private static final int THREAD_GROUP_FOREGROUND = 1;
322e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
32307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
32407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * System thread group.
32507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
32607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
32707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_SYSTEM = 2;
32807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
32907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
33007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Application audio thread group.
33107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
33207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
33307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_AUDIO_APP = 3;
33407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
33507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
33607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * System audio thread group.
33707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
33807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
33907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_AUDIO_SYS = 4;
34007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_QUIT = 3;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_KILL = 9;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_USR1 = 10;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // State for communicating with zygote process
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static LocalSocket sZygoteSocket;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static DataInputStream sZygoteInputStream;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static BufferedWriter sZygoteWriter;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** true if previous zygote open failed */
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean sPreviousZygoteOpenFailed;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start a new process.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If processes are enabled, a new process is created and the
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * static main() function of a <var>processClass</var> is executed there.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The process will continue running after this function returns.
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If processes are not enabled, a new thread in the caller's
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process is created and main() of <var>processClass</var> called there.
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The niceName parameter, if not an empty string, is a custom name to
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * give to the process instead of using processClass.  This allows you to
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * make easily identifyable processes even if you are using the same base
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>processClass</var> to start them.
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param processClass The class to use as the process's main entry
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     point.
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param niceName A more readable name to use for the process.
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uid The user-id under which the process will run.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gid The group-id under which the process will run.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gids Additional group-ids associated with the process.
375e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param debugFlags Additional flags.
376e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param targetSdkVersion The target SDK version for the app.
37783d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley     * @param seInfo null-ok SE Android information for the new process.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param zygoteArgs Additional arguments to supply to the zygote process.
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3803f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws RuntimeException on fatal start failure
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3853f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final ProcessStartResult start(final String processClass,
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  int uid, int gid, int[] gids,
3885b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
3895b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
39083d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
39110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                                  String[] zygoteArgs) {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
39310e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            return startViaZygote(processClass, niceName, uid, gid, gids,
3945b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                    debugFlags, mountExternal, targetSdkVersion, seInfo, zygoteArgs);
39510e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        } catch (ZygoteStartFailedEx ex) {
39610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            Log.e(LOG_TAG,
39710e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                    "Starting VM process through Zygote failed");
39810e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown            throw new RuntimeException(
39910e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                    "Starting VM process through Zygote failed", ex);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** retry interval for opening a zygote socket */
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ZYGOTE_RETRY_MILLIS = 500;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tries to open socket to Zygote process if not already open. If
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * already open, does nothing.  May block and retry.
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void openZygoteSocketIfNeeded()
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ZygoteStartFailedEx {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int retryCount;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sPreviousZygoteOpenFailed) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * If we've failed before, expect that we'll fail again and
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * don't pause for retries.
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retryCount = 0;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retryCount = 10;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * See bug #811181: Sometimes runtime can make it up before zygote.
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Really, we'd like to do something better to avoid this condition,
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * but for now just wait a bit...
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int retry = 0
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ; (sZygoteSocket == null) && (retry < (retryCount + 1))
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ; retry++ ) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (retry > 0) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i("Zygote", "Zygote not up yet, sleeping...");
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Thread.sleep(ZYGOTE_RETRY_MILLIS);
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException ex) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // should never happen
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteSocket = new LocalSocket();
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET,
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        LocalSocketAddress.Namespace.RESERVED));
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteInputStream
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        = new DataInputStream(sZygoteSocket.getInputStream());
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteWriter =
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new BufferedWriter(
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            new OutputStreamWriter(
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sZygoteSocket.getOutputStream()),
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            256);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.i("Zygote", "Process: zygote socket opened");
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sPreviousZygoteOpenFailed = false;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException ex) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sZygoteSocket != null) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sZygoteSocket.close();
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException ex2) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(LOG_TAG,"I/O exception on close after exception",
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ex2);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteSocket = null;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sZygoteSocket == null) {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sPreviousZygoteOpenFailed = true;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ZygoteStartFailedEx("connect failed");
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends an argument list to the zygote process, which starts a new child
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and returns the child's pid. Please note: the present implementation
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * replaces newlines in the argument list with spaces.
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args argument list
4873f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ZygoteStartFailedEx if process start failed for any reason
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4903f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    private static ProcessStartResult zygoteSendArgsAndGetResult(ArrayList<String> args)
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ZygoteStartFailedEx {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        openZygoteSocketIfNeeded();
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * See com.android.internal.os.ZygoteInit.readArgumentList()
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Presently the wire format to the zygote process is:
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * a) a count of arguments (argc, in essence)
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * b) a number of newline-separated argument strings equal to count
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * After the zygote process reads these it will write the pid of
5023f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown             * the child or -1 on failure, followed by boolean to
5033f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown             * indicate whether a wrapper process was used.
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sZygoteWriter.write(Integer.toString(args.size()));
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sZygoteWriter.newLine();
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sz = args.size();
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < sz; i++) {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String arg = args.get(i);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (arg.indexOf('\n') >= 0) {
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new ZygoteStartFailedEx(
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "embedded newlines not allowed");
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteWriter.write(arg);
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sZygoteWriter.newLine();
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sZygoteWriter.flush();
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Should there be a timeout on this?
5233f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            ProcessStartResult result = new ProcessStartResult();
5243f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            result.pid = sZygoteInputStream.readInt();
5253f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            if (result.pid < 0) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ZygoteStartFailedEx("fork() failed");
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5283f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            result.usingWrapper = sZygoteInputStream.readBoolean();
5293f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            return result;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException ex) {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sZygoteSocket != null) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sZygoteSocket.close();
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException ex2) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // we're going to fail anyway
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG,"I/O exception on routine close", ex2);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sZygoteSocket = null;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ZygoteStartFailedEx(ex);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts a new process via the zygote mechanism.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param processClass Class name whose static main() to run
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param niceName 'nice' process name to appear in ps
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uid a POSIX uid that the new process should setuid() to
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gid a POSIX gid that the new process shuold setgid() to
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gids null-ok; a list of supplementary group IDs that the
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new process should setgroup() to.
555e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param debugFlags Additional flags.
556e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param targetSdkVersion The target SDK version for the app.
55783d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley     * @param seInfo null-ok SE Android information for the new process.
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param extraArgs Additional arguments to supply to the zygote process.
5593f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ZygoteStartFailedEx if process start failed for any reason
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5623f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    private static ProcessStartResult startViaZygote(final String processClass,
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final int uid, final int gid,
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final int[] gids,
5665b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
5675b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
56883d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  String[] extraArgs)
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  throws ZygoteStartFailedEx {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(Process.class) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<String> argsForZygote = new ArrayList<String>();
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // --runtime-init, --setuid=, --setgid=,
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // and --setgroups= must go first
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--runtime-init");
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--setuid=" + uid);
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add("--setgid=" + gid);
579ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes            if ((debugFlags & Zygote.DEBUG_ENABLE_JNI_LOGGING) != 0) {
580ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes                argsForZygote.add("--enable-jni-logging");
581ae07ecf3766c38af1c12822458b98036b28bd4c0Elliott Hughes            }
58223085b781e145ed684e7270af1d5ced6800b8effBen Cheng            if ((debugFlags & Zygote.DEBUG_ENABLE_SAFEMODE) != 0) {
58323085b781e145ed684e7270af1d5ced6800b8effBen Cheng                argsForZygote.add("--enable-safemode");
58423085b781e145ed684e7270af1d5ced6800b8effBen Cheng            }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_DEBUGGER) != 0) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-debugger");
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_CHECKJNI) != 0) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-checkjni");
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--enable-assert");
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5942bca868361b41ff6a8228824cbecadc4c5deb44eJeff Sharkey            if (mountExternal == Zygote.MOUNT_EXTERNAL_MULTIUSER) {
5955b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                argsForZygote.add("--mount-external-multiuser");
596e217ee4d7a8223289a1af7363627c69956c46d41Jeff Sharkey            } else if (mountExternal == Zygote.MOUNT_EXTERNAL_MULTIUSER_ALL) {
597e217ee4d7a8223289a1af7363627c69956c46d41Jeff Sharkey                argsForZygote.add("--mount-external-multiuser-all");
5985b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey            }
599e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes            argsForZygote.add("--target-sdk-version=" + targetSdkVersion);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //TODO optionally enable debuger
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //argsForZygote.add("--enable-debugger");
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // --setgroups is a comma-separated list
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gids != null && gids.length > 0) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                StringBuilder sb = new StringBuilder();
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append("--setgroups=");
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sz = gids.length;
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < sz; i++) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (i != 0) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(',');
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(gids[i]);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add(sb.toString());
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (niceName != null) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                argsForZygote.add("--nice-name=" + niceName);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62483d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley            if (seInfo != null) {
62583d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                argsForZygote.add("--seinfo=" + seInfo);
62683d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley            }
62783d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argsForZygote.add(processClass);
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (extraArgs != null) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (String arg : extraArgs) {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    argsForZygote.add(arg);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6363f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown            return zygoteSendArgsAndGetResult(argsForZygote);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns elapsed milliseconds of the time this process has run.
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return  Returns the number of milliseconds this process has return.
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getElapsedCpuTime();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of this process, which can be used with
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #killProcess} and {@link #sendSignal}.
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int myPid();
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
65380b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     * Returns the identifier of this process' parent.
65480b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     * @hide
65580b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     */
65680b12fcaaec458377d966803c3a61504f0897ea1Romain Guy    public static native int myPpid();
65780b12fcaaec458377d966803c3a61504f0897ea1Romain Guy
65880b12fcaaec458377d966803c3a61504f0897ea1Romain Guy    /**
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of the calling thread, which be used with
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}.
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int myTid();
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * Returns the identifier of this process's uid.  This is the kernel uid
6667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * that the process is running under, which is the identity of its
6677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * app-specific sandbox.  It is different from {@link #myUserHandle} in that
6687d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * a uid identifies a specific app sandbox in a specific user.
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int myUid();
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
67379af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn     * Returns this process's user handle.  This is the
6747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * user the process is running under.  It is distinct from
6757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * {@link #myUid()} in that a particular user will have multiple
6767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * distinct apps running under it each with their own uid.
6777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     */
67879af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn    public static final UserHandle myUserHandle() {
67979af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn        return new UserHandle(UserHandle.getUserId(myUid()));
6807d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
6817d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
6827d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    /**
683a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Returns whether the current process is in an isolated sandbox.
684a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
685a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
686a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final boolean isIsolated() {
687f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        int uid = UserHandle.getAppId(myUid());
688a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn        return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID;
689a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    }
690a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
691a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the UID assigned to a particular user name, or -1 if there is
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a uid.
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getUidForName(String name);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the GID assigned to a particular user name, or -1 if there is
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a gid.
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getGidForName(String name);
704819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
705819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    /**
706819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * Returns a uid for a currently running process.
707819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @param pid the process id
708819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @return the uid of the process, or -1 if the process is not running.
709819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @hide pending API council review
710819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     */
711819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public static final int getUidForPid(int pid) {
712819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        String[] procStatusLabels = { "Uid:" };
713819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        long[] procStatusValues = new long[1];
714819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        procStatusValues[0] = -1;
715819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
716819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        return (int) procStatusValues[0];
717819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    }
718819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
720ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * Returns the parent process id for a currently running process.
721ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @param pid the process id
722ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @return the parent process id of the process, or -1 if the process is not running.
723ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @hide
724ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     */
725ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    public static final int getParentPid(int pid) {
726ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        String[] procStatusLabels = { "PPid:" };
727ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        long[] procStatusValues = new long[1];
728ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        procStatusValues[0] = -1;
729ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
730ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        return (int) procStatusValues[0];
731ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    }
732ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown
733ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    /**
73407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Returns the thread group leader id for a currently running thread.
73507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @param tid the thread id
73607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @return the thread group leader id of the thread, or -1 if the thread is not running.
73707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     *         This is same as what getpid(2) would return if called by tid.
73807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
73907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     */
74007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int getThreadGroupLeader(int tid) {
74107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        String[] procStatusLabels = { "Tgid:" };
74207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        long[] procStatusValues = new long[1];
74307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        procStatusValues[0] = -1;
74407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        Process.readProcLines("/proc/" + tid + "/status", procStatusLabels, procStatusValues);
74507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        return (int) procStatusValues[0];
74607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    }
74707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
74807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of a thread, based on Linux priorities.
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int tid, int priority)
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
763e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
764e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
765160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * Call with 'false' to cause future calls to {@link #setThreadPriority(int)} to
766160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * throw an exception if passed a background-level thread priority.  This is only
767160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * effective if the JNI layer is built with GUARD_THREAD_PRIORITY defined to 1.
768160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     *
769160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * @hide
770160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     */
771160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    public static final native void setCanSelfBackground(boolean backgroundOk);
772160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate
773160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    /**
774e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * Sets the scheduling group for a thread.
775e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
776f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param tid The identifier of the thread to change.
777f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this thread from THREAD_GROUP_*.
778e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     *
779e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
780e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * <var>tid</var> does not exist.
781e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws SecurityException Throws SecurityException if your process does
782e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * not have permission to modify the given thread, or to use the given
783e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * priority.
784f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * If the thread is a thread group leader, that is it's gettid() == getpid(),
785f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * then the other threads in the same thread group are _not_ affected.
786e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
787e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    public static final native void setThreadGroup(int tid, int group)
788e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat            throws IllegalArgumentException, SecurityException;
789f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
7903e458241d9930465a20a861ecb42744355d48e48San Mehat    /**
7913e458241d9930465a20a861ecb42744355d48e48San Mehat     * Sets the scheduling group for a process and all child threads
7923e458241d9930465a20a861ecb42744355d48e48San Mehat     * @hide
793f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param pid The identifier of the process to change.
794f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this process from THREAD_GROUP_*.
7953e458241d9930465a20a861ecb42744355d48e48San Mehat     *
7963e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
7973e458241d9930465a20a861ecb42744355d48e48San Mehat     * <var>tid</var> does not exist.
7983e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws SecurityException Throws SecurityException if your process does
7993e458241d9930465a20a861ecb42744355d48e48San Mehat     * not have permission to modify the given thread, or to use the given
8003e458241d9930465a20a861ecb42744355d48e48San Mehat     * priority.
801f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     *
802f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_DEFAULT means to move all non-background priority
803f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads to the foreground scheduling group, but to leave background
804f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * priority threads alone.  group == THREAD_GROUP_BG_NONINTERACTIVE moves all
805f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads, regardless of priority, to the background scheduling group.
806f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_FOREGROUND is not allowed.
8073e458241d9930465a20a861ecb42744355d48e48San Mehat     */
8083e458241d9930465a20a861ecb42744355d48e48San Mehat    public static final native void setProcessGroup(int pid, int group)
8093e458241d9930465a20a861ecb42744355d48e48San Mehat            throws IllegalArgumentException, SecurityException;
8109e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey
8119e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey    /**
8129e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     * Return the scheduling group of requested process.
8139e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     *
8149e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     * @hide
8159e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     */
8169e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey    public static final native int getProcessGroup(int pid)
8179e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey            throws IllegalArgumentException, SecurityException;
8189e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of the calling thread, based on Linux priorities.  See
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)} for more information.
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setThreadPriority(int, int)
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int priority)
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current priority of a thread, based on Linux priorities.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the current priority, as a Linux priority level,
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from -20 for highest scheduling priority to 19 for lowest scheduling
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getThreadPriority(int tid)
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8536793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Set the scheduling policy and priority of a thread, based on Linux.
8546793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8556793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param tid The identifier of the thread/process to change.
8566793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param policy A Linux scheduling policy such as SCHED_OTHER etc.
8576793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param priority A Linux priority level in a range appropriate for the given policy.
8586793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8596793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws IllegalArgumentException Throws IllegalArgumentException if
8606793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy.
8616793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws SecurityException Throws SecurityException if your process does
8626793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * not have permission to modify the given thread, or to use the given
8636793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * scheduling policy or priority.
8646793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8656793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * {@hide}
8666793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
8676793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final native void setThreadScheduler(int tid, int policy, int priority)
8686793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten            throws IllegalArgumentException;
8696793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
8706793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determine whether the current environment supports multiple processes.
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the system can run in multiple processes, else
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * false if everything is running in a single process.
87510e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     *
87610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     * @deprecated This method always returns true.  Do not use.
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
87810e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    @Deprecated
87910e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    public static final boolean supportsProcesses() {
88010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        return true;
88110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the out-of-memory badness adjustment for a process.
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The process identifier to set.
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param amt Adjustment value -- linux allows -16 to +15.
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the underlying system supports this
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         feature, else false.
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean setOomAdj(int pid, int amt);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change this process's argv[0] parameter.  This can be useful to show
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * more descriptive information in things like the 'ps' command.
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The new name of this process.
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setArgV0(String text);
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Kill the process with the given PID.
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that, though this API allows us to request to
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * kill any process based on its PID, the kernel will
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still impose standard restrictions on which PIDs you
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are actually able to kill.  Typically this means only
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the process running the caller's packages/application
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and any additional processes created by that app; packages
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sharing a common UID will also be able to kill each
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other's processes.
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final void killProcess(int pid) {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendSignal(pid, SIGNAL_KILL);
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setUid(int uid);
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setGid(int uid);
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send a signal to the given process.
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The pid of the target process.
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param signal The signal to send.
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void sendSignal(int pid, int signal);
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
935906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
936906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
937906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
938906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
939906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
940906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
941906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final void killProcessQuiet(int pid) {
942906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn        sendSignalQuiet(pid, SIGNAL_KILL);
943906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    }
944906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
945906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
946906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
947906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
948906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
949906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
950906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
951906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final native void sendSignalQuiet(int pid, int signal);
952906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9540bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen    public static final native long getFreeMemory();
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
95759325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    public static final native long getTotalMemory();
95859325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn
95959325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    /** @hide */
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void readProcLines(String path,
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] reqFields, long[] outSizes);
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int[] getPids(String path, int[] lastArray);
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_TERM_MASK = 0xff;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_ZERO_TERM = 0;
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_SPACE_TERM = (int)' ';
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
973c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final int PROC_TAB_TERM = (int)'\t';
974c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_COMBINE = 0x100;
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_PARENS = 0x200;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
97913ac041b9f21043bc7c848a743be618bfd7a67e9Dianne Hackborn    public static final int PROC_QUOTES = 0x400;
98013ac041b9f21043bc7c848a743be618bfd7a67e9Dianne Hackborn    /** @hide */
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_STRING = 0x1000;
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_LONG = 0x2000;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_FLOAT = 0x4000;
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean readProcFile(String file, int[] format,
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outStrings, long[] outLongs, float[] outFloats);
990c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
991c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
992c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final native boolean parseProcLine(byte[] buffer, int startIndex,
993c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            int endIndex, int[] format, String[] outStrings, long[] outLongs, float[] outFloats);
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
995f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    /** @hide */
996f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    public static final native int[] getPidsForCommands(String[] cmds);
997f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the total Pss value for a given process, in bytes.
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid the process to the Pss for
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the total Pss value for the given process in bytes,
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  or -1 if the value cannot be determined
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getPss(int pid);
10073f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
10083f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    /**
10093f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * Specifies the outcome of having started a process.
10103f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @hide
10113f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     */
10123f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final class ProcessStartResult {
10133f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
10143f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * The PID of the newly started process.
10153f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * Always >= 0.  (If the start failed, an exception will have been thrown instead.)
10163f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
10173f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public int pid;
10183f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
10193f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
10203f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * True if the process was started with a wrapper attached.
10213f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
10223f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public boolean usingWrapper;
10233f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1025