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