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