1 /* 2 * Copyright (C) 2007 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.content.pm; 18 19 import android.annotation.SystemApi; 20 import android.annotation.TestApi; 21 import android.content.Context; 22 import android.content.pm.PackageManager.NameNotFoundException; 23 import android.content.res.Resources; 24 import android.graphics.drawable.Drawable; 25 import android.os.Environment; 26 import android.os.Parcel; 27 import android.os.Parcelable; 28 import android.os.UserHandle; 29 import android.text.TextUtils; 30 import android.util.Printer; 31 32 import com.android.internal.util.ArrayUtils; 33 34 import java.text.Collator; 35 import java.util.Arrays; 36 import java.util.Comparator; 37 import java.util.Objects; 38 39 /** 40 * Information you can retrieve about a particular application. This 41 * corresponds to information collected from the AndroidManifest.xml's 42 * <application> tag. 43 */ 44 public class ApplicationInfo extends PackageItemInfo implements Parcelable { 45 46 /** 47 * Default task affinity of all activities in this application. See 48 * {@link ActivityInfo#taskAffinity} for more information. This comes 49 * from the "taskAffinity" attribute. 50 */ 51 public String taskAffinity; 52 53 /** 54 * Optional name of a permission required to be able to access this 55 * application's components. From the "permission" attribute. 56 */ 57 public String permission; 58 59 /** 60 * The name of the process this application should run in. From the 61 * "process" attribute or, if not set, the same as 62 * <var>packageName</var>. 63 */ 64 public String processName; 65 66 /** 67 * Class implementing the Application object. From the "class" 68 * attribute. 69 */ 70 public String className; 71 72 /** 73 * A style resource identifier (in the package's resources) of the 74 * description of an application. From the "description" attribute 75 * or, if not set, 0. 76 */ 77 public int descriptionRes; 78 79 /** 80 * A style resource identifier (in the package's resources) of the 81 * default visual theme of the application. From the "theme" attribute 82 * or, if not set, 0. 83 */ 84 public int theme; 85 86 /** 87 * Class implementing the Application's manage space 88 * functionality. From the "manageSpaceActivity" 89 * attribute. This is an optional attribute and will be null if 90 * applications don't specify it in their manifest 91 */ 92 public String manageSpaceActivityName; 93 94 /** 95 * Class implementing the Application's backup functionality. From 96 * the "backupAgent" attribute. This is an optional attribute and 97 * will be null if the application does not specify it in its manifest. 98 * 99 * <p>If android:allowBackup is set to false, this attribute is ignored. 100 */ 101 public String backupAgentName; 102 103 /** 104 * An optional attribute that indicates the app supports automatic backup of app data. 105 * <p>0 is the default and means the app's entire data folder + managed external storage will 106 * be backed up; 107 * Any negative value indicates the app does not support full-data backup, though it may still 108 * want to participate via the traditional key/value backup API; 109 * A positive number specifies an xml resource in which the application has defined its backup 110 * include/exclude criteria. 111 * <p>If android:allowBackup is set to false, this attribute is ignored. 112 * 113 * @see android.content.Context#getNoBackupFilesDir() 114 * @see #FLAG_ALLOW_BACKUP 115 * 116 * @hide 117 */ 118 public int fullBackupContent = 0; 119 120 /** 121 * The default extra UI options for activities in this application. 122 * Set from the {@link android.R.attr#uiOptions} attribute in the 123 * activity's manifest. 124 */ 125 public int uiOptions = 0; 126 127 /** 128 * Value for {@link #flags}: if set, this application is installed in the 129 * device's system image. 130 */ 131 public static final int FLAG_SYSTEM = 1<<0; 132 133 /** 134 * Value for {@link #flags}: set to true if this application would like to 135 * allow debugging of its 136 * code, even when installed on a non-development system. Comes 137 * from {@link android.R.styleable#AndroidManifestApplication_debuggable 138 * android:debuggable} of the <application> tag. 139 */ 140 public static final int FLAG_DEBUGGABLE = 1<<1; 141 142 /** 143 * Value for {@link #flags}: set to true if this application has code 144 * associated with it. Comes 145 * from {@link android.R.styleable#AndroidManifestApplication_hasCode 146 * android:hasCode} of the <application> tag. 147 */ 148 public static final int FLAG_HAS_CODE = 1<<2; 149 150 /** 151 * Value for {@link #flags}: set to true if this application is persistent. 152 * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent 153 * android:persistent} of the <application> tag. 154 */ 155 public static final int FLAG_PERSISTENT = 1<<3; 156 157 /** 158 * Value for {@link #flags}: set to true if this application holds the 159 * {@link android.Manifest.permission#FACTORY_TEST} permission and the 160 * device is running in factory test mode. 161 */ 162 public static final int FLAG_FACTORY_TEST = 1<<4; 163 164 /** 165 * Value for {@link #flags}: default value for the corresponding ActivityInfo flag. 166 * Comes from {@link android.R.styleable#AndroidManifestApplication_allowTaskReparenting 167 * android:allowTaskReparenting} of the <application> tag. 168 */ 169 public static final int FLAG_ALLOW_TASK_REPARENTING = 1<<5; 170 171 /** 172 * Value for {@link #flags}: default value for the corresponding ActivityInfo flag. 173 * Comes from {@link android.R.styleable#AndroidManifestApplication_allowClearUserData 174 * android:allowClearUserData} of the <application> tag. 175 */ 176 public static final int FLAG_ALLOW_CLEAR_USER_DATA = 1<<6; 177 178 /** 179 * Value for {@link #flags}: this is set if this application has been 180 * installed as an update to a built-in system application. 181 */ 182 public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7; 183 184 /** 185 * Value for {@link #flags}: this is set if the application has specified 186 * {@link android.R.styleable#AndroidManifestApplication_testOnly 187 * android:testOnly} to be true. 188 */ 189 public static final int FLAG_TEST_ONLY = 1<<8; 190 191 /** 192 * Value for {@link #flags}: true when the application's window can be 193 * reduced in size for smaller screens. Corresponds to 194 * {@link android.R.styleable#AndroidManifestSupportsScreens_smallScreens 195 * android:smallScreens}. 196 */ 197 public static final int FLAG_SUPPORTS_SMALL_SCREENS = 1<<9; 198 199 /** 200 * Value for {@link #flags}: true when the application's window can be 201 * displayed on normal screens. Corresponds to 202 * {@link android.R.styleable#AndroidManifestSupportsScreens_normalScreens 203 * android:normalScreens}. 204 */ 205 public static final int FLAG_SUPPORTS_NORMAL_SCREENS = 1<<10; 206 207 /** 208 * Value for {@link #flags}: true when the application's window can be 209 * increased in size for larger screens. Corresponds to 210 * {@link android.R.styleable#AndroidManifestSupportsScreens_largeScreens 211 * android:largeScreens}. 212 */ 213 public static final int FLAG_SUPPORTS_LARGE_SCREENS = 1<<11; 214 215 /** 216 * Value for {@link #flags}: true when the application knows how to adjust 217 * its UI for different screen sizes. Corresponds to 218 * {@link android.R.styleable#AndroidManifestSupportsScreens_resizeable 219 * android:resizeable}. 220 */ 221 public static final int FLAG_RESIZEABLE_FOR_SCREENS = 1<<12; 222 223 /** 224 * Value for {@link #flags}: true when the application knows how to 225 * accomodate different screen densities. Corresponds to 226 * {@link android.R.styleable#AndroidManifestSupportsScreens_anyDensity 227 * android:anyDensity}. 228 */ 229 public static final int FLAG_SUPPORTS_SCREEN_DENSITIES = 1<<13; 230 231 /** 232 * Value for {@link #flags}: set to true if this application would like to 233 * request the VM to operate under the safe mode. Comes from 234 * {@link android.R.styleable#AndroidManifestApplication_vmSafeMode 235 * android:vmSafeMode} of the <application> tag. 236 */ 237 public static final int FLAG_VM_SAFE_MODE = 1<<14; 238 239 /** 240 * Value for {@link #flags}: set to <code>false</code> if the application does not wish 241 * to permit any OS-driven backups of its data; <code>true</code> otherwise. 242 * 243 * <p>Comes from the 244 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup} 245 * attribute of the <application> tag. 246 */ 247 public static final int FLAG_ALLOW_BACKUP = 1<<15; 248 249 /** 250 * Value for {@link #flags}: set to <code>false</code> if the application must be kept 251 * in memory following a full-system restore operation; <code>true</code> otherwise. 252 * Ordinarily, during a full system restore operation each application is shut down 253 * following execution of its agent's onRestore() method. Setting this attribute to 254 * <code>false</code> prevents this. Most applications will not need to set this attribute. 255 * 256 * <p>If 257 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup} 258 * is set to <code>false</code> or no 259 * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent} 260 * is specified, this flag will be ignored. 261 * 262 * <p>Comes from the 263 * {@link android.R.styleable#AndroidManifestApplication_killAfterRestore android:killAfterRestore} 264 * attribute of the <application> tag. 265 */ 266 public static final int FLAG_KILL_AFTER_RESTORE = 1<<16; 267 268 /** 269 * Value for {@link #flags}: Set to <code>true</code> if the application's backup 270 * agent claims to be able to handle restore data even "from the future," 271 * i.e. from versions of the application with a versionCode greater than 272 * the one currently installed on the device. <i>Use with caution!</i> By default 273 * this attribute is <code>false</code> and the Backup Manager will ensure that data 274 * from "future" versions of the application are never supplied during a restore operation. 275 * 276 * <p>If 277 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup} 278 * is set to <code>false</code> or no 279 * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent} 280 * is specified, this flag will be ignored. 281 * 282 * <p>Comes from the 283 * {@link android.R.styleable#AndroidManifestApplication_restoreAnyVersion android:restoreAnyVersion} 284 * attribute of the <application> tag. 285 */ 286 public static final int FLAG_RESTORE_ANY_VERSION = 1<<17; 287 288 /** 289 * Value for {@link #flags}: Set to true if the application is 290 * currently installed on external/removable/unprotected storage. Such 291 * applications may not be available if their storage is not currently 292 * mounted. When the storage it is on is not available, it will look like 293 * the application has been uninstalled (its .apk is no longer available) 294 * but its persistent data is not removed. 295 */ 296 public static final int FLAG_EXTERNAL_STORAGE = 1<<18; 297 298 /** 299 * Value for {@link #flags}: true when the application's window can be 300 * increased in size for extra large screens. Corresponds to 301 * {@link android.R.styleable#AndroidManifestSupportsScreens_xlargeScreens 302 * android:xlargeScreens}. 303 */ 304 public static final int FLAG_SUPPORTS_XLARGE_SCREENS = 1<<19; 305 306 /** 307 * Value for {@link #flags}: true when the application has requested a 308 * large heap for its processes. Corresponds to 309 * {@link android.R.styleable#AndroidManifestApplication_largeHeap 310 * android:largeHeap}. 311 */ 312 public static final int FLAG_LARGE_HEAP = 1<<20; 313 314 /** 315 * Value for {@link #flags}: true if this application's package is in 316 * the stopped state. 317 */ 318 public static final int FLAG_STOPPED = 1<<21; 319 320 /** 321 * Value for {@link #flags}: true when the application is willing to support 322 * RTL (right to left). All activities will inherit this value. 323 * 324 * Set from the {@link android.R.attr#supportsRtl} attribute in the 325 * activity's manifest. 326 * 327 * Default value is false (no support for RTL). 328 */ 329 public static final int FLAG_SUPPORTS_RTL = 1<<22; 330 331 /** 332 * Value for {@link #flags}: true if the application is currently 333 * installed for the calling user. 334 */ 335 public static final int FLAG_INSTALLED = 1<<23; 336 337 /** 338 * Value for {@link #flags}: true if the application only has its 339 * data installed; the application package itself does not currently 340 * exist on the device. 341 */ 342 public static final int FLAG_IS_DATA_ONLY = 1<<24; 343 344 /** 345 * Value for {@link #flags}: true if the application was declared to be a game, or 346 * false if it is a non-game application. 347 */ 348 public static final int FLAG_IS_GAME = 1<<25; 349 350 /** 351 * Value for {@link #flags}: {@code true} if the application asks that only 352 * full-data streaming backups of its data be performed even though it defines 353 * a {@link android.app.backup.BackupAgent BackupAgent}, which normally 354 * indicates that the app will manage its backed-up data via incremental 355 * key/value updates. 356 */ 357 public static final int FLAG_FULL_BACKUP_ONLY = 1<<26; 358 359 /** 360 * Value for {@link #flags}: {@code true} if the application may use cleartext network traffic 361 * (e.g., HTTP rather than HTTPS; WebSockets rather than WebSockets Secure; XMPP, IMAP, STMP 362 * without STARTTLS or TLS). If {@code false}, the app declares that it does not intend to use 363 * cleartext network traffic, in which case platform components (e.g., HTTP stacks, 364 * {@code DownloadManager}, {@code MediaPlayer}) will refuse app's requests to use cleartext 365 * traffic. Third-party libraries are encouraged to honor this flag as well. 366 * 367 * <p>NOTE: {@code WebView} does not honor this flag. 368 * 369 * <p>This flag is ignored on Android N and above if an Android Network Security Config is 370 * present. 371 * 372 * <p>This flag comes from 373 * {@link android.R.styleable#AndroidManifestApplication_usesCleartextTraffic 374 * android:usesCleartextTraffic} of the <application> tag. 375 */ 376 public static final int FLAG_USES_CLEARTEXT_TRAFFIC = 1<<27; 377 378 /** 379 * When set installer extracts native libs from .apk files. 380 */ 381 public static final int FLAG_EXTRACT_NATIVE_LIBS = 1<<28; 382 383 /** 384 * Value for {@link #flags}: {@code true} when the application's rendering 385 * should be hardware accelerated. 386 */ 387 public static final int FLAG_HARDWARE_ACCELERATED = 1<<29; 388 389 /** 390 * Value for {@link #flags}: true if this application's package is in 391 * the suspended state. 392 */ 393 public static final int FLAG_SUSPENDED = 1<<30; 394 395 /** 396 * Value for {@link #flags}: true if code from this application will need to be 397 * loaded into other applications' processes. On devices that support multiple 398 * instruction sets, this implies the code might be loaded into a process that's 399 * using any of the devices supported instruction sets. 400 * 401 * <p> The system might treat such applications specially, for eg., by 402 * extracting the application's native libraries for all supported instruction 403 * sets or by compiling the application's dex code for all supported instruction 404 * sets. 405 */ 406 public static final int FLAG_MULTIARCH = 1 << 31; 407 408 /** 409 * Flags associated with the application. Any combination of 410 * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE}, 411 * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and 412 * {@link #FLAG_ALLOW_TASK_REPARENTING} 413 * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP}, 414 * {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS}, 415 * {@link #FLAG_SUPPORTS_NORMAL_SCREENS}, 416 * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_SUPPORTS_XLARGE_SCREENS}, 417 * {@link #FLAG_RESIZEABLE_FOR_SCREENS}, 418 * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}, {@link #FLAG_VM_SAFE_MODE}, 419 * {@link #FLAG_ALLOW_BACKUP}, {@link #FLAG_KILL_AFTER_RESTORE}, 420 * {@link #FLAG_RESTORE_ANY_VERSION}, {@link #FLAG_EXTERNAL_STORAGE}, 421 * {@link #FLAG_LARGE_HEAP}, {@link #FLAG_STOPPED}, 422 * {@link #FLAG_SUPPORTS_RTL}, {@link #FLAG_INSTALLED}, 423 * {@link #FLAG_IS_DATA_ONLY}, {@link #FLAG_IS_GAME}, 424 * {@link #FLAG_FULL_BACKUP_ONLY}, {@link #FLAG_USES_CLEARTEXT_TRAFFIC}, 425 * {@link #FLAG_MULTIARCH}. 426 */ 427 public int flags = 0; 428 429 /** 430 * Value for {@link #privateFlags}: true if the application is hidden via restrictions and for 431 * most purposes is considered as not installed. 432 * {@hide} 433 */ 434 public static final int PRIVATE_FLAG_HIDDEN = 1<<0; 435 436 /** 437 * Value for {@link #privateFlags}: set to <code>true</code> if the application 438 * has reported that it is heavy-weight, and thus can not participate in 439 * the normal application lifecycle. 440 * 441 * <p>Comes from the 442 * android.R.styleable#AndroidManifestApplication_cantSaveState 443 * attribute of the <application> tag. 444 * 445 * {@hide} 446 */ 447 public static final int PRIVATE_FLAG_CANT_SAVE_STATE = 1<<1; 448 449 /** 450 * Value for {@link #privateFlags}: Set to true if the application has been 451 * installed using the forward lock option. 452 * 453 * NOTE: DO NOT CHANGE THIS VALUE! It is saved in packages.xml. 454 * 455 * {@hide} 456 */ 457 public static final int PRIVATE_FLAG_FORWARD_LOCK = 1<<2; 458 459 /** 460 * Value for {@link #privateFlags}: set to {@code true} if the application 461 * is permitted to hold privileged permissions. 462 * 463 * {@hide} 464 */ 465 public static final int PRIVATE_FLAG_PRIVILEGED = 1<<3; 466 467 /** 468 * Value for {@link #privateFlags}: {@code true} if the application has any IntentFiler 469 * with some data URI using HTTP or HTTPS with an associated VIEW action. 470 * 471 * {@hide} 472 */ 473 public static final int PRIVATE_FLAG_HAS_DOMAIN_URLS = 1<<4; 474 475 /** 476 * When set, the default data storage directory for this app is pointed at 477 * the device-protected location. 478 * 479 * @hide 480 */ 481 public static final int PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1 << 5; 482 483 /** 484 * When set, assume that all components under the given app are direct boot 485 * aware, unless otherwise specified. 486 * 487 * @hide 488 */ 489 public static final int PRIVATE_FLAG_DIRECT_BOOT_AWARE = 1 << 6; 490 491 /** 492 * Value for {@link #privateFlags}: set to {@code true} if the application 493 * is AutoPlay. 494 * 495 * {@hide} 496 */ 497 public static final int PRIVATE_FLAG_AUTOPLAY = 1 << 7; 498 499 /** 500 * When set, at least one component inside this application is direct boot 501 * aware. 502 * 503 * @hide 504 */ 505 public static final int PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE = 1 << 8; 506 507 /** 508 * Value for {@link #flags}: {@code true} if the application is blocked via restrictions 509 * and for most purposes is considered as not installed. 510 * {@hide} 511 */ 512 public static final int PRIVATE_FLAG_EPHEMERAL = 1 << 9; 513 514 /** 515 * When set, signals that the application is required for the system user and should not be 516 * uninstalled. 517 * 518 * @hide 519 */ 520 public static final int PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER = 1 << 10; 521 522 /** 523 * When set, the activities associated with this application are resizeable by default. 524 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity 525 * 526 * @hide 527 */ 528 public static final int PRIVATE_FLAG_RESIZEABLE_ACTIVITIES = 1 << 11; 529 530 /** 531 * Value for {@link #privateFlags}: {@code true} means the OS should go ahead and 532 * run full-data backup operations for the app even when it is in a 533 * foreground-equivalent run state. Defaults to {@code false} if unspecified. 534 * @hide 535 */ 536 public static final int PRIVATE_FLAG_BACKUP_IN_FOREGROUND = 1 << 12; 537 538 /** 539 * Private/hidden flags. See {@code PRIVATE_FLAG_...} constants. 540 * {@hide} 541 */ 542 public int privateFlags; 543 544 /** 545 * The required smallest screen width the application can run on. If 0, 546 * nothing has been specified. Comes from 547 * {@link android.R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp 548 * android:requiresSmallestWidthDp} attribute of the <supports-screens> tag. 549 */ 550 public int requiresSmallestWidthDp = 0; 551 552 /** 553 * The maximum smallest screen width the application is designed for. If 0, 554 * nothing has been specified. Comes from 555 * {@link android.R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp 556 * android:compatibleWidthLimitDp} attribute of the <supports-screens> tag. 557 */ 558 public int compatibleWidthLimitDp = 0; 559 560 /** 561 * The maximum smallest screen width the application will work on. If 0, 562 * nothing has been specified. Comes from 563 * {@link android.R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp 564 * android:largestWidthLimitDp} attribute of the <supports-screens> tag. 565 */ 566 public int largestWidthLimitDp = 0; 567 568 /** {@hide} */ 569 public String volumeUuid; 570 /** {@hide} */ 571 public String scanSourceDir; 572 /** {@hide} */ 573 public String scanPublicSourceDir; 574 575 /** 576 * Full path to the base APK for this application. 577 */ 578 public String sourceDir; 579 580 /** 581 * Full path to the publicly available parts of {@link #sourceDir}, 582 * including resources and manifest. This may be different from 583 * {@link #sourceDir} if an application is forward locked. 584 */ 585 public String publicSourceDir; 586 587 /** 588 * Full paths to zero or more split APKs that, when combined with the base 589 * APK defined in {@link #sourceDir}, form a complete application. 590 */ 591 public String[] splitSourceDirs; 592 593 /** 594 * Full path to the publicly available parts of {@link #splitSourceDirs}, 595 * including resources and manifest. This may be different from 596 * {@link #splitSourceDirs} if an application is forward locked. 597 */ 598 public String[] splitPublicSourceDirs; 599 600 /** 601 * Full paths to the locations of extra resource packages this application 602 * uses. This field is only used if there are extra resource packages, 603 * otherwise it is null. 604 * 605 * {@hide} 606 */ 607 public String[] resourceDirs; 608 609 /** 610 * String retrieved from the seinfo tag found in selinux policy. This value 611 * can be overridden with a value set through the mac_permissions.xml policy 612 * construct. This value is useful in setting an SELinux security context on 613 * the process as well as its data directory. The String default is being used 614 * here to represent a catchall label when no policy matches. 615 * 616 * {@hide} 617 */ 618 public String seinfo = "default"; 619 620 /** 621 * Paths to all shared libraries this application is linked against. This 622 * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES 623 * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving 624 * the structure. 625 */ 626 public String[] sharedLibraryFiles; 627 628 /** 629 * Full path to the default directory assigned to the package for its 630 * persistent data. 631 */ 632 public String dataDir; 633 634 /** 635 * Full path to the device-protected directory assigned to the package for 636 * its persistent data. 637 * 638 * @see Context#createDeviceProtectedStorageContext() 639 */ 640 public String deviceProtectedDataDir; 641 642 /** @removed */ 643 @Deprecated 644 public String deviceEncryptedDataDir; 645 646 /** 647 * Full path to the credential-protected directory assigned to the package 648 * for its persistent data. 649 * 650 * @hide 651 */ 652 @SystemApi 653 public String credentialProtectedDataDir; 654 655 /** @removed */ 656 @Deprecated 657 public String credentialEncryptedDataDir; 658 659 /** 660 * Full path to the directory where native JNI libraries are stored. 661 */ 662 public String nativeLibraryDir; 663 664 /** 665 * Full path where unpacked native libraries for {@link #secondaryCpuAbi} 666 * are stored, if present. 667 * 668 * The main reason this exists is for bundled multi-arch apps, where 669 * it's not trivial to calculate the location of libs for the secondary abi 670 * given the location of the primary. 671 * 672 * TODO: Change the layout of bundled installs so that we can use 673 * nativeLibraryRootDir & nativeLibraryRootRequiresIsa there as well. 674 * (e.g {@code [ "/system/app-lib/Foo/arm", "/system/app-lib/Foo/arm64" ]} 675 * instead of {@code [ "/system/lib/Foo", "/system/lib64/Foo" ]}. 676 * 677 * @hide 678 */ 679 public String secondaryNativeLibraryDir; 680 681 /** 682 * The root path where unpacked native libraries are stored. 683 * <p> 684 * When {@link #nativeLibraryRootRequiresIsa} is set, the libraries are 685 * placed in ISA-specific subdirectories under this path, otherwise the 686 * libraries are placed directly at this path. 687 * 688 * @hide 689 */ 690 public String nativeLibraryRootDir; 691 692 /** 693 * Flag indicating that ISA must be appended to 694 * {@link #nativeLibraryRootDir} to be useful. 695 * 696 * @hide 697 */ 698 public boolean nativeLibraryRootRequiresIsa; 699 700 /** 701 * The primary ABI that this application requires, This is inferred from the ABIs 702 * of the native JNI libraries the application bundles. Will be {@code null} 703 * if this application does not require any particular ABI. 704 * 705 * If non-null, the application will always be launched with this ABI. 706 * 707 * {@hide} 708 */ 709 public String primaryCpuAbi; 710 711 /** 712 * The secondary ABI for this application. Might be non-null for multi-arch 713 * installs. The application itself never uses this ABI, but other applications that 714 * use its code might. 715 * 716 * {@hide} 717 */ 718 public String secondaryCpuAbi; 719 720 /** 721 * The kernel user-ID that has been assigned to this application; 722 * currently this is not a unique ID (multiple applications can have 723 * the same uid). 724 */ 725 public int uid; 726 727 /** 728 * The minimum SDK version this application can run on. It will not run 729 * on earlier versions. 730 */ 731 public int minSdkVersion; 732 733 /** 734 * The minimum SDK version this application targets. It may run on earlier 735 * versions, but it knows how to work with any new behavior added at this 736 * version. Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT} 737 * if this is a development build and the app is targeting that. You should 738 * compare that this number is >= the SDK version number at which your 739 * behavior was introduced. 740 */ 741 public int targetSdkVersion; 742 743 /** 744 * The app's declared version code. 745 * @hide 746 */ 747 public int versionCode; 748 749 /** 750 * When false, indicates that all components within this application are 751 * considered disabled, regardless of their individually set enabled status. 752 */ 753 public boolean enabled = true; 754 755 /** 756 * For convenient access to the current enabled setting of this app. 757 * @hide 758 */ 759 public int enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 760 761 /** 762 * For convenient access to package's install location. 763 * @hide 764 */ 765 public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 766 767 /** 768 * Resource file providing the application's Network Security Config. 769 * @hide 770 */ 771 public int networkSecurityConfigRes; 772 dump(Printer pw, String prefix)773 public void dump(Printer pw, String prefix) { 774 dump(pw, prefix, DUMP_FLAG_ALL); 775 } 776 777 /** @hide */ dump(Printer pw, String prefix, int flags)778 public void dump(Printer pw, String prefix, int flags) { 779 super.dumpFront(pw, prefix); 780 if ((flags&DUMP_FLAG_DETAILS) != 0 && className != null) { 781 pw.println(prefix + "className=" + className); 782 } 783 if (permission != null) { 784 pw.println(prefix + "permission=" + permission); 785 } 786 pw.println(prefix + "processName=" + processName); 787 if ((flags&DUMP_FLAG_DETAILS) != 0) { 788 pw.println(prefix + "taskAffinity=" + taskAffinity); 789 } 790 pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags) 791 + " privateFlags=0x" + Integer.toHexString(privateFlags) 792 + " theme=0x" + Integer.toHexString(theme)); 793 if ((flags&DUMP_FLAG_DETAILS) != 0) { 794 pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp 795 + " compatibleWidthLimitDp=" + compatibleWidthLimitDp 796 + " largestWidthLimitDp=" + largestWidthLimitDp); 797 } 798 pw.println(prefix + "sourceDir=" + sourceDir); 799 if (!Objects.equals(sourceDir, publicSourceDir)) { 800 pw.println(prefix + "publicSourceDir=" + publicSourceDir); 801 } 802 if (!ArrayUtils.isEmpty(splitSourceDirs)) { 803 pw.println(prefix + "splitSourceDirs=" + Arrays.toString(splitSourceDirs)); 804 } 805 if (!ArrayUtils.isEmpty(splitPublicSourceDirs) 806 && !Arrays.equals(splitSourceDirs, splitPublicSourceDirs)) { 807 pw.println(prefix + "splitPublicSourceDirs=" + Arrays.toString(splitPublicSourceDirs)); 808 } 809 if (resourceDirs != null) { 810 pw.println(prefix + "resourceDirs=" + Arrays.toString(resourceDirs)); 811 } 812 if ((flags&DUMP_FLAG_DETAILS) != 0 && seinfo != null) { 813 pw.println(prefix + "seinfo=" + seinfo); 814 } 815 pw.println(prefix + "dataDir=" + dataDir); 816 if ((flags&DUMP_FLAG_DETAILS) != 0) { 817 pw.println(prefix + "deviceProtectedDataDir=" + deviceProtectedDataDir); 818 pw.println(prefix + "credentialProtectedDataDir=" + credentialProtectedDataDir); 819 if (sharedLibraryFiles != null) { 820 pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles)); 821 } 822 } 823 pw.println(prefix + "enabled=" + enabled 824 + " minSdkVersion=" + minSdkVersion 825 + " targetSdkVersion=" + targetSdkVersion 826 + " versionCode=" + versionCode); 827 if ((flags&DUMP_FLAG_DETAILS) != 0) { 828 if (manageSpaceActivityName != null) { 829 pw.println(prefix + "manageSpaceActivityName=" + manageSpaceActivityName); 830 } 831 if (descriptionRes != 0) { 832 pw.println(prefix + "description=0x" + Integer.toHexString(descriptionRes)); 833 } 834 if (uiOptions != 0) { 835 pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions)); 836 } 837 pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false")); 838 if (fullBackupContent > 0) { 839 pw.println(prefix + "fullBackupContent=@xml/" + fullBackupContent); 840 } else { 841 pw.println(prefix + "fullBackupContent=" 842 + (fullBackupContent < 0 ? "false" : "true")); 843 } 844 if (networkSecurityConfigRes != 0) { 845 pw.println(prefix + "networkSecurityConfigRes=0x" 846 + Integer.toHexString(networkSecurityConfigRes)); 847 } 848 } 849 super.dumpBack(pw, prefix); 850 } 851 852 /** 853 * @return true if "supportsRtl" has been set to true in the AndroidManifest 854 * @hide 855 */ hasRtlSupport()856 public boolean hasRtlSupport() { 857 return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL; 858 } 859 860 /** {@hide} */ hasCode()861 public boolean hasCode() { 862 return (flags & FLAG_HAS_CODE) != 0; 863 } 864 865 public static class DisplayNameComparator 866 implements Comparator<ApplicationInfo> { DisplayNameComparator(PackageManager pm)867 public DisplayNameComparator(PackageManager pm) { 868 mPM = pm; 869 } 870 compare(ApplicationInfo aa, ApplicationInfo ab)871 public final int compare(ApplicationInfo aa, ApplicationInfo ab) { 872 CharSequence sa = mPM.getApplicationLabel(aa); 873 if (sa == null) { 874 sa = aa.packageName; 875 } 876 CharSequence sb = mPM.getApplicationLabel(ab); 877 if (sb == null) { 878 sb = ab.packageName; 879 } 880 881 return sCollator.compare(sa.toString(), sb.toString()); 882 } 883 884 private final Collator sCollator = Collator.getInstance(); 885 private PackageManager mPM; 886 } 887 ApplicationInfo()888 public ApplicationInfo() { 889 } 890 ApplicationInfo(ApplicationInfo orig)891 public ApplicationInfo(ApplicationInfo orig) { 892 super(orig); 893 taskAffinity = orig.taskAffinity; 894 permission = orig.permission; 895 processName = orig.processName; 896 className = orig.className; 897 theme = orig.theme; 898 flags = orig.flags; 899 privateFlags = orig.privateFlags; 900 requiresSmallestWidthDp = orig.requiresSmallestWidthDp; 901 compatibleWidthLimitDp = orig.compatibleWidthLimitDp; 902 largestWidthLimitDp = orig.largestWidthLimitDp; 903 volumeUuid = orig.volumeUuid; 904 scanSourceDir = orig.scanSourceDir; 905 scanPublicSourceDir = orig.scanPublicSourceDir; 906 sourceDir = orig.sourceDir; 907 publicSourceDir = orig.publicSourceDir; 908 splitSourceDirs = orig.splitSourceDirs; 909 splitPublicSourceDirs = orig.splitPublicSourceDirs; 910 nativeLibraryDir = orig.nativeLibraryDir; 911 secondaryNativeLibraryDir = orig.secondaryNativeLibraryDir; 912 nativeLibraryRootDir = orig.nativeLibraryRootDir; 913 nativeLibraryRootRequiresIsa = orig.nativeLibraryRootRequiresIsa; 914 primaryCpuAbi = orig.primaryCpuAbi; 915 secondaryCpuAbi = orig.secondaryCpuAbi; 916 resourceDirs = orig.resourceDirs; 917 seinfo = orig.seinfo; 918 sharedLibraryFiles = orig.sharedLibraryFiles; 919 dataDir = orig.dataDir; 920 deviceEncryptedDataDir = deviceProtectedDataDir = orig.deviceProtectedDataDir; 921 credentialEncryptedDataDir = credentialProtectedDataDir = orig.credentialProtectedDataDir; 922 uid = orig.uid; 923 minSdkVersion = orig.minSdkVersion; 924 targetSdkVersion = orig.targetSdkVersion; 925 versionCode = orig.versionCode; 926 enabled = orig.enabled; 927 enabledSetting = orig.enabledSetting; 928 installLocation = orig.installLocation; 929 manageSpaceActivityName = orig.manageSpaceActivityName; 930 descriptionRes = orig.descriptionRes; 931 uiOptions = orig.uiOptions; 932 backupAgentName = orig.backupAgentName; 933 fullBackupContent = orig.fullBackupContent; 934 networkSecurityConfigRes = orig.networkSecurityConfigRes; 935 } 936 toString()937 public String toString() { 938 return "ApplicationInfo{" 939 + Integer.toHexString(System.identityHashCode(this)) 940 + " " + packageName + "}"; 941 } 942 describeContents()943 public int describeContents() { 944 return 0; 945 } 946 writeToParcel(Parcel dest, int parcelableFlags)947 public void writeToParcel(Parcel dest, int parcelableFlags) { 948 super.writeToParcel(dest, parcelableFlags); 949 dest.writeString(taskAffinity); 950 dest.writeString(permission); 951 dest.writeString(processName); 952 dest.writeString(className); 953 dest.writeInt(theme); 954 dest.writeInt(flags); 955 dest.writeInt(privateFlags); 956 dest.writeInt(requiresSmallestWidthDp); 957 dest.writeInt(compatibleWidthLimitDp); 958 dest.writeInt(largestWidthLimitDp); 959 dest.writeString(volumeUuid); 960 dest.writeString(scanSourceDir); 961 dest.writeString(scanPublicSourceDir); 962 dest.writeString(sourceDir); 963 dest.writeString(publicSourceDir); 964 dest.writeStringArray(splitSourceDirs); 965 dest.writeStringArray(splitPublicSourceDirs); 966 dest.writeString(nativeLibraryDir); 967 dest.writeString(secondaryNativeLibraryDir); 968 dest.writeString(nativeLibraryRootDir); 969 dest.writeInt(nativeLibraryRootRequiresIsa ? 1 : 0); 970 dest.writeString(primaryCpuAbi); 971 dest.writeString(secondaryCpuAbi); 972 dest.writeStringArray(resourceDirs); 973 dest.writeString(seinfo); 974 dest.writeStringArray(sharedLibraryFiles); 975 dest.writeString(dataDir); 976 dest.writeString(deviceProtectedDataDir); 977 dest.writeString(credentialProtectedDataDir); 978 dest.writeInt(uid); 979 dest.writeInt(minSdkVersion); 980 dest.writeInt(targetSdkVersion); 981 dest.writeInt(versionCode); 982 dest.writeInt(enabled ? 1 : 0); 983 dest.writeInt(enabledSetting); 984 dest.writeInt(installLocation); 985 dest.writeString(manageSpaceActivityName); 986 dest.writeString(backupAgentName); 987 dest.writeInt(descriptionRes); 988 dest.writeInt(uiOptions); 989 dest.writeInt(fullBackupContent); 990 dest.writeInt(networkSecurityConfigRes); 991 } 992 993 public static final Parcelable.Creator<ApplicationInfo> CREATOR 994 = new Parcelable.Creator<ApplicationInfo>() { 995 public ApplicationInfo createFromParcel(Parcel source) { 996 return new ApplicationInfo(source); 997 } 998 public ApplicationInfo[] newArray(int size) { 999 return new ApplicationInfo[size]; 1000 } 1001 }; 1002 ApplicationInfo(Parcel source)1003 private ApplicationInfo(Parcel source) { 1004 super(source); 1005 taskAffinity = source.readString(); 1006 permission = source.readString(); 1007 processName = source.readString(); 1008 className = source.readString(); 1009 theme = source.readInt(); 1010 flags = source.readInt(); 1011 privateFlags = source.readInt(); 1012 requiresSmallestWidthDp = source.readInt(); 1013 compatibleWidthLimitDp = source.readInt(); 1014 largestWidthLimitDp = source.readInt(); 1015 volumeUuid = source.readString(); 1016 scanSourceDir = source.readString(); 1017 scanPublicSourceDir = source.readString(); 1018 sourceDir = source.readString(); 1019 publicSourceDir = source.readString(); 1020 splitSourceDirs = source.readStringArray(); 1021 splitPublicSourceDirs = source.readStringArray(); 1022 nativeLibraryDir = source.readString(); 1023 secondaryNativeLibraryDir = source.readString(); 1024 nativeLibraryRootDir = source.readString(); 1025 nativeLibraryRootRequiresIsa = source.readInt() != 0; 1026 primaryCpuAbi = source.readString(); 1027 secondaryCpuAbi = source.readString(); 1028 resourceDirs = source.readStringArray(); 1029 seinfo = source.readString(); 1030 sharedLibraryFiles = source.readStringArray(); 1031 dataDir = source.readString(); 1032 deviceEncryptedDataDir = deviceProtectedDataDir = source.readString(); 1033 credentialEncryptedDataDir = credentialProtectedDataDir = source.readString(); 1034 uid = source.readInt(); 1035 minSdkVersion = source.readInt(); 1036 targetSdkVersion = source.readInt(); 1037 versionCode = source.readInt(); 1038 enabled = source.readInt() != 0; 1039 enabledSetting = source.readInt(); 1040 installLocation = source.readInt(); 1041 manageSpaceActivityName = source.readString(); 1042 backupAgentName = source.readString(); 1043 descriptionRes = source.readInt(); 1044 uiOptions = source.readInt(); 1045 fullBackupContent = source.readInt(); 1046 networkSecurityConfigRes = source.readInt(); 1047 } 1048 1049 /** 1050 * Retrieve the textual description of the application. This 1051 * will call back on the given PackageManager to load the description from 1052 * the application. 1053 * 1054 * @param pm A PackageManager from which the label can be loaded; usually 1055 * the PackageManager from which you originally retrieved this item. 1056 * 1057 * @return Returns a CharSequence containing the application's description. 1058 * If there is no description, null is returned. 1059 */ loadDescription(PackageManager pm)1060 public CharSequence loadDescription(PackageManager pm) { 1061 if (descriptionRes != 0) { 1062 CharSequence label = pm.getText(packageName, descriptionRes, this); 1063 if (label != null) { 1064 return label; 1065 } 1066 } 1067 return null; 1068 } 1069 1070 /** 1071 * Disable compatibility mode 1072 * 1073 * @hide 1074 */ disableCompatibilityMode()1075 public void disableCompatibilityMode() { 1076 flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS | 1077 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS | 1078 FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS); 1079 } 1080 1081 /** {@hide} */ initForUser(int userId)1082 public void initForUser(int userId) { 1083 uid = UserHandle.getUid(userId, UserHandle.getAppId(uid)); 1084 1085 if ("android".equals(packageName)) { 1086 dataDir = Environment.getDataSystemDirectory().getAbsolutePath(); 1087 return; 1088 } 1089 1090 deviceEncryptedDataDir = deviceProtectedDataDir = Environment 1091 .getDataUserDePackageDirectory(volumeUuid, userId, packageName) 1092 .getAbsolutePath(); 1093 credentialEncryptedDataDir = credentialProtectedDataDir = Environment 1094 .getDataUserCePackageDirectory(volumeUuid, userId, packageName) 1095 .getAbsolutePath(); 1096 1097 if ((privateFlags & PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0 1098 && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) { 1099 dataDir = deviceProtectedDataDir; 1100 } else { 1101 dataDir = credentialProtectedDataDir; 1102 } 1103 } 1104 1105 /** 1106 * @hide 1107 */ 1108 @Override loadDefaultIcon(PackageManager pm)1109 public Drawable loadDefaultIcon(PackageManager pm) { 1110 if ((flags & FLAG_EXTERNAL_STORAGE) != 0 1111 && isPackageUnavailable(pm)) { 1112 return Resources.getSystem().getDrawable( 1113 com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon); 1114 } 1115 return pm.getDefaultActivityIcon(); 1116 } 1117 isPackageUnavailable(PackageManager pm)1118 private boolean isPackageUnavailable(PackageManager pm) { 1119 try { 1120 return pm.getPackageInfo(packageName, 0) == null; 1121 } catch (NameNotFoundException ex) { 1122 return true; 1123 } 1124 } 1125 1126 /** 1127 * @hide 1128 */ isForwardLocked()1129 public boolean isForwardLocked() { 1130 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0; 1131 } 1132 1133 /** 1134 * @hide 1135 */ 1136 @TestApi isSystemApp()1137 public boolean isSystemApp() { 1138 return (flags & ApplicationInfo.FLAG_SYSTEM) != 0; 1139 } 1140 1141 /** 1142 * @hide 1143 */ 1144 @TestApi isPrivilegedApp()1145 public boolean isPrivilegedApp() { 1146 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; 1147 } 1148 1149 /** 1150 * @hide 1151 */ isUpdatedSystemApp()1152 public boolean isUpdatedSystemApp() { 1153 return (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 1154 } 1155 1156 /** @hide */ isInternal()1157 public boolean isInternal() { 1158 return (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0; 1159 } 1160 1161 /** @hide */ isExternalAsec()1162 public boolean isExternalAsec() { 1163 return TextUtils.isEmpty(volumeUuid) 1164 && (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; 1165 } 1166 1167 /** @hide */ isDefaultToDeviceProtectedStorage()1168 public boolean isDefaultToDeviceProtectedStorage() { 1169 return (privateFlags 1170 & ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0; 1171 } 1172 1173 /** @hide */ isDirectBootAware()1174 public boolean isDirectBootAware() { 1175 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE) != 0; 1176 } 1177 1178 /** @hide */ isPartiallyDirectBootAware()1179 public boolean isPartiallyDirectBootAware() { 1180 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE) != 0; 1181 } 1182 1183 /** 1184 * @hide 1185 */ isAutoPlayApp()1186 public boolean isAutoPlayApp() { 1187 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_AUTOPLAY) != 0; 1188 } 1189 1190 /** 1191 * @hide 1192 */ isEphemeralApp()1193 public boolean isEphemeralApp() { 1194 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_EPHEMERAL) != 0; 1195 } 1196 1197 /** 1198 * @hide 1199 */ isRequiredForSystemUser()1200 public boolean isRequiredForSystemUser() { 1201 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER) != 0; 1202 } 1203 1204 /** 1205 * @hide 1206 */ getApplicationInfo()1207 @Override protected ApplicationInfo getApplicationInfo() { 1208 return this; 1209 } 1210 setCodePath(String codePath)1211 /** {@hide} */ public void setCodePath(String codePath) { scanSourceDir = codePath; } setBaseCodePath(String baseCodePath)1212 /** {@hide} */ public void setBaseCodePath(String baseCodePath) { sourceDir = baseCodePath; } setSplitCodePaths(String[] splitCodePaths)1213 /** {@hide} */ public void setSplitCodePaths(String[] splitCodePaths) { splitSourceDirs = splitCodePaths; } setResourcePath(String resourcePath)1214 /** {@hide} */ public void setResourcePath(String resourcePath) { scanPublicSourceDir = resourcePath; } setBaseResourcePath(String baseResourcePath)1215 /** {@hide} */ public void setBaseResourcePath(String baseResourcePath) { publicSourceDir = baseResourcePath; } setSplitResourcePaths(String[] splitResourcePaths)1216 /** {@hide} */ public void setSplitResourcePaths(String[] splitResourcePaths) { splitPublicSourceDirs = splitResourcePaths; } 1217 getCodePath()1218 /** {@hide} */ public String getCodePath() { return scanSourceDir; } getBaseCodePath()1219 /** {@hide} */ public String getBaseCodePath() { return sourceDir; } getSplitCodePaths()1220 /** {@hide} */ public String[] getSplitCodePaths() { return splitSourceDirs; } getResourcePath()1221 /** {@hide} */ public String getResourcePath() { return scanPublicSourceDir; } getBaseResourcePath()1222 /** {@hide} */ public String getBaseResourcePath() { return publicSourceDir; } getSplitResourcePaths()1223 /** {@hide} */ public String[] getSplitResourcePaths() { return splitSourceDirs; } 1224 } 1225