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
191b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharanimport android.annotation.TestApi;
2034385d352da19805ae948215e2edbeedd16b7941Elliott Hughesimport android.system.Os;
21b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murrayimport android.system.OsConstants;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
23ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesekimport android.webkit.WebViewZygote;
24ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampeimport dalvik.system.VMRuntime;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tools for managing OS processes.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Process {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOG_TAG = "Process";
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3264cd907af99ce9702e8975a657ee437c2626f8b5Narayan Kamath    /**
3364cd907af99ce9702e8975a657ee437c2626f8b5Narayan Kamath     * @hide for internal use only.
3464cd907af99ce9702e8975a657ee437c2626f8b5Narayan Kamath     */
3564cd907af99ce9702e8975a657ee437c2626f8b5Narayan Kamath    public static final String ZYGOTE_SOCKET = "zygote";
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3764cd907af99ce9702e8975a657ee437c2626f8b5Narayan Kamath    /**
3864cd907af99ce9702e8975a657ee437c2626f8b5Narayan Kamath     * @hide for internal use only.
3964cd907af99ce9702e8975a657ee437c2626f8b5Narayan Kamath     */
4064cd907af99ce9702e8975a657ee437c2626f8b5Narayan Kamath    public static final String SECONDARY_ZYGOTE_SOCKET = "zygote_secondary";
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
431cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey     * Defines the root UID.
441cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey     * @hide
451cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey     */
461cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static final int ROOT_UID = 0;
471cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
481cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the UID/GID under which system code runs.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SYSTEM_UID = 1000;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the UID/GID under which the telephony code runs.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PHONE_UID = 1001;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     * Defines the UID/GID for the user shell.
60854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     * @hide
61854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn     */
62854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn    public static final int SHELL_UID = 2000;
63854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
64854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn    /**
65d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     * Defines the UID/GID for the log group.
66d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     * @hide
67d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood     */
68d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood    public static final int LOG_UID = 1007;
69d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood
70d42685d5de1dbd6d75b48d42418f370adaa4daefMike Lockwood    /**
71d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     * Defines the UID/GID for the WIFI supplicant process.
72d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     * @hide
73d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani     */
74d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    public static final int WIFI_UID = 1010;
75d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani
76d158214511a3c04753de04fa6389e46d33135c38Amith Yamasani    /**
778b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     * Defines the UID/GID for the mediaserver process.
788b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     * @hide
798b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten     */
808b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten    public static final int MEDIA_UID = 1013;
818b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten
828b7d1b4d4a33e9429c5cedaa6317efcaad95da68Glenn Kasten    /**
835294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     * Defines the UID/GID for the DRM process.
845294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     * @hide
855294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey     */
865294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey    public static final int DRM_UID = 1019;
875294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey
885294a2fc2f401cd248a4bc3f0f9ee1e2854f4e9aJeff Sharkey    /**
8926993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     * Defines the UID/GID for the group that controls VPN services.
9026993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     * @hide
9126993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root     */
9226993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root    public static final int VPN_UID = 1016;
9326993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root
9426993b37d525fd64efebd51daec1b4abfebd8a74Kenny Root    /**
956ab9bb68bafaa2b9a10924f3a7c3a1d164dda752Janis Danisevskis     * Defines the UID/GID for keystore.
966ab9bb68bafaa2b9a10924f3a7c3a1d164dda752Janis Danisevskis     * @hide
976ab9bb68bafaa2b9a10924f3a7c3a1d164dda752Janis Danisevskis     */
986ab9bb68bafaa2b9a10924f3a7c3a1d164dda752Janis Danisevskis    public static final int KEYSTORE_UID = 1017;
996ab9bb68bafaa2b9a10924f3a7c3a1d164dda752Janis Danisevskis
1006ab9bb68bafaa2b9a10924f3a7c3a1d164dda752Janis Danisevskis    /**
101cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     * Defines the UID/GID for the NFC service process.
102cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     * @hide
103cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly     */
104a5cb9f42174a52afbeb7e33dab64282f52f8cedbNick Pelly    public static final int NFC_UID = 1027;
105cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly
106cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly    /**
1071abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     * Defines the UID/GID for the Bluetooth service process.
1081abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     * @hide
1091abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh     */
1101abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh    public static final int BLUETOOTH_UID = 1002;
1111abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh
1121abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh    /**
113dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     * Defines the GID for the group that allows write access to the internal media storage.
114dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     * @hide
115dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood     */
116dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood    public static final int MEDIA_RW_GID = 1023;
117dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood
118dcaa10cd361a543cfa93bbb5c53444f437bd07a4Mike Lockwood    /**
119184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey     * Access to installed package details
120184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey     * @hide
121184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey     */
122184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey    public static final int PACKAGE_INFO_GID = 1032;
123184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey
124184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey    /**
12508cfaf672604422dd355d6703aec78f3aa5ee74eTorne (Richard Coles)     * Defines the UID/GID for the shared RELRO file updater process.
12608cfaf672604422dd355d6703aec78f3aa5ee74eTorne (Richard Coles)     * @hide
12708cfaf672604422dd355d6703aec78f3aa5ee74eTorne (Richard Coles)     */
12808cfaf672604422dd355d6703aec78f3aa5ee74eTorne (Richard Coles)    public static final int SHARED_RELRO_UID = 1037;
12908cfaf672604422dd355d6703aec78f3aa5ee74eTorne (Richard Coles)
13008cfaf672604422dd355d6703aec78f3aa5ee74eTorne (Richard Coles)    /**
131ed0ea40a41aae8e65bc189efe6b631ca78259383Andy Hung     * Defines the UID/GID for the audioserver process.
132ed0ea40a41aae8e65bc189efe6b631ca78259383Andy Hung     * @hide
133ed0ea40a41aae8e65bc189efe6b631ca78259383Andy Hung     */
134ed0ea40a41aae8e65bc189efe6b631ca78259383Andy Hung    public static final int AUDIOSERVER_UID = 1041;
135ed0ea40a41aae8e65bc189efe6b631ca78259383Andy Hung
136ed0ea40a41aae8e65bc189efe6b631ca78259383Andy Hung    /**
13775cade0a5fd5ec432870de9977f81091ab389423Chien-Yu Chen     * Defines the UID/GID for the cameraserver process
13875cade0a5fd5ec432870de9977f81091ab389423Chien-Yu Chen     * @hide
13975cade0a5fd5ec432870de9977f81091ab389423Chien-Yu Chen     */
140b8b4e85879e93db2ba7821b7fe54710cb6a6de71Chien-Yu Chen    public static final int CAMERASERVER_UID = 1047;
14175cade0a5fd5ec432870de9977f81091ab389423Chien-Yu Chen
14275cade0a5fd5ec432870de9977f81091ab389423Chien-Yu Chen    /**
143ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek     * Defines the UID/GID for the WebView zygote process.
144ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek     * @hide
145ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek     */
146ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    public static final int WEBVIEW_ZYGOTE_UID = 1051;
147ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
148ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    /**
14907c5c6f7f02b0ed1b71647558fabdac15bbc8d24Jeff Sharkey     * Defines the UID used for resource tracking for OTA updates.
15007c5c6f7f02b0ed1b71647558fabdac15bbc8d24Jeff Sharkey     * @hide
15107c5c6f7f02b0ed1b71647558fabdac15bbc8d24Jeff Sharkey     */
15207c5c6f7f02b0ed1b71647558fabdac15bbc8d24Jeff Sharkey    public static final int OTA_UPDATE_UID = 1061;
15307c5c6f7f02b0ed1b71647558fabdac15bbc8d24Jeff Sharkey
15407c5c6f7f02b0ed1b71647558fabdac15bbc8d24Jeff Sharkey    /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the start of a range of UIDs (and GIDs), going from this
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to applications.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FIRST_APPLICATION_UID = 10000;
160184a0100abc431fc3d6d8dd1b20212b84958cadaJeff Sharkey
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Last of application-specific UIDs starting at
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #FIRST_APPLICATION_UID}.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16521fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn    public static final int LAST_APPLICATION_UID = 19999;
166a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
167a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
168a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * First uid used for fully isolated sandboxed processes (with no permissions of their own)
169a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
170a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
171a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final int FIRST_ISOLATED_UID = 99000;
172a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
173a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
174a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Last uid used for fully isolated sandboxed processes (with no permissions of their own)
175a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
176a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
177a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final int LAST_ISOLATED_UID = 99999;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
180e66b6890ee59d108ae5c608f6ec8d4ad20cb06a8Robin Lee     * Defines the gid shared by all applications running under the same profile.
181e66b6890ee59d108ae5c608f6ec8d4ad20cb06a8Robin Lee     * @hide
182e66b6890ee59d108ae5c608f6ec8d4ad20cb06a8Robin Lee     */
183e66b6890ee59d108ae5c608f6ec8d4ad20cb06a8Robin Lee    public static final int SHARED_USER_GID = 9997;
184e66b6890ee59d108ae5c608f6ec8d4ad20cb06a8Robin Lee
185e66b6890ee59d108ae5c608f6ec8d4ad20cb06a8Robin Lee    /**
186e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * First gid for applications to share resources. Used when forward-locking
187e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * is enabled but all UserHandles need to be able to read the resources.
188e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * @hide
189e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     */
190e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    public static final int FIRST_SHARED_APPLICATION_GID = 50000;
191e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root
192e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    /**
193e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * Last gid for applications to share resources. Used when forward-locking
194e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * is enabled but all UserHandles need to be able to read the resources.
195e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     * @hide
196e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root     */
197e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    public static final int LAST_SHARED_APPLICATION_GID = 59999;
198e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root
1995eb3eb58acf18dd624c477d5b11b45a23aea6261Jeff Sharkey    /** {@hide} */
2005eb3eb58acf18dd624c477d5b11b45a23aea6261Jeff Sharkey    public static final int FIRST_APPLICATION_CACHE_GID = 20000;
2015eb3eb58acf18dd624c477d5b11b45a23aea6261Jeff Sharkey    /** {@hide} */
2025eb3eb58acf18dd624c477d5b11b45a23aea6261Jeff Sharkey    public static final int LAST_APPLICATION_CACHE_GID = 29999;
2035eb3eb58acf18dd624c477d5b11b45a23aea6261Jeff Sharkey
204e091f22e226f7177e45e23850670c1ad9b63fd75Kenny Root    /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of application threads.
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_DEFAULT = 0;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***************************************
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ** Keep in sync with utils/threads.h **
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***************************************
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lowest available thread priority.  Only for those who really, really
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * don't want to run if anything else is happening.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_LOWEST = 19;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority background threads.  This gives your thread a slightly
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lower than normal priority, so that it will have less chance of impacting
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the responsiveness of the user interface.
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_BACKGROUND = 10;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of threads that are currently running a user interface
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the user is interacting with.  Applications can not normally
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority; the system will automatically adjust your
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application threads as the user moves through the UI.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_FOREGROUND = -2;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of system display threads, involved in updating
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user interface.  Applications can not
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normally change to this priority.
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_DISPLAY = -4;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of the most important display threads, for compositing
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the screen and retrieving input events.  Applications can not normally
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of audio threads.  Applications can not normally
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change to this priority.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_AUDIO = -16;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard priority of the most important audio threads.
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applications can not normally change to this priority.
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setThreadPriority(int)} and
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link java.lang.Thread} class.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_URGENT_AUDIO = -19;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Minimum increment to make a priority more favorable.
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Minimum increment to make a priority less favorable.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
296e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
2976793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Default scheduling policy
2986793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
2996793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
3006793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_OTHER = 0;
3016793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
3026793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
3036793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * First-In First-Out scheduling policy
3046793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
3056793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
3066793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_FIFO = 1;
3076793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
3086793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
3096793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Round-Robin scheduling policy
3106793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
3116793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
3126793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_RR = 2;
3136793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
3146793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
3156793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Batch scheduling policy
3166793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
3176793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
3186793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_BATCH = 3;
3196793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
3206793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
3216793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Idle scheduling policy
3226793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @hide
3236793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
3246793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final int SCHED_IDLE = 5;
3256793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
326e535a5827b7b7c7c70f4701d74051c9bb5eb0b98Srinath Sridharan    /**
327e535a5827b7b7c7c70f4701d74051c9bb5eb0b98Srinath Sridharan     * Reset scheduler choice on fork.
328e535a5827b7b7c7c70f4701d74051c9bb5eb0b98Srinath Sridharan     * @hide
329e535a5827b7b7c7c70f4701d74051c9bb5eb0b98Srinath Sridharan     */
330e535a5827b7b7c7c70f4701d74051c9bb5eb0b98Srinath Sridharan    public static final int SCHED_RESET_ON_FORK = 0x40000000;
331e535a5827b7b7c7c70f4701d74051c9bb5eb0b98Srinath Sridharan
332f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // Keep in sync with SP_* constants of enum type SchedPolicy
333f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // declared in system/core/include/cutils/sched_policy.h,
334f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    // except THREAD_GROUP_DEFAULT does not correspond to any SP_* value.
335f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
3366793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
337f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Default thread group -
338f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * has meaning with setProcessGroup() only, cannot be used with setThreadGroup().
339f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * When used with setProcessGroup(), the group of each thread in the process
340f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * is conditionally changed based on that thread's current priority, as follows:
341f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads with priority numerically less than THREAD_PRIORITY_BACKGROUND
342f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * are moved to foreground thread group.  All other threads are left unchanged.
343e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
344e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
345f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    public static final int THREAD_GROUP_DEFAULT = -1;
346e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
347e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
348f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Background thread group - All threads in
349e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * this group are scheduled with a reduced share of the CPU.
350f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Value is same as constant SP_BACKGROUND of enum SchedPolicy.
351f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * FIXME rename to THREAD_GROUP_BACKGROUND.
352e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
353e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
354f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    public static final int THREAD_GROUP_BG_NONINTERACTIVE = 0;
355e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
356e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
357f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Foreground thread group - All threads in
358f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * this group are scheduled with a normal share of the CPU.
359f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Value is same as constant SP_FOREGROUND of enum SchedPolicy.
360f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * Not used at this level.
361e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
362e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     **/
363f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten    private static final int THREAD_GROUP_FOREGROUND = 1;
364e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
36507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
36607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * System thread group.
36707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
36807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
36907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_SYSTEM = 2;
37007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
37107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
37207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Application audio thread group.
37307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
37407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
37507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_AUDIO_APP = 3;
37607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
37707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
37807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * System audio thread group.
37907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
38007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     **/
38107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int THREAD_GROUP_AUDIO_SYS = 4;
38207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
383ece6a22f00de4ab815588e2f7951203adcd2b9c4Tim Murray    /**
384ece6a22f00de4ab815588e2f7951203adcd2b9c4Tim Murray     * Thread group for top foreground app.
385ece6a22f00de4ab815588e2f7951203adcd2b9c4Tim Murray     * @hide
386ece6a22f00de4ab815588e2f7951203adcd2b9c4Tim Murray     **/
387ece6a22f00de4ab815588e2f7951203adcd2b9c4Tim Murray    public static final int THREAD_GROUP_TOP_APP = 5;
388ece6a22f00de4ab815588e2f7951203adcd2b9c4Tim Murray
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_QUIT = 3;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_KILL = 9;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SIGNAL_USR1 = 10;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
393d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    private static long sStartElapsedRealtime;
394d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    private static long sStartUptimeMillis;
395d98885c128e7045da244098d82751da6e792d677Dianne Hackborn
3964444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    /**
3978f8d187a78b48109911a800ba5993b645d3015c5Robert Sesek     * State associated with the zygote process.
3988f8d187a78b48109911a800ba5993b645d3015c5Robert Sesek     * @hide
3994444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath     */
4008f8d187a78b48109911a800ba5993b645d3015c5Robert Sesek    public static final ZygoteProcess zygoteProcess =
4018f8d187a78b48109911a800ba5993b645d3015c5Robert Sesek            new ZygoteProcess(ZYGOTE_SOCKET, SECONDARY_ZYGOTE_SOCKET);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start a new process.
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If processes are enabled, a new process is created and the
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * static main() function of a <var>processClass</var> is executed there.
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The process will continue running after this function returns.
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If processes are not enabled, a new thread in the caller's
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process is created and main() of <var>processClass</var> called there.
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The niceName parameter, if not an empty string, is a custom name to
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * give to the process instead of using processClass.  This allows you to
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * make easily identifyable processes even if you are using the same base
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>processClass</var> to start them.
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
418b8f7c351b97da590a4bd8da3dddbab166f9f789dTamas Berghammer     * When invokeWith is not null, the process will be started as a fresh app
4190ca16fa58454b1685afcf8cf49c4b67b59221349Tamas Berghammer     * and not a zygote fork. Note that this is only allowed for uid 0 or when
4200ca16fa58454b1685afcf8cf49c4b67b59221349Tamas Berghammer     * debugFlags contains DEBUG_ENABLE_DEBUGGER.
421b8f7c351b97da590a4bd8da3dddbab166f9f789dTamas Berghammer     *
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param processClass The class to use as the process's main entry
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     point.
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param niceName A more readable name to use for the process.
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uid The user-id under which the process will run.
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gid The group-id under which the process will run.
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gids Additional group-ids associated with the process.
428e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param debugFlags Additional flags.
429e1dfcb7ab01fb991079ec1f70f75281a0ca9073eElliott Hughes     * @param targetSdkVersion The target SDK version for the app.
430bd19b9ee305c11d8aa3cbb105bf2d3a6b06389b5Stephen Smalley     * @param seInfo null-ok SELinux information for the new process.
431ff0c470833b2cb4130a30895093630242d5f238dRamin Zaghi     * @param abi non-null the ABI this app should be started with.
432aec67dcc02362e4d2f7641c6605405b839bd1bd4Andreas Gampe     * @param instructionSet null-ok the instruction set to use.
4332eacd06bfb82b33dfcbccafbcfc0bf1218484bb5jgu     * @param appDataDir null-ok the data directory of the app.
434b8f7c351b97da590a4bd8da3dddbab166f9f789dTamas Berghammer     * @param invokeWith null-ok the command to invoke with.
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param zygoteArgs Additional arguments to supply to the zygote process.
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4373f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @return An object that describes the result of the attempt to start the process.
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws RuntimeException on fatal start failure
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4423f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final ProcessStartResult start(final String processClass,
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  final String niceName,
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  int uid, int gid, int[] gids,
4455b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int debugFlags, int mountExternal,
4465b1ada2562c17921adf6a62ea62bcb445160983cJeff Sharkey                                  int targetSdkVersion,
44783d9eda9c2c411e3480c52f01e192bf3c86be8e9Stephen Smalley                                  String seInfo,
448ff0c470833b2cb4130a30895093630242d5f238dRamin Zaghi                                  String abi,
449aec67dcc02362e4d2f7641c6605405b839bd1bd4Andreas Gampe                                  String instructionSet,
4502eacd06bfb82b33dfcbccafbcfc0bf1218484bb5jgu                                  String appDataDir,
451b8f7c351b97da590a4bd8da3dddbab166f9f789dTamas Berghammer                                  String invokeWith,
45210e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown                                  String[] zygoteArgs) {
4538f8d187a78b48109911a800ba5993b645d3015c5Robert Sesek        return zygoteProcess.start(processClass, niceName, uid, gid, gids,
4544444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath                    debugFlags, mountExternal, targetSdkVersion, seInfo,
455b8f7c351b97da590a4bd8da3dddbab166f9f789dTamas Berghammer                    abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
4564444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath    }
4574444dcd0adc7e035cca030b90ed91f0cff9a772bNarayan Kamath
458ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    /** @hide */
459ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    public static final ProcessStartResult startWebView(final String processClass,
460ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  final String niceName,
461ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  int uid, int gid, int[] gids,
462ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  int debugFlags, int mountExternal,
463ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  int targetSdkVersion,
464ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  String seInfo,
465ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  String abi,
466ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  String instructionSet,
467ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  String appDataDir,
468b8f7c351b97da590a4bd8da3dddbab166f9f789dTamas Berghammer                                  String invokeWith,
469ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                                  String[] zygoteArgs) {
470ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
471ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek                    debugFlags, mountExternal, targetSdkVersion, seInfo,
472b8f7c351b97da590a4bd8da3dddbab166f9f789dTamas Berghammer                    abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
473ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    }
474ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns elapsed milliseconds of the time this process has run.
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return  Returns the number of milliseconds this process has return.
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getElapsedCpuTime();
480ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampe
481ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampe    /**
482d98885c128e7045da244098d82751da6e792d677Dianne Hackborn     * Return the {@link SystemClock#elapsedRealtime()} at which this process was started.
483d98885c128e7045da244098d82751da6e792d677Dianne Hackborn     */
484d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    public static final long getStartElapsedRealtime() {
485d98885c128e7045da244098d82751da6e792d677Dianne Hackborn        return sStartElapsedRealtime;
486d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    }
487d98885c128e7045da244098d82751da6e792d677Dianne Hackborn
488d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    /**
489d98885c128e7045da244098d82751da6e792d677Dianne Hackborn     * Return the {@link SystemClock#uptimeMillis()} at which this process was started.
490d98885c128e7045da244098d82751da6e792d677Dianne Hackborn     */
491d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    public static final long getStartUptimeMillis() {
492d98885c128e7045da244098d82751da6e792d677Dianne Hackborn        return sStartUptimeMillis;
493d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    }
494d98885c128e7045da244098d82751da6e792d677Dianne Hackborn
495d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    /** @hide */
496d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    public static final void setStartTimes(long elapsedRealtime, long uptimeMillis) {
497d98885c128e7045da244098d82751da6e792d677Dianne Hackborn        sStartElapsedRealtime = elapsedRealtime;
498d98885c128e7045da244098d82751da6e792d677Dianne Hackborn        sStartUptimeMillis = uptimeMillis;
499d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    }
500d98885c128e7045da244098d82751da6e792d677Dianne Hackborn
501d98885c128e7045da244098d82751da6e792d677Dianne Hackborn    /**
502ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampe     * Returns true if the current process is a 64-bit runtime.
503ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampe     */
504ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampe    public static final boolean is64Bit() {
505ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampe        return VMRuntime.getRuntime().is64Bit();
506ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampe    }
507ee0cdce2a80f8cc033378134e37092bc467c0f38Andreas Gampe
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of this process, which can be used with
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #killProcess} and {@link #sendSignal}.
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
512406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    public static final int myPid() {
51334385d352da19805ae948215e2edbeedd16b7941Elliott Hughes        return Os.getpid();
514406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    }
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
51780b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     * Returns the identifier of this process' parent.
51880b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     * @hide
51980b12fcaaec458377d966803c3a61504f0897ea1Romain Guy     */
5202a805f930463ece57bc0d0fd8dee7f5d50681b22Elliott Hughes    public static final int myPpid() {
52134385d352da19805ae948215e2edbeedd16b7941Elliott Hughes        return Os.getppid();
5222a805f930463ece57bc0d0fd8dee7f5d50681b22Elliott Hughes    }
52380b12fcaaec458377d966803c3a61504f0897ea1Romain Guy
52480b12fcaaec458377d966803c3a61504f0897ea1Romain Guy    /**
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the identifier of the calling thread, which be used with
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)}.
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5286d4b1e24aef5b74b40de4d8f6e63c21874ce8e3aElliott Hughes    public static final int myTid() {
52934385d352da19805ae948215e2edbeedd16b7941Elliott Hughes        return Os.gettid();
5306d4b1e24aef5b74b40de4d8f6e63c21874ce8e3aElliott Hughes    }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5337d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * Returns the identifier of this process's uid.  This is the kernel uid
5347d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * that the process is running under, which is the identity of its
5357d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * app-specific sandbox.  It is different from {@link #myUserHandle} in that
5367d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * a uid identifies a specific app sandbox in a specific user.
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
538406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    public static final int myUid() {
53934385d352da19805ae948215e2edbeedd16b7941Elliott Hughes        return Os.getuid();
540406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao    }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
54379af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn     * Returns this process's user handle.  This is the
5447d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * user the process is running under.  It is distinct from
5457d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * {@link #myUid()} in that a particular user will have multiple
5467d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     * distinct apps running under it each with their own uid.
5477d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn     */
54802cb6e773b323a0d54b21f43460a23f668b7727cFyodor Kupolov    public static UserHandle myUserHandle() {
54902cb6e773b323a0d54b21f43460a23f668b7727cFyodor Kupolov        return UserHandle.of(UserHandle.getUserId(myUid()));
5507d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
5517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
5527d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    /**
55348aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson     * Returns whether the given uid belongs to an application.
55448aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson     * @param uid A kernel uid.
55548aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson     * @return Whether the uid corresponds to an application sandbox running in
55648aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson     *     a specific user.
55748aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson     */
55848aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson    public static boolean isApplicationUid(int uid) {
55948aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson        return UserHandle.isApp(uid);
56048aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson    }
56148aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson
56248aa86bd0b30815f4c02561f713bd33b032ef2b7Jeff Davidson    /**
563a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Returns whether the current process is in an isolated sandbox.
564a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * @hide
565a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
566a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final boolean isIsolated() {
5679527b223a9d4a4d149bb005afc77148dbeeff785Jeff Sharkey        return isIsolated(myUid());
5689527b223a9d4a4d149bb005afc77148dbeeff785Jeff Sharkey    }
5699527b223a9d4a4d149bb005afc77148dbeeff785Jeff Sharkey
5709527b223a9d4a4d149bb005afc77148dbeeff785Jeff Sharkey    /** {@hide} */
5719527b223a9d4a4d149bb005afc77148dbeeff785Jeff Sharkey    public static final boolean isIsolated(int uid) {
5729527b223a9d4a4d149bb005afc77148dbeeff785Jeff Sharkey        uid = UserHandle.getAppId(uid);
573a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn        return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID;
574a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    }
575a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
576a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the UID assigned to a particular user name, or -1 if there is
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a uid.
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getUidForName(String name);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the GID assigned to a particular user name, or -1 if there is
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * none.  If the given string consists of only numbers, it is converted
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directly to a gid.
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getGidForName(String name);
589819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
590819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    /**
591819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * Returns a uid for a currently running process.
592819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @param pid the process id
593819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @return the uid of the process, or -1 if the process is not running.
594819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     * @hide pending API council review
595819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani     */
596819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public static final int getUidForPid(int pid) {
597819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        String[] procStatusLabels = { "Uid:" };
598819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        long[] procStatusValues = new long[1];
599819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        procStatusValues[0] = -1;
600819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
601819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani        return (int) procStatusValues[0];
602819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    }
603819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
605ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * Returns the parent process id for a currently running process.
606ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @param pid the process id
607ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @return the parent process id of the process, or -1 if the process is not running.
608ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     * @hide
609ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown     */
610ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    public static final int getParentPid(int pid) {
611ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        String[] procStatusLabels = { "PPid:" };
612ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        long[] procStatusValues = new long[1];
613ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        procStatusValues[0] = -1;
614ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
615ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown        return (int) procStatusValues[0];
616ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    }
617ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown
618ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown    /**
61907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * Returns the thread group leader id for a currently running thread.
62007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @param tid the thread id
62107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @return the thread group leader id of the thread, or -1 if the thread is not running.
62207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     *         This is same as what getpid(2) would return if called by tid.
62307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     * @hide
62407b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten     */
62507b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    public static final int getThreadGroupLeader(int tid) {
62607b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        String[] procStatusLabels = { "Tgid:" };
62707b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        long[] procStatusValues = new long[1];
62807b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        procStatusValues[0] = -1;
62907b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        Process.readProcLines("/proc/" + tid + "/status", procStatusLabels, procStatusValues);
63007b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten        return (int) procStatusValues[0];
63107b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    }
63207b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten
63307b0465095bd9ab3412caefa4fcacbdc3825c64bGlenn Kasten    /**
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of a thread, based on Linux priorities.
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int tid, int priority)
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
648e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
649e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
650160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * Call with 'false' to cause future calls to {@link #setThreadPriority(int)} to
651160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * throw an exception if passed a background-level thread priority.  This is only
652160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * effective if the JNI layer is built with GUARD_THREAD_PRIORITY defined to 1.
653160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     *
654160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     * @hide
655160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate     */
656160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    public static final native void setCanSelfBackground(boolean backgroundOk);
657160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate
658160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate    /**
659e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * Sets the scheduling group for a thread.
660e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @hide
661f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param tid The identifier of the thread to change.
662f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this thread from THREAD_GROUP_*.
6632d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     *
664e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
665e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * <var>tid</var> does not exist.
666e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * @throws SecurityException Throws SecurityException if your process does
667e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * not have permission to modify the given thread, or to use the given
668e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * priority.
669f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * If the thread is a thread group leader, that is it's gettid() == getpid(),
670f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * then the other threads in the same thread group are _not_ affected.
6714074ad01e898605c64a80a8cb14c10bdbedf1bdbTim Murray     *
6724074ad01e898605c64a80a8cb14c10bdbedf1bdbTim Murray     * Does not set cpuset for some historical reason, just calls
6734074ad01e898605c64a80a8cb14c10bdbedf1bdbTim Murray     * libcutils::set_sched_policy().
674e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
675e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    public static final native void setThreadGroup(int tid, int group)
676e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat            throws IllegalArgumentException, SecurityException;
677f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten
6783e458241d9930465a20a861ecb42744355d48e48San Mehat    /**
6792d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * Sets the scheduling group and the corresponding cpuset group
6802d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * @hide
6812d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * @param tid The identifier of the thread to change.
6822d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * @param group The target group for this thread from THREAD_GROUP_*.
6832d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     *
6842d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * @throws IllegalArgumentException Throws IllegalArgumentException if
6852d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * <var>tid</var> does not exist.
6862d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * @throws SecurityException Throws SecurityException if your process does
6872d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * not have permission to modify the given thread, or to use the given
6882d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     * priority.
6892d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes     */
6902d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes    public static final native void setThreadGroupAndCpuset(int tid, int group)
6912d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes            throws IllegalArgumentException, SecurityException;
6922d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes
6932d314e15c9f0b2efc817b6111d808248a546f48cJoel Fernandes    /**
6943e458241d9930465a20a861ecb42744355d48e48San Mehat     * Sets the scheduling group for a process and all child threads
6953e458241d9930465a20a861ecb42744355d48e48San Mehat     * @hide
696f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param pid The identifier of the process to change.
697f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * @param group The target group for this process from THREAD_GROUP_*.
6983e458241d9930465a20a861ecb42744355d48e48San Mehat     *
6993e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws IllegalArgumentException Throws IllegalArgumentException if
7003e458241d9930465a20a861ecb42744355d48e48San Mehat     * <var>tid</var> does not exist.
7013e458241d9930465a20a861ecb42744355d48e48San Mehat     * @throws SecurityException Throws SecurityException if your process does
7023e458241d9930465a20a861ecb42744355d48e48San Mehat     * not have permission to modify the given thread, or to use the given
7033e458241d9930465a20a861ecb42744355d48e48San Mehat     * priority.
704f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     *
705f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_DEFAULT means to move all non-background priority
706f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads to the foreground scheduling group, but to leave background
707f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * priority threads alone.  group == THREAD_GROUP_BG_NONINTERACTIVE moves all
708f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * threads, regardless of priority, to the background scheduling group.
709f1b56449f58963e4f0473d5e26961f68c31759f4Glenn Kasten     * group == THREAD_GROUP_FOREGROUND is not allowed.
7104074ad01e898605c64a80a8cb14c10bdbedf1bdbTim Murray     *
7114074ad01e898605c64a80a8cb14c10bdbedf1bdbTim Murray     * Always sets cpusets.
7123e458241d9930465a20a861ecb42744355d48e48San Mehat     */
7133e458241d9930465a20a861ecb42744355d48e48San Mehat    public static final native void setProcessGroup(int pid, int group)
7143e458241d9930465a20a861ecb42744355d48e48San Mehat            throws IllegalArgumentException, SecurityException;
7159e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey
7169e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey    /**
7179e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     * Return the scheduling group of requested process.
7189e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     *
7199e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     * @hide
7209e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey     */
7219e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey    public static final native int getProcessGroup(int pid)
7229e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey            throws IllegalArgumentException, SecurityException;
7239e57c414f39e1a31349bc215635fdcfaf1902ceeJeff Sharkey
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
725cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * On some devices, the foreground process may have one or more CPU
726cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * cores exclusively reserved for it. This method can be used to
727cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * retrieve which cores that are (if any), so the calling process
728cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * can then use sched_setaffinity() to lock a thread to these cores.
729cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * Note that the calling process must currently be running in the
730cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * foreground for this method to return any cores.
731cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     *
732cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * The CPU core(s) exclusively reserved for the foreground process will
733cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * stay reserved for as long as the process stays in the foreground.
734cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     *
735cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * As soon as a process leaves the foreground, those CPU cores will
736cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * no longer be reserved for it, and will most likely be reserved for
737cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * the new foreground process. It's not necessary to change the affinity
738cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * of your process when it leaves the foreground (if you had previously
739cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * set it to use a reserved core); the OS will automatically take care
740cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * of resetting the affinity at that point.
741cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     *
742cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * @return an array of integers, indicating the CPU cores exclusively
743cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * reserved for this process. The array will have length zero if no
744cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * CPU cores are exclusively reserved for this process at this point
745cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     * in time.
746cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen     */
747cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen    public static final native int[] getExclusiveCores();
748cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen
749cd4bdf3eb91c1cc2757d32a86fc90745d0dff990Martijn Coenen    /**
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the priority of the calling thread, based on Linux priorities.  See
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setThreadPriority(int, int)} for more information.
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param priority A Linux priority level, from -20 for highest scheduling
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority to 19 for lowest scheduling priority.
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws SecurityException Throws SecurityException if your process does
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not have permission to modify the given thread, or to use the given
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setThreadPriority(int, int)
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setThreadPriority(int priority)
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException, SecurityException;
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the current priority of a thread, based on Linux priorities.
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tid The identifier of the thread/process to change.
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the current priority, as a Linux priority level,
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from -20 for highest scheduling priority to 19 for lowest scheduling
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException Throws IllegalArgumentException if
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>tid</var> does not exist.
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getThreadPriority(int tid)
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7831b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     * Return the current scheduling policy of a thread, based on Linux.
7841b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     *
7851b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     * @param tid The identifier of the thread/process to get the scheduling policy.
7861b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     *
7871b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     * @throws IllegalArgumentException Throws IllegalArgumentException if
7881b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy.
7891b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     * @throws SecurityException Throws SecurityException if your process does
7901b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     * not have permission to modify the given thread, or to use the given
7911b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     * scheduling policy or priority.
7921b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     *
7931b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     * {@hide}
7941b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan     */
7951b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan
7961b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan    @TestApi
7971b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan    public static final native int getThreadScheduler(int tid)
7981b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan            throws IllegalArgumentException;
7991b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan
8001b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan    /**
8016793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * Set the scheduling policy and priority of a thread, based on Linux.
8026793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8036793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param tid The identifier of the thread/process to change.
8046793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param policy A Linux scheduling policy such as SCHED_OTHER etc.
8056793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @param priority A Linux priority level in a range appropriate for the given policy.
8066793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8076793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws IllegalArgumentException Throws IllegalArgumentException if
8086793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy.
8096793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * @throws SecurityException Throws SecurityException if your process does
8106793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * not have permission to modify the given thread, or to use the given
8116793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * scheduling policy or priority.
8126793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     *
8136793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     * {@hide}
8146793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten     */
8151b15d13243d7e7f672713f21f0c46d88c3c067a2Srinath Sridharan
8166793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    public static final native void setThreadScheduler(int tid, int policy, int priority)
8176793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten            throws IllegalArgumentException;
8186793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten
8196793ac943afeb16642f477c43ddfd27e498db37bGlenn Kasten    /**
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determine whether the current environment supports multiple processes.
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the system can run in multiple processes, else
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * false if everything is running in a single process.
82410e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     *
82510e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown     * @deprecated This method always returns true.  Do not use.
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
82710e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    @Deprecated
82810e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    public static final boolean supportsProcesses() {
82910e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        return true;
83010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8335534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * Adjust the swappiness level for a process.
8345534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
8355534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @param pid The process identifier to set.
8365534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @param is_increased Whether swappiness should be increased or default.
8375534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
8385534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * @return Returns true if the underlying system supports this
8395534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *         feature, else false.
8405534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     *
8415534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     * {@hide}
8425534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand     */
8435534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand    public static final native boolean setSwappiness(int pid, boolean is_increased);
8445534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand
8455534ba91ac0a0c9af822af62bcf92e2c5a8d6ec8Rom Lemarchand    /**
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change this process's argv[0] parameter.  This can be useful to show
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * more descriptive information in things like the 'ps' command.
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The new name of this process.
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void setArgV0(String text);
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Kill the process with the given PID.
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that, though this API allows us to request to
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * kill any process based on its PID, the kernel will
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * still impose standard restrictions on which PIDs you
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are actually able to kill.  Typically this means only
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the process running the caller's packages/application
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and any additional processes created by that app; packages
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sharing a common UID will also be able to kill each
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * other's processes.
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final void killProcess(int pid) {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendSignal(pid, SIGNAL_KILL);
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setUid(int uid);
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int setGid(int uid);
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send a signal to the given process.
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid The pid of the target process.
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param signal The signal to send.
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void sendSignal(int pid, int signal);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
884906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
885906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
886906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
887906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
888906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
889906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
890906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final void killProcessQuiet(int pid) {
891906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn        sendSignalQuiet(pid, SIGNAL_KILL);
892906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    }
893906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
894906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    /**
895906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * @hide
896906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * Private impl for avoiding a log message...  DO NOT USE without doing
897906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * your own log, or the Android Illuminati will find you some night and
898906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     * beat you up.
899906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn     */
900906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn    public static final native void sendSignalQuiet(int pid, int signal);
901906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9030bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen    public static final native long getFreeMemory();
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
90659325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    public static final native long getTotalMemory();
90759325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn
90859325eb31f25704bb88c348160bb69e7c1aa3b48Dianne Hackborn    /** @hide */
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void readProcLines(String path,
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] reqFields, long[] outSizes);
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int[] getPids(String path, int[] lastArray);
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_TERM_MASK = 0xff;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_ZERO_TERM = 0;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_SPACE_TERM = (int)' ';
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
922c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final int PROC_TAB_TERM = (int)'\t';
923c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_COMBINE = 0x100;
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_PARENS = 0x200;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
92813ac041b9f21043bc7c848a743be618bfd7a67e9Dianne Hackborn    public static final int PROC_QUOTES = 0x400;
92913ac041b9f21043bc7c848a743be618bfd7a67e9Dianne Hackborn    /** @hide */
9304de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn    public static final int PROC_CHAR = 0x800;
9314de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn    /** @hide */
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_STRING = 0x1000;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_LONG = 0x2000;
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROC_OUT_FLOAT = 0x4000;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native boolean readProcFile(String file, int[] format,
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outStrings, long[] outLongs, float[] outFloats);
941c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
942c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /** @hide */
943c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final native boolean parseProcLine(byte[] buffer, int startIndex,
944c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            int endIndex, int[] format, String[] outStrings, long[] outLongs, float[] outFloats);
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
946f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    /** @hide */
947f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn    public static final native int[] getPidsForCommands(String[] cmds);
948f72467ad9843bf5d4b75fb308386e77ebb5c3447Dianne Hackborn
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the total Pss value for a given process, in bytes.
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pid the process to the Pss for
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the total Pss value for the given process in bytes,
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  or -1 if the value cannot be determined
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long getPss(int pid);
9583f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
9593f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    /**
9603f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * Specifies the outcome of having started a process.
9613f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     * @hide
9623f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown     */
9633f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    public static final class ProcessStartResult {
9643f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
9653f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * The PID of the newly started process.
9663f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * Always >= 0.  (If the start failed, an exception will have been thrown instead.)
9673f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
9683f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public int pid;
9693f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
9703f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        /**
9713f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         * True if the process was started with a wrapper attached.
9723f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown         */
9733f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown        public boolean usingWrapper;
9743f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown    }
9750769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross
9760769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross    /**
9770769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross     * Kill all processes in a process group started for the given
9780769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross     * pid.
9790769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross     * @hide
9800769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross     */
9810769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross    public static final native int killProcessGroup(int uid, int pid);
9820769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross
9830769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross    /**
9840769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross     * Remove all process groups.  Expected to be called when ActivityManager
9850769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross     * is restarted.
9860769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross     * @hide
9870769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross     */
9880769e550011d8f8a19e333efe1706ef0e6cc6a5fColin Cross    public static final native void removeAllProcessGroups();
989b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray
990b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray    /**
991b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray     * Check to see if a thread belongs to a given process. This may require
992b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray     * more permissions than apps generally have.
993b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray     * @return true if this thread belongs to a process
994b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray     * @hide
995b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray     */
996b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray    public static final boolean isThreadInProcess(int tid, int pid) {
9979bc12a83b6768c15807c009441d486f82135d383Tim Murray        StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
998b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray        try {
999b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray            if (Os.access("/proc/" + tid + "/task/" + pid, OsConstants.F_OK)) {
1000b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray                return true;
1001b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray            } else {
1002b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray                return false;
1003b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray            }
1004b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray        } catch (Exception e) {
1005b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray            return false;
10069bc12a83b6768c15807c009441d486f82135d383Tim Murray        } finally {
10079bc12a83b6768c15807c009441d486f82135d383Tim Murray            StrictMode.setThreadPolicy(oldPolicy);
1008b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray        }
10099bc12a83b6768c15807c009441d486f82135d383Tim Murray
1010b89970e0fb11b71592e10570d387eac3bbb6f6d6Tim Murray    }
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1012