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