Home | History | Annotate | Download | only in os
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.os;
     18 
     19 import android.annotation.TestApi;
     20 import android.system.Os;
     21 import android.system.OsConstants;
     22 import android.util.Log;
     23 import android.webkit.WebViewZygote;
     24 import dalvik.system.VMRuntime;
     25 
     26 /**
     27  * Tools for managing OS processes.
     28  */
     29 public class Process {
     30     private static final String LOG_TAG = "Process";
     31 
     32     /**
     33      * @hide for internal use only.
     34      */
     35     public static final String ZYGOTE_SOCKET = "zygote";
     36 
     37     /**
     38      * @hide for internal use only.
     39      */
     40     public static final String SECONDARY_ZYGOTE_SOCKET = "zygote_secondary";
     41 
     42     /**
     43      * Defines the root UID.
     44      * @hide
     45      */
     46     public static final int ROOT_UID = 0;
     47 
     48     /**
     49      * Defines the UID/GID under which system code runs.
     50      */
     51     public static final int SYSTEM_UID = 1000;
     52 
     53     /**
     54      * Defines the UID/GID under which the telephony code runs.
     55      */
     56     public static final int PHONE_UID = 1001;
     57 
     58     /**
     59      * Defines the UID/GID for the user shell.
     60      * @hide
     61      */
     62     public static final int SHELL_UID = 2000;
     63 
     64     /**
     65      * Defines the UID/GID for the log group.
     66      * @hide
     67      */
     68     public static final int LOG_UID = 1007;
     69 
     70     /**
     71      * Defines the UID/GID for the WIFI supplicant process.
     72      * @hide
     73      */
     74     public static final int WIFI_UID = 1010;
     75 
     76     /**
     77      * Defines the UID/GID for the mediaserver process.
     78      * @hide
     79      */
     80     public static final int MEDIA_UID = 1013;
     81 
     82     /**
     83      * Defines the UID/GID for the DRM process.
     84      * @hide
     85      */
     86     public static final int DRM_UID = 1019;
     87 
     88     /**
     89      * Defines the UID/GID for the group that controls VPN services.
     90      * @hide
     91      */
     92     public static final int VPN_UID = 1016;
     93 
     94     /**
     95      * Defines the UID/GID for keystore.
     96      * @hide
     97      */
     98     public static final int KEYSTORE_UID = 1017;
     99 
    100     /**
    101      * Defines the UID/GID for the NFC service process.
    102      * @hide
    103      */
    104     public static final int NFC_UID = 1027;
    105 
    106     /**
    107      * Defines the UID/GID for the Bluetooth service process.
    108      * @hide
    109      */
    110     public static final int BLUETOOTH_UID = 1002;
    111 
    112     /**
    113      * Defines the GID for the group that allows write access to the internal media storage.
    114      * @hide
    115      */
    116     public static final int MEDIA_RW_GID = 1023;
    117 
    118     /**
    119      * Access to installed package details
    120      * @hide
    121      */
    122     public static final int PACKAGE_INFO_GID = 1032;
    123 
    124     /**
    125      * Defines the UID/GID for the shared RELRO file updater process.
    126      * @hide
    127      */
    128     public static final int SHARED_RELRO_UID = 1037;
    129 
    130     /**
    131      * Defines the UID/GID for the audioserver process.
    132      * @hide
    133      */
    134     public static final int AUDIOSERVER_UID = 1041;
    135 
    136     /**
    137      * Defines the UID/GID for the cameraserver process
    138      * @hide
    139      */
    140     public static final int CAMERASERVER_UID = 1047;
    141 
    142     /**
    143      * Defines the UID/GID for the WebView zygote process.
    144      * @hide
    145      */
    146     public static final int WEBVIEW_ZYGOTE_UID = 1051;
    147 
    148     /**
    149      * Defines the UID used for resource tracking for OTA updates.
    150      * @hide
    151      */
    152     public static final int OTA_UPDATE_UID = 1061;
    153 
    154     /**
    155      * Defines the start of a range of UIDs (and GIDs), going from this
    156      * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning
    157      * to applications.
    158      */
    159     public static final int FIRST_APPLICATION_UID = 10000;
    160 
    161     /**
    162      * Last of application-specific UIDs starting at
    163      * {@link #FIRST_APPLICATION_UID}.
    164      */
    165     public static final int LAST_APPLICATION_UID = 19999;
    166 
    167     /**
    168      * First uid used for fully isolated sandboxed processes (with no permissions of their own)
    169      * @hide
    170      */
    171     public static final int FIRST_ISOLATED_UID = 99000;
    172 
    173     /**
    174      * Last uid used for fully isolated sandboxed processes (with no permissions of their own)
    175      * @hide
    176      */
    177     public static final int LAST_ISOLATED_UID = 99999;
    178 
    179     /**
    180      * Defines the gid shared by all applications running under the same profile.
    181      * @hide
    182      */
    183     public static final int SHARED_USER_GID = 9997;
    184 
    185     /**
    186      * First gid for applications to share resources. Used when forward-locking
    187      * is enabled but all UserHandles need to be able to read the resources.
    188      * @hide
    189      */
    190     public static final int FIRST_SHARED_APPLICATION_GID = 50000;
    191 
    192     /**
    193      * Last gid for applications to share resources. Used when forward-locking
    194      * is enabled but all UserHandles need to be able to read the resources.
    195      * @hide
    196      */
    197     public static final int LAST_SHARED_APPLICATION_GID = 59999;
    198 
    199     /** {@hide} */
    200     public static final int FIRST_APPLICATION_CACHE_GID = 20000;
    201     /** {@hide} */
    202     public static final int LAST_APPLICATION_CACHE_GID = 29999;
    203 
    204     /**
    205      * Standard priority of application threads.
    206      * Use with {@link #setThreadPriority(int)} and
    207      * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
    208      * {@link java.lang.Thread} class.
    209      */
    210     public static final int THREAD_PRIORITY_DEFAULT = 0;
    211 
    212     /*
    213      * ***************************************
    214      * ** Keep in sync with utils/threads.h **
    215      * ***************************************
    216      */
    217 
    218     /**
    219      * Lowest available thread priority.  Only for those who really, really
    220      * don't want to run if anything else is happening.
    221      * Use with {@link #setThreadPriority(int)} and
    222      * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
    223      * {@link java.lang.Thread} class.
    224      */
    225     public static final int THREAD_PRIORITY_LOWEST = 19;
    226 
    227     /**
    228      * Standard priority background threads.  This gives your thread a slightly
    229      * lower than normal priority, so that it will have less chance of impacting
    230      * the responsiveness of the user interface.
    231      * Use with {@link #setThreadPriority(int)} and
    232      * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
    233      * {@link java.lang.Thread} class.
    234      */
    235     public static final int THREAD_PRIORITY_BACKGROUND = 10;
    236 
    237     /**
    238      * Standard priority of threads that are currently running a user interface
    239      * that the user is interacting with.  Applications can not normally
    240      * change to this priority; the system will automatically adjust your
    241      * application threads as the user moves through the UI.
    242      * Use with {@link #setThreadPriority(int)} and
    243      * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
    244      * {@link java.lang.Thread} class.
    245      */
    246     public static final int THREAD_PRIORITY_FOREGROUND = -2;
    247 
    248     /**
    249      * Standard priority of system display threads, involved in updating
    250      * the user interface.  Applications can not
    251      * normally change to this priority.
    252      * Use with {@link #setThreadPriority(int)} and
    253      * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
    254      * {@link java.lang.Thread} class.
    255      */
    256     public static final int THREAD_PRIORITY_DISPLAY = -4;
    257 
    258     /**
    259      * Standard priority of the most important display threads, for compositing
    260      * the screen and retrieving input events.  Applications can not normally
    261      * change to this priority.
    262      * Use with {@link #setThreadPriority(int)} and
    263      * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
    264      * {@link java.lang.Thread} class.
    265      */
    266     public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8;
    267 
    268     /**
    269      * Standard priority of audio threads.  Applications can not normally
    270      * change to this priority.
    271      * Use with {@link #setThreadPriority(int)} and
    272      * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
    273      * {@link java.lang.Thread} class.
    274      */
    275     public static final int THREAD_PRIORITY_AUDIO = -16;
    276 
    277     /**
    278      * Standard priority of the most important audio threads.
    279      * Applications can not normally change to this priority.
    280      * Use with {@link #setThreadPriority(int)} and
    281      * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal
    282      * {@link java.lang.Thread} class.
    283      */
    284     public static final int THREAD_PRIORITY_URGENT_AUDIO = -19;
    285 
    286     /**
    287      * Minimum increment to make a priority more favorable.
    288      */
    289     public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1;
    290 
    291     /**
    292      * Minimum increment to make a priority less favorable.
    293      */
    294     public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1;
    295 
    296     /**
    297      * Default scheduling policy
    298      * @hide
    299      */
    300     public static final int SCHED_OTHER = 0;
    301 
    302     /**
    303      * First-In First-Out scheduling policy
    304      * @hide
    305      */
    306     public static final int SCHED_FIFO = 1;
    307 
    308     /**
    309      * Round-Robin scheduling policy
    310      * @hide
    311      */
    312     public static final int SCHED_RR = 2;
    313 
    314     /**
    315      * Batch scheduling policy
    316      * @hide
    317      */
    318     public static final int SCHED_BATCH = 3;
    319 
    320     /**
    321      * Idle scheduling policy
    322      * @hide
    323      */
    324     public static final int SCHED_IDLE = 5;
    325 
    326     /**
    327      * Reset scheduler choice on fork.
    328      * @hide
    329      */
    330     public static final int SCHED_RESET_ON_FORK = 0x40000000;
    331 
    332     // Keep in sync with SP_* constants of enum type SchedPolicy
    333     // declared in system/core/include/cutils/sched_policy.h,
    334     // except THREAD_GROUP_DEFAULT does not correspond to any SP_* value.
    335 
    336     /**
    337      * Default thread group -
    338      * has meaning with setProcessGroup() only, cannot be used with setThreadGroup().
    339      * When used with setProcessGroup(), the group of each thread in the process
    340      * is conditionally changed based on that thread's current priority, as follows:
    341      * threads with priority numerically less than THREAD_PRIORITY_BACKGROUND
    342      * are moved to foreground thread group.  All other threads are left unchanged.
    343      * @hide
    344      */
    345     public static final int THREAD_GROUP_DEFAULT = -1;
    346 
    347     /**
    348      * Background thread group - All threads in
    349      * this group are scheduled with a reduced share of the CPU.
    350      * Value is same as constant SP_BACKGROUND of enum SchedPolicy.
    351      * FIXME rename to THREAD_GROUP_BACKGROUND.
    352      * @hide
    353      */
    354     public static final int THREAD_GROUP_BG_NONINTERACTIVE = 0;
    355 
    356     /**
    357      * Foreground thread group - All threads in
    358      * this group are scheduled with a normal share of the CPU.
    359      * Value is same as constant SP_FOREGROUND of enum SchedPolicy.
    360      * Not used at this level.
    361      * @hide
    362      **/
    363     private static final int THREAD_GROUP_FOREGROUND = 1;
    364 
    365     /**
    366      * System thread group.
    367      * @hide
    368      **/
    369     public static final int THREAD_GROUP_SYSTEM = 2;
    370 
    371     /**
    372      * Application audio thread group.
    373      * @hide
    374      **/
    375     public static final int THREAD_GROUP_AUDIO_APP = 3;
    376 
    377     /**
    378      * System audio thread group.
    379      * @hide
    380      **/
    381     public static final int THREAD_GROUP_AUDIO_SYS = 4;
    382 
    383     /**
    384      * Thread group for top foreground app.
    385      * @hide
    386      **/
    387     public static final int THREAD_GROUP_TOP_APP = 5;
    388 
    389     /**
    390      * Thread group for RT app.
    391      * @hide
    392      **/
    393     public static final int THREAD_GROUP_RT_APP = 6;
    394 
    395     public static final int SIGNAL_QUIT = 3;
    396     public static final int SIGNAL_KILL = 9;
    397     public static final int SIGNAL_USR1 = 10;
    398 
    399     private static long sStartElapsedRealtime;
    400     private static long sStartUptimeMillis;
    401 
    402     /**
    403      * State associated with the zygote process.
    404      * @hide
    405      */
    406     public static final ZygoteProcess zygoteProcess =
    407             new ZygoteProcess(ZYGOTE_SOCKET, SECONDARY_ZYGOTE_SOCKET);
    408 
    409     /**
    410      * Start a new process.
    411      *
    412      * <p>If processes are enabled, a new process is created and the
    413      * static main() function of a <var>processClass</var> is executed there.
    414      * The process will continue running after this function returns.
    415      *
    416      * <p>If processes are not enabled, a new thread in the caller's
    417      * process is created and main() of <var>processClass</var> called there.
    418      *
    419      * <p>The niceName parameter, if not an empty string, is a custom name to
    420      * give to the process instead of using processClass.  This allows you to
    421      * make easily identifyable processes even if you are using the same base
    422      * <var>processClass</var> to start them.
    423      *
    424      * When invokeWith is not null, the process will be started as a fresh app
    425      * and not a zygote fork. Note that this is only allowed for uid 0 or when
    426      * debugFlags contains DEBUG_ENABLE_DEBUGGER.
    427      *
    428      * @param processClass The class to use as the process's main entry
    429      *                     point.
    430      * @param niceName A more readable name to use for the process.
    431      * @param uid The user-id under which the process will run.
    432      * @param gid The group-id under which the process will run.
    433      * @param gids Additional group-ids associated with the process.
    434      * @param debugFlags Additional flags.
    435      * @param targetSdkVersion The target SDK version for the app.
    436      * @param seInfo null-ok SELinux information for the new process.
    437      * @param abi non-null the ABI this app should be started with.
    438      * @param instructionSet null-ok the instruction set to use.
    439      * @param appDataDir null-ok the data directory of the app.
    440      * @param invokeWith null-ok the command to invoke with.
    441      * @param zygoteArgs Additional arguments to supply to the zygote process.
    442      *
    443      * @return An object that describes the result of the attempt to start the process.
    444      * @throws RuntimeException on fatal start failure
    445      *
    446      * {@hide}
    447      */
    448     public static final ProcessStartResult start(final String processClass,
    449                                   final String niceName,
    450                                   int uid, int gid, int[] gids,
    451                                   int debugFlags, int mountExternal,
    452                                   int targetSdkVersion,
    453                                   String seInfo,
    454                                   String abi,
    455                                   String instructionSet,
    456                                   String appDataDir,
    457                                   String invokeWith,
    458                                   String[] zygoteArgs) {
    459         return zygoteProcess.start(processClass, niceName, uid, gid, gids,
    460                     debugFlags, mountExternal, targetSdkVersion, seInfo,
    461                     abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
    462     }
    463 
    464     /** @hide */
    465     public static final ProcessStartResult startWebView(final String processClass,
    466                                   final String niceName,
    467                                   int uid, int gid, int[] gids,
    468                                   int debugFlags, int mountExternal,
    469                                   int targetSdkVersion,
    470                                   String seInfo,
    471                                   String abi,
    472                                   String instructionSet,
    473                                   String appDataDir,
    474                                   String invokeWith,
    475                                   String[] zygoteArgs) {
    476         return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
    477                     debugFlags, mountExternal, targetSdkVersion, seInfo,
    478                     abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
    479     }
    480 
    481     /**
    482      * Returns elapsed milliseconds of the time this process has run.
    483      * @return  Returns the number of milliseconds this process has return.
    484      */
    485     public static final native long getElapsedCpuTime();
    486 
    487     /**
    488      * Return the {@link SystemClock#elapsedRealtime()} at which this process was started.
    489      */
    490     public static final long getStartElapsedRealtime() {
    491         return sStartElapsedRealtime;
    492     }
    493 
    494     /**
    495      * Return the {@link SystemClock#uptimeMillis()} at which this process was started.
    496      */
    497     public static final long getStartUptimeMillis() {
    498         return sStartUptimeMillis;
    499     }
    500 
    501     /** @hide */
    502     public static final void setStartTimes(long elapsedRealtime, long uptimeMillis) {
    503         sStartElapsedRealtime = elapsedRealtime;
    504         sStartUptimeMillis = uptimeMillis;
    505     }
    506 
    507     /**
    508      * Returns true if the current process is a 64-bit runtime.
    509      */
    510     public static final boolean is64Bit() {
    511         return VMRuntime.getRuntime().is64Bit();
    512     }
    513 
    514     /**
    515      * Returns the identifier of this process, which can be used with
    516      * {@link #killProcess} and {@link #sendSignal}.
    517      */
    518     public static final int myPid() {
    519         return Os.getpid();
    520     }
    521 
    522     /**
    523      * Returns the identifier of this process' parent.
    524      * @hide
    525      */
    526     public static final int myPpid() {
    527         return Os.getppid();
    528     }
    529 
    530     /**
    531      * Returns the identifier of the calling thread, which be used with
    532      * {@link #setThreadPriority(int, int)}.
    533      */
    534     public static final int myTid() {
    535         return Os.gettid();
    536     }
    537 
    538     /**
    539      * Returns the identifier of this process's uid.  This is the kernel uid
    540      * that the process is running under, which is the identity of its
    541      * app-specific sandbox.  It is different from {@link #myUserHandle} in that
    542      * a uid identifies a specific app sandbox in a specific user.
    543      */
    544     public static final int myUid() {
    545         return Os.getuid();
    546     }
    547 
    548     /**
    549      * Returns this process's user handle.  This is the
    550      * user the process is running under.  It is distinct from
    551      * {@link #myUid()} in that a particular user will have multiple
    552      * distinct apps running under it each with their own uid.
    553      */
    554     public static UserHandle myUserHandle() {
    555         return UserHandle.of(UserHandle.getUserId(myUid()));
    556     }
    557 
    558     /**
    559      * Returns whether the given uid belongs to an application.
    560      * @param uid A kernel uid.
    561      * @return Whether the uid corresponds to an application sandbox running in
    562      *     a specific user.
    563      */
    564     public static boolean isApplicationUid(int uid) {
    565         return UserHandle.isApp(uid);
    566     }
    567 
    568     /**
    569      * Returns whether the current process is in an isolated sandbox.
    570      * @hide
    571      */
    572     public static final boolean isIsolated() {
    573         return isIsolated(myUid());
    574     }
    575 
    576     /** {@hide} */
    577     public static final boolean isIsolated(int uid) {
    578         uid = UserHandle.getAppId(uid);
    579         return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID;
    580     }
    581 
    582     /**
    583      * Returns the UID assigned to a particular user name, or -1 if there is
    584      * none.  If the given string consists of only numbers, it is converted
    585      * directly to a uid.
    586      */
    587     public static final native int getUidForName(String name);
    588 
    589     /**
    590      * Returns the GID assigned to a particular user name, or -1 if there is
    591      * none.  If the given string consists of only numbers, it is converted
    592      * directly to a gid.
    593      */
    594     public static final native int getGidForName(String name);
    595 
    596     /**
    597      * Returns a uid for a currently running process.
    598      * @param pid the process id
    599      * @return the uid of the process, or -1 if the process is not running.
    600      * @hide pending API council review
    601      */
    602     public static final int getUidForPid(int pid) {
    603         String[] procStatusLabels = { "Uid:" };
    604         long[] procStatusValues = new long[1];
    605         procStatusValues[0] = -1;
    606         Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
    607         return (int) procStatusValues[0];
    608     }
    609 
    610     /**
    611      * Returns the parent process id for a currently running process.
    612      * @param pid the process id
    613      * @return the parent process id of the process, or -1 if the process is not running.
    614      * @hide
    615      */
    616     public static final int getParentPid(int pid) {
    617         String[] procStatusLabels = { "PPid:" };
    618         long[] procStatusValues = new long[1];
    619         procStatusValues[0] = -1;
    620         Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
    621         return (int) procStatusValues[0];
    622     }
    623 
    624     /**
    625      * Returns the thread group leader id for a currently running thread.
    626      * @param tid the thread id
    627      * @return the thread group leader id of the thread, or -1 if the thread is not running.
    628      *         This is same as what getpid(2) would return if called by tid.
    629      * @hide
    630      */
    631     public static final int getThreadGroupLeader(int tid) {
    632         String[] procStatusLabels = { "Tgid:" };
    633         long[] procStatusValues = new long[1];
    634         procStatusValues[0] = -1;
    635         Process.readProcLines("/proc/" + tid + "/status", procStatusLabels, procStatusValues);
    636         return (int) procStatusValues[0];
    637     }
    638 
    639     /**
    640      * Set the priority of a thread, based on Linux priorities.
    641      *
    642      * @param tid The identifier of the thread/process to change.
    643      * @param priority A Linux priority level, from -20 for highest scheduling
    644      * priority to 19 for lowest scheduling priority.
    645      *
    646      * @throws IllegalArgumentException Throws IllegalArgumentException if
    647      * <var>tid</var> does not exist.
    648      * @throws SecurityException Throws SecurityException if your process does
    649      * not have permission to modify the given thread, or to use the given
    650      * priority.
    651      */
    652     public static final native void setThreadPriority(int tid, int priority)
    653             throws IllegalArgumentException, SecurityException;
    654 
    655     /**
    656      * Call with 'false' to cause future calls to {@link #setThreadPriority(int)} to
    657      * throw an exception if passed a background-level thread priority.  This is only
    658      * effective if the JNI layer is built with GUARD_THREAD_PRIORITY defined to 1.
    659      *
    660      * @hide
    661      */
    662     public static final native void setCanSelfBackground(boolean backgroundOk);
    663 
    664     /**
    665      * Sets the scheduling group for a thread.
    666      * @hide
    667      * @param tid The identifier of the thread to change.
    668      * @param group The target group for this thread from THREAD_GROUP_*.
    669      *
    670      * @throws IllegalArgumentException Throws IllegalArgumentException if
    671      * <var>tid</var> does not exist.
    672      * @throws SecurityException Throws SecurityException if your process does
    673      * not have permission to modify the given thread, or to use the given
    674      * priority.
    675      * If the thread is a thread group leader, that is it's gettid() == getpid(),
    676      * then the other threads in the same thread group are _not_ affected.
    677      *
    678      * Does not set cpuset for some historical reason, just calls
    679      * libcutils::set_sched_policy().
    680      */
    681     public static final native void setThreadGroup(int tid, int group)
    682             throws IllegalArgumentException, SecurityException;
    683 
    684     /**
    685      * Sets the scheduling group and the corresponding cpuset group
    686      * @hide
    687      * @param tid The identifier of the thread to change.
    688      * @param group The target group for this thread from THREAD_GROUP_*.
    689      *
    690      * @throws IllegalArgumentException Throws IllegalArgumentException if
    691      * <var>tid</var> does not exist.
    692      * @throws SecurityException Throws SecurityException if your process does
    693      * not have permission to modify the given thread, or to use the given
    694      * priority.
    695      */
    696     public static final native void setThreadGroupAndCpuset(int tid, int group)
    697             throws IllegalArgumentException, SecurityException;
    698 
    699     /**
    700      * Sets the scheduling group for a process and all child threads
    701      * @hide
    702      * @param pid The identifier of the process to change.
    703      * @param group The target group for this process from THREAD_GROUP_*.
    704      *
    705      * @throws IllegalArgumentException Throws IllegalArgumentException if
    706      * <var>tid</var> does not exist.
    707      * @throws SecurityException Throws SecurityException if your process does
    708      * not have permission to modify the given thread, or to use the given
    709      * priority.
    710      *
    711      * group == THREAD_GROUP_DEFAULT means to move all non-background priority
    712      * threads to the foreground scheduling group, but to leave background
    713      * priority threads alone.  group == THREAD_GROUP_BG_NONINTERACTIVE moves all
    714      * threads, regardless of priority, to the background scheduling group.
    715      * group == THREAD_GROUP_FOREGROUND is not allowed.
    716      *
    717      * Always sets cpusets.
    718      */
    719     public static final native void setProcessGroup(int pid, int group)
    720             throws IllegalArgumentException, SecurityException;
    721 
    722     /**
    723      * Return the scheduling group of requested process.
    724      *
    725      * @hide
    726      */
    727     public static final native int getProcessGroup(int pid)
    728             throws IllegalArgumentException, SecurityException;
    729 
    730     /**
    731      * On some devices, the foreground process may have one or more CPU
    732      * cores exclusively reserved for it. This method can be used to
    733      * retrieve which cores that are (if any), so the calling process
    734      * can then use sched_setaffinity() to lock a thread to these cores.
    735      * Note that the calling process must currently be running in the
    736      * foreground for this method to return any cores.
    737      *
    738      * The CPU core(s) exclusively reserved for the foreground process will
    739      * stay reserved for as long as the process stays in the foreground.
    740      *
    741      * As soon as a process leaves the foreground, those CPU cores will
    742      * no longer be reserved for it, and will most likely be reserved for
    743      * the new foreground process. It's not necessary to change the affinity
    744      * of your process when it leaves the foreground (if you had previously
    745      * set it to use a reserved core); the OS will automatically take care
    746      * of resetting the affinity at that point.
    747      *
    748      * @return an array of integers, indicating the CPU cores exclusively
    749      * reserved for this process. The array will have length zero if no
    750      * CPU cores are exclusively reserved for this process at this point
    751      * in time.
    752      */
    753     public static final native int[] getExclusiveCores();
    754 
    755     /**
    756      * Set the priority of the calling thread, based on Linux priorities.  See
    757      * {@link #setThreadPriority(int, int)} for more information.
    758      *
    759      * @param priority A Linux priority level, from -20 for highest scheduling
    760      * priority to 19 for lowest scheduling priority.
    761      *
    762      * @throws IllegalArgumentException Throws IllegalArgumentException if
    763      * <var>tid</var> does not exist.
    764      * @throws SecurityException Throws SecurityException if your process does
    765      * not have permission to modify the given thread, or to use the given
    766      * priority.
    767      *
    768      * @see #setThreadPriority(int, int)
    769      */
    770     public static final native void setThreadPriority(int priority)
    771             throws IllegalArgumentException, SecurityException;
    772 
    773     /**
    774      * Return the current priority of a thread, based on Linux priorities.
    775      *
    776      * @param tid The identifier of the thread/process. If tid equals zero, the priority of the
    777      * calling process/thread will be returned.
    778      *
    779      * @return Returns the current priority, as a Linux priority level,
    780      * from -20 for highest scheduling priority to 19 for lowest scheduling
    781      * priority.
    782      *
    783      * @throws IllegalArgumentException Throws IllegalArgumentException if
    784      * <var>tid</var> does not exist.
    785      */
    786     public static final native int getThreadPriority(int tid)
    787             throws IllegalArgumentException;
    788 
    789     /**
    790      * Return the current scheduling policy of a thread, based on Linux.
    791      *
    792      * @param tid The identifier of the thread/process to get the scheduling policy.
    793      *
    794      * @throws IllegalArgumentException Throws IllegalArgumentException if
    795      * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy.
    796      * @throws SecurityException Throws SecurityException if your process does
    797      * not have permission to modify the given thread, or to use the given
    798      * scheduling policy or priority.
    799      *
    800      * {@hide}
    801      */
    802 
    803     @TestApi
    804     public static final native int getThreadScheduler(int tid)
    805             throws IllegalArgumentException;
    806 
    807     /**
    808      * Set the scheduling policy and priority of a thread, based on Linux.
    809      *
    810      * @param tid The identifier of the thread/process to change.
    811      * @param policy A Linux scheduling policy such as SCHED_OTHER etc.
    812      * @param priority A Linux priority level in a range appropriate for the given policy.
    813      *
    814      * @throws IllegalArgumentException Throws IllegalArgumentException if
    815      * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy.
    816      * @throws SecurityException Throws SecurityException if your process does
    817      * not have permission to modify the given thread, or to use the given
    818      * scheduling policy or priority.
    819      *
    820      * {@hide}
    821      */
    822 
    823     public static final native void setThreadScheduler(int tid, int policy, int priority)
    824             throws IllegalArgumentException;
    825 
    826     /**
    827      * Determine whether the current environment supports multiple processes.
    828      *
    829      * @return Returns true if the system can run in multiple processes, else
    830      * false if everything is running in a single process.
    831      *
    832      * @deprecated This method always returns true.  Do not use.
    833      */
    834     @Deprecated
    835     public static final boolean supportsProcesses() {
    836         return true;
    837     }
    838 
    839     /**
    840      * Adjust the swappiness level for a process.
    841      *
    842      * @param pid The process identifier to set.
    843      * @param is_increased Whether swappiness should be increased or default.
    844      *
    845      * @return Returns true if the underlying system supports this
    846      *         feature, else false.
    847      *
    848      * {@hide}
    849      */
    850     public static final native boolean setSwappiness(int pid, boolean is_increased);
    851 
    852     /**
    853      * Change this process's argv[0] parameter.  This can be useful to show
    854      * more descriptive information in things like the 'ps' command.
    855      *
    856      * @param text The new name of this process.
    857      *
    858      * {@hide}
    859      */
    860     public static final native void setArgV0(String text);
    861 
    862     /**
    863      * Kill the process with the given PID.
    864      * Note that, though this API allows us to request to
    865      * kill any process based on its PID, the kernel will
    866      * still impose standard restrictions on which PIDs you
    867      * are actually able to kill.  Typically this means only
    868      * the process running the caller's packages/application
    869      * and any additional processes created by that app; packages
    870      * sharing a common UID will also be able to kill each
    871      * other's processes.
    872      */
    873     public static final void killProcess(int pid) {
    874         sendSignal(pid, SIGNAL_KILL);
    875     }
    876 
    877     /** @hide */
    878     public static final native int setUid(int uid);
    879 
    880     /** @hide */
    881     public static final native int setGid(int uid);
    882 
    883     /**
    884      * Send a signal to the given process.
    885      *
    886      * @param pid The pid of the target process.
    887      * @param signal The signal to send.
    888      */
    889     public static final native void sendSignal(int pid, int signal);
    890 
    891     /**
    892      * @hide
    893      * Private impl for avoiding a log message...  DO NOT USE without doing
    894      * your own log, or the Android Illuminati will find you some night and
    895      * beat you up.
    896      */
    897     public static final void killProcessQuiet(int pid) {
    898         sendSignalQuiet(pid, SIGNAL_KILL);
    899     }
    900 
    901     /**
    902      * @hide
    903      * Private impl for avoiding a log message...  DO NOT USE without doing
    904      * your own log, or the Android Illuminati will find you some night and
    905      * beat you up.
    906      */
    907     public static final native void sendSignalQuiet(int pid, int signal);
    908 
    909     /** @hide */
    910     public static final native long getFreeMemory();
    911 
    912     /** @hide */
    913     public static final native long getTotalMemory();
    914 
    915     /** @hide */
    916     public static final native void readProcLines(String path,
    917             String[] reqFields, long[] outSizes);
    918 
    919     /** @hide */
    920     public static final native int[] getPids(String path, int[] lastArray);
    921 
    922     /** @hide */
    923     public static final int PROC_TERM_MASK = 0xff;
    924     /** @hide */
    925     public static final int PROC_ZERO_TERM = 0;
    926     /** @hide */
    927     public static final int PROC_SPACE_TERM = (int)' ';
    928     /** @hide */
    929     public static final int PROC_TAB_TERM = (int)'\t';
    930     /** @hide */
    931     public static final int PROC_COMBINE = 0x100;
    932     /** @hide */
    933     public static final int PROC_PARENS = 0x200;
    934     /** @hide */
    935     public static final int PROC_QUOTES = 0x400;
    936     /** @hide */
    937     public static final int PROC_CHAR = 0x800;
    938     /** @hide */
    939     public static final int PROC_OUT_STRING = 0x1000;
    940     /** @hide */
    941     public static final int PROC_OUT_LONG = 0x2000;
    942     /** @hide */
    943     public static final int PROC_OUT_FLOAT = 0x4000;
    944 
    945     /** @hide */
    946     public static final native boolean readProcFile(String file, int[] format,
    947             String[] outStrings, long[] outLongs, float[] outFloats);
    948 
    949     /** @hide */
    950     public static final native boolean parseProcLine(byte[] buffer, int startIndex,
    951             int endIndex, int[] format, String[] outStrings, long[] outLongs, float[] outFloats);
    952 
    953     /** @hide */
    954     public static final native int[] getPidsForCommands(String[] cmds);
    955 
    956     /**
    957      * Gets the total Pss value for a given process, in bytes.
    958      *
    959      * @param pid the process to the Pss for
    960      * @return the total Pss value for the given process in bytes,
    961      *  or -1 if the value cannot be determined
    962      * @hide
    963      */
    964     public static final native long getPss(int pid);
    965 
    966     /**
    967      * Specifies the outcome of having started a process.
    968      * @hide
    969      */
    970     public static final class ProcessStartResult {
    971         /**
    972          * The PID of the newly started process.
    973          * Always >= 0.  (If the start failed, an exception will have been thrown instead.)
    974          */
    975         public int pid;
    976 
    977         /**
    978          * True if the process was started with a wrapper attached.
    979          */
    980         public boolean usingWrapper;
    981     }
    982 
    983     /**
    984      * Kill all processes in a process group started for the given
    985      * pid.
    986      * @hide
    987      */
    988     public static final native int killProcessGroup(int uid, int pid);
    989 
    990     /**
    991      * Remove all process groups.  Expected to be called when ActivityManager
    992      * is restarted.
    993      * @hide
    994      */
    995     public static final native void removeAllProcessGroups();
    996 
    997     /**
    998      * Check to see if a thread belongs to a given process. This may require
    999      * more permissions than apps generally have.
   1000      * @return true if this thread belongs to a process
   1001      * @hide
   1002      */
   1003     public static final boolean isThreadInProcess(int tid, int pid) {
   1004         StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
   1005         try {
   1006             if (Os.access("/proc/" + tid + "/task/" + pid, OsConstants.F_OK)) {
   1007                 return true;
   1008             } else {
   1009                 return false;
   1010             }
   1011         } catch (Exception e) {
   1012             return false;
   1013         } finally {
   1014             StrictMode.setThreadPolicy(oldPolicy);
   1015         }
   1016 
   1017     }
   1018 }
   1019