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 static android.os.Build.VERSION_CODES.DONUT; 20 21 import android.annotation.IntDef; 22 import android.annotation.SystemApi; 23 import android.annotation.TestApi; 24 import android.content.Context; 25 import android.content.pm.PackageManager.NameNotFoundException; 26 import android.content.res.Resources; 27 import android.graphics.drawable.Drawable; 28 import android.os.Environment; 29 import android.os.Parcel; 30 import android.os.Parcelable; 31 import android.os.UserHandle; 32 import android.os.storage.StorageManager; 33 import android.text.TextUtils; 34 import android.util.Printer; 35 import android.util.SparseArray; 36 37 import com.android.internal.util.ArrayUtils; 38 39 import java.lang.annotation.Retention; 40 import java.lang.annotation.RetentionPolicy; 41 import java.text.Collator; 42 import java.util.Arrays; 43 import java.util.Comparator; 44 import java.util.Objects; 45 import java.util.UUID; 46 47 /** 48 * Information you can retrieve about a particular application. This 49 * corresponds to information collected from the AndroidManifest.xml's 50 * <application> tag. 51 */ 52 public class ApplicationInfo extends PackageItemInfo implements Parcelable { 53 54 /** 55 * Default task affinity of all activities in this application. See 56 * {@link ActivityInfo#taskAffinity} for more information. This comes 57 * from the "taskAffinity" attribute. 58 */ 59 public String taskAffinity; 60 61 /** 62 * Optional name of a permission required to be able to access this 63 * application's components. From the "permission" attribute. 64 */ 65 public String permission; 66 67 /** 68 * The name of the process this application should run in. From the 69 * "process" attribute or, if not set, the same as 70 * <var>packageName</var>. 71 */ 72 public String processName; 73 74 /** 75 * Class implementing the Application object. From the "class" 76 * attribute. 77 */ 78 public String className; 79 80 /** 81 * A style resource identifier (in the package's resources) of the 82 * description of an application. From the "description" attribute 83 * or, if not set, 0. 84 */ 85 public int descriptionRes; 86 87 /** 88 * A style resource identifier (in the package's resources) of the 89 * default visual theme of the application. From the "theme" attribute 90 * or, if not set, 0. 91 */ 92 public int theme; 93 94 /** 95 * Class implementing the Application's manage space 96 * functionality. From the "manageSpaceActivity" 97 * attribute. This is an optional attribute and will be null if 98 * applications don't specify it in their manifest 99 */ 100 public String manageSpaceActivityName; 101 102 /** 103 * Class implementing the Application's backup functionality. From 104 * the "backupAgent" attribute. This is an optional attribute and 105 * will be null if the application does not specify it in its manifest. 106 * 107 * <p>If android:allowBackup is set to false, this attribute is ignored. 108 */ 109 public String backupAgentName; 110 111 /** 112 * An optional attribute that indicates the app supports automatic backup of app data. 113 * <p>0 is the default and means the app's entire data folder + managed external storage will 114 * be backed up; 115 * Any negative value indicates the app does not support full-data backup, though it may still 116 * want to participate via the traditional key/value backup API; 117 * A positive number specifies an xml resource in which the application has defined its backup 118 * include/exclude criteria. 119 * <p>If android:allowBackup is set to false, this attribute is ignored. 120 * 121 * @see android.content.Context#getNoBackupFilesDir() 122 * @see #FLAG_ALLOW_BACKUP 123 * 124 * @hide 125 */ 126 public int fullBackupContent = 0; 127 128 /** 129 * The default extra UI options for activities in this application. 130 * Set from the {@link android.R.attr#uiOptions} attribute in the 131 * activity's manifest. 132 */ 133 public int uiOptions = 0; 134 135 /** 136 * Value for {@link #flags}: if set, this application is installed in the 137 * device's system image. 138 */ 139 public static final int FLAG_SYSTEM = 1<<0; 140 141 /** 142 * Value for {@link #flags}: set to true if this application would like to 143 * allow debugging of its 144 * code, even when installed on a non-development system. Comes 145 * from {@link android.R.styleable#AndroidManifestApplication_debuggable 146 * android:debuggable} of the <application> tag. 147 */ 148 public static final int FLAG_DEBUGGABLE = 1<<1; 149 150 /** 151 * Value for {@link #flags}: set to true if this application has code 152 * associated with it. Comes 153 * from {@link android.R.styleable#AndroidManifestApplication_hasCode 154 * android:hasCode} of the <application> tag. 155 */ 156 public static final int FLAG_HAS_CODE = 1<<2; 157 158 /** 159 * Value for {@link #flags}: set to true if this application is persistent. 160 * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent 161 * android:persistent} of the <application> tag. 162 */ 163 public static final int FLAG_PERSISTENT = 1<<3; 164 165 /** 166 * Value for {@link #flags}: set to true if this application holds the 167 * {@link android.Manifest.permission#FACTORY_TEST} permission and the 168 * device is running in factory test mode. 169 */ 170 public static final int FLAG_FACTORY_TEST = 1<<4; 171 172 /** 173 * Value for {@link #flags}: default value for the corresponding ActivityInfo flag. 174 * Comes from {@link android.R.styleable#AndroidManifestApplication_allowTaskReparenting 175 * android:allowTaskReparenting} of the <application> tag. 176 */ 177 public static final int FLAG_ALLOW_TASK_REPARENTING = 1<<5; 178 179 /** 180 * Value for {@link #flags}: default value for the corresponding ActivityInfo flag. 181 * Comes from {@link android.R.styleable#AndroidManifestApplication_allowClearUserData 182 * android:allowClearUserData} of the <application> tag. 183 */ 184 public static final int FLAG_ALLOW_CLEAR_USER_DATA = 1<<6; 185 186 /** 187 * Value for {@link #flags}: this is set if this application has been 188 * installed as an update to a built-in system application. 189 */ 190 public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7; 191 192 /** 193 * Value for {@link #flags}: this is set if the application has specified 194 * {@link android.R.styleable#AndroidManifestApplication_testOnly 195 * android:testOnly} to be true. 196 */ 197 public static final int FLAG_TEST_ONLY = 1<<8; 198 199 /** 200 * Value for {@link #flags}: true when the application's window can be 201 * reduced in size for smaller screens. Corresponds to 202 * {@link android.R.styleable#AndroidManifestSupportsScreens_smallScreens 203 * android:smallScreens}. 204 */ 205 public static final int FLAG_SUPPORTS_SMALL_SCREENS = 1<<9; 206 207 /** 208 * Value for {@link #flags}: true when the application's window can be 209 * displayed on normal screens. Corresponds to 210 * {@link android.R.styleable#AndroidManifestSupportsScreens_normalScreens 211 * android:normalScreens}. 212 */ 213 public static final int FLAG_SUPPORTS_NORMAL_SCREENS = 1<<10; 214 215 /** 216 * Value for {@link #flags}: true when the application's window can be 217 * increased in size for larger screens. Corresponds to 218 * {@link android.R.styleable#AndroidManifestSupportsScreens_largeScreens 219 * android:largeScreens}. 220 */ 221 public static final int FLAG_SUPPORTS_LARGE_SCREENS = 1<<11; 222 223 /** 224 * Value for {@link #flags}: true when the application knows how to adjust 225 * its UI for different screen sizes. Corresponds to 226 * {@link android.R.styleable#AndroidManifestSupportsScreens_resizeable 227 * android:resizeable}. 228 */ 229 public static final int FLAG_RESIZEABLE_FOR_SCREENS = 1<<12; 230 231 /** 232 * Value for {@link #flags}: true when the application knows how to 233 * accomodate different screen densities. Corresponds to 234 * {@link android.R.styleable#AndroidManifestSupportsScreens_anyDensity 235 * android:anyDensity}. 236 */ 237 public static final int FLAG_SUPPORTS_SCREEN_DENSITIES = 1<<13; 238 239 /** 240 * Value for {@link #flags}: set to true if this application would like to 241 * request the VM to operate under the safe mode. Comes from 242 * {@link android.R.styleable#AndroidManifestApplication_vmSafeMode 243 * android:vmSafeMode} of the <application> tag. 244 */ 245 public static final int FLAG_VM_SAFE_MODE = 1<<14; 246 247 /** 248 * Value for {@link #flags}: set to <code>false</code> if the application does not wish 249 * to permit any OS-driven backups of its data; <code>true</code> otherwise. 250 * 251 * <p>Comes from the 252 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup} 253 * attribute of the <application> tag. 254 */ 255 public static final int FLAG_ALLOW_BACKUP = 1<<15; 256 257 /** 258 * Value for {@link #flags}: set to <code>false</code> if the application must be kept 259 * in memory following a full-system restore operation; <code>true</code> otherwise. 260 * Ordinarily, during a full system restore operation each application is shut down 261 * following execution of its agent's onRestore() method. Setting this attribute to 262 * <code>false</code> prevents this. Most applications will not need to set this attribute. 263 * 264 * <p>If 265 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup} 266 * is set to <code>false</code> or no 267 * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent} 268 * is specified, this flag will be ignored. 269 * 270 * <p>Comes from the 271 * {@link android.R.styleable#AndroidManifestApplication_killAfterRestore android:killAfterRestore} 272 * attribute of the <application> tag. 273 */ 274 public static final int FLAG_KILL_AFTER_RESTORE = 1<<16; 275 276 /** 277 * Value for {@link #flags}: Set to <code>true</code> if the application's backup 278 * agent claims to be able to handle restore data even "from the future," 279 * i.e. from versions of the application with a versionCode greater than 280 * the one currently installed on the device. <i>Use with caution!</i> By default 281 * this attribute is <code>false</code> and the Backup Manager will ensure that data 282 * from "future" versions of the application are never supplied during a restore operation. 283 * 284 * <p>If 285 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup} 286 * is set to <code>false</code> or no 287 * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent} 288 * is specified, this flag will be ignored. 289 * 290 * <p>Comes from the 291 * {@link android.R.styleable#AndroidManifestApplication_restoreAnyVersion android:restoreAnyVersion} 292 * attribute of the <application> tag. 293 */ 294 public static final int FLAG_RESTORE_ANY_VERSION = 1<<17; 295 296 /** 297 * Value for {@link #flags}: Set to true if the application is 298 * currently installed on external/removable/unprotected storage. Such 299 * applications may not be available if their storage is not currently 300 * mounted. When the storage it is on is not available, it will look like 301 * the application has been uninstalled (its .apk is no longer available) 302 * but its persistent data is not removed. 303 */ 304 public static final int FLAG_EXTERNAL_STORAGE = 1<<18; 305 306 /** 307 * Value for {@link #flags}: true when the application's window can be 308 * increased in size for extra large screens. Corresponds to 309 * {@link android.R.styleable#AndroidManifestSupportsScreens_xlargeScreens 310 * android:xlargeScreens}. 311 */ 312 public static final int FLAG_SUPPORTS_XLARGE_SCREENS = 1<<19; 313 314 /** 315 * Value for {@link #flags}: true when the application has requested a 316 * large heap for its processes. Corresponds to 317 * {@link android.R.styleable#AndroidManifestApplication_largeHeap 318 * android:largeHeap}. 319 */ 320 public static final int FLAG_LARGE_HEAP = 1<<20; 321 322 /** 323 * Value for {@link #flags}: true if this application's package is in 324 * the stopped state. 325 */ 326 public static final int FLAG_STOPPED = 1<<21; 327 328 /** 329 * Value for {@link #flags}: true when the application is willing to support 330 * RTL (right to left). All activities will inherit this value. 331 * 332 * Set from the {@link android.R.attr#supportsRtl} attribute in the 333 * activity's manifest. 334 * 335 * Default value is false (no support for RTL). 336 */ 337 public static final int FLAG_SUPPORTS_RTL = 1<<22; 338 339 /** 340 * Value for {@link #flags}: true if the application is currently 341 * installed for the calling user. 342 */ 343 public static final int FLAG_INSTALLED = 1<<23; 344 345 /** 346 * Value for {@link #flags}: true if the application only has its 347 * data installed; the application package itself does not currently 348 * exist on the device. 349 */ 350 public static final int FLAG_IS_DATA_ONLY = 1<<24; 351 352 /** 353 * Value for {@link #flags}: true if the application was declared to be a 354 * game, or false if it is a non-game application. 355 * 356 * @deprecated use {@link #CATEGORY_GAME} instead. 357 */ 358 @Deprecated 359 public static final int FLAG_IS_GAME = 1<<25; 360 361 /** 362 * Value for {@link #flags}: {@code true} if the application asks that only 363 * full-data streaming backups of its data be performed even though it defines 364 * a {@link android.app.backup.BackupAgent BackupAgent}, which normally 365 * indicates that the app will manage its backed-up data via incremental 366 * key/value updates. 367 */ 368 public static final int FLAG_FULL_BACKUP_ONLY = 1<<26; 369 370 /** 371 * Value for {@link #flags}: {@code true} if the application may use cleartext network traffic 372 * (e.g., HTTP rather than HTTPS; WebSockets rather than WebSockets Secure; XMPP, IMAP, STMP 373 * without STARTTLS or TLS). If {@code false}, the app declares that it does not intend to use 374 * cleartext network traffic, in which case platform components (e.g., HTTP stacks, 375 * {@code DownloadManager}, {@code MediaPlayer}) will refuse app's requests to use cleartext 376 * traffic. Third-party libraries are encouraged to honor this flag as well. 377 * 378 * <p>NOTE: {@code WebView} does not honor this flag. 379 * 380 * <p>This flag is ignored on Android N and above if an Android Network Security Config is 381 * present. 382 * 383 * <p>This flag comes from 384 * {@link android.R.styleable#AndroidManifestApplication_usesCleartextTraffic 385 * android:usesCleartextTraffic} of the <application> tag. 386 */ 387 public static final int FLAG_USES_CLEARTEXT_TRAFFIC = 1<<27; 388 389 /** 390 * When set installer extracts native libs from .apk files. 391 */ 392 public static final int FLAG_EXTRACT_NATIVE_LIBS = 1<<28; 393 394 /** 395 * Value for {@link #flags}: {@code true} when the application's rendering 396 * should be hardware accelerated. 397 */ 398 public static final int FLAG_HARDWARE_ACCELERATED = 1<<29; 399 400 /** 401 * Value for {@link #flags}: true if this application's package is in 402 * the suspended state. 403 */ 404 public static final int FLAG_SUSPENDED = 1<<30; 405 406 /** 407 * Value for {@link #flags}: true if code from this application will need to be 408 * loaded into other applications' processes. On devices that support multiple 409 * instruction sets, this implies the code might be loaded into a process that's 410 * using any of the devices supported instruction sets. 411 * 412 * <p> The system might treat such applications specially, for eg., by 413 * extracting the application's native libraries for all supported instruction 414 * sets or by compiling the application's dex code for all supported instruction 415 * sets. 416 */ 417 public static final int FLAG_MULTIARCH = 1 << 31; 418 419 /** 420 * Flags associated with the application. Any combination of 421 * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE}, 422 * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and 423 * {@link #FLAG_ALLOW_TASK_REPARENTING} 424 * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP}, 425 * {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS}, 426 * {@link #FLAG_SUPPORTS_NORMAL_SCREENS}, 427 * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_SUPPORTS_XLARGE_SCREENS}, 428 * {@link #FLAG_RESIZEABLE_FOR_SCREENS}, 429 * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}, {@link #FLAG_VM_SAFE_MODE}, 430 * {@link #FLAG_ALLOW_BACKUP}, {@link #FLAG_KILL_AFTER_RESTORE}, 431 * {@link #FLAG_RESTORE_ANY_VERSION}, {@link #FLAG_EXTERNAL_STORAGE}, 432 * {@link #FLAG_LARGE_HEAP}, {@link #FLAG_STOPPED}, 433 * {@link #FLAG_SUPPORTS_RTL}, {@link #FLAG_INSTALLED}, 434 * {@link #FLAG_IS_DATA_ONLY}, {@link #FLAG_IS_GAME}, 435 * {@link #FLAG_FULL_BACKUP_ONLY}, {@link #FLAG_USES_CLEARTEXT_TRAFFIC}, 436 * {@link #FLAG_MULTIARCH}. 437 */ 438 public int flags = 0; 439 440 /** 441 * Value for {@link #privateFlags}: true if the application is hidden via restrictions and for 442 * most purposes is considered as not installed. 443 * {@hide} 444 */ 445 public static final int PRIVATE_FLAG_HIDDEN = 1<<0; 446 447 /** 448 * Value for {@link #privateFlags}: set to <code>true</code> if the application 449 * has reported that it is heavy-weight, and thus can not participate in 450 * the normal application lifecycle. 451 * 452 * <p>Comes from the 453 * android.R.styleable#AndroidManifestApplication_cantSaveState 454 * attribute of the <application> tag. 455 * 456 * {@hide} 457 */ 458 public static final int PRIVATE_FLAG_CANT_SAVE_STATE = 1<<1; 459 460 /** 461 * Value for {@link #privateFlags}: Set to true if the application has been 462 * installed using the forward lock option. 463 * 464 * NOTE: DO NOT CHANGE THIS VALUE! It is saved in packages.xml. 465 * 466 * {@hide} 467 */ 468 public static final int PRIVATE_FLAG_FORWARD_LOCK = 1<<2; 469 470 /** 471 * Value for {@link #privateFlags}: set to {@code true} if the application 472 * is permitted to hold privileged permissions. 473 * 474 * {@hide} 475 */ 476 public static final int PRIVATE_FLAG_PRIVILEGED = 1<<3; 477 478 /** 479 * Value for {@link #privateFlags}: {@code true} if the application has any IntentFiler 480 * with some data URI using HTTP or HTTPS with an associated VIEW action. 481 * 482 * {@hide} 483 */ 484 public static final int PRIVATE_FLAG_HAS_DOMAIN_URLS = 1<<4; 485 486 /** 487 * When set, the default data storage directory for this app is pointed at 488 * the device-protected location. 489 * 490 * @hide 491 */ 492 public static final int PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1 << 5; 493 494 /** 495 * When set, assume that all components under the given app are direct boot 496 * aware, unless otherwise specified. 497 * 498 * @hide 499 */ 500 public static final int PRIVATE_FLAG_DIRECT_BOOT_AWARE = 1 << 6; 501 502 /** 503 * Value for {@link #privateFlags}: {@code true} if the application is installed 504 * as instant app. 505 * 506 * @hide 507 */ 508 public static final int PRIVATE_FLAG_INSTANT = 1 << 7; 509 510 /** 511 * When set, at least one component inside this application is direct boot 512 * aware. 513 * 514 * @hide 515 */ 516 public static final int PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE = 1 << 8; 517 518 519 /** 520 * When set, signals that the application is required for the system user and should not be 521 * uninstalled. 522 * 523 * @hide 524 */ 525 public static final int PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER = 1 << 9; 526 527 /** 528 * When set, the application explicitly requested that its activities be resizeable by default. 529 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity 530 * 531 * @hide 532 */ 533 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE = 1 << 10; 534 535 /** 536 * When set, the application explicitly requested that its activities *not* be resizeable by 537 * default. 538 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity 539 * 540 * @hide 541 */ 542 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE = 1 << 11; 543 544 /** 545 * The application isn't requesting explicitly requesting for its activities to be resizeable or 546 * non-resizeable by default. So, we are making it activities resizeable by default based on the 547 * target SDK version of the app. 548 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity 549 * 550 * NOTE: This only affects apps with target SDK >= N where the resizeableActivity attribute was 551 * introduced. It shouldn't be confused with {@link ActivityInfo#RESIZE_MODE_FORCE_RESIZEABLE} 552 * where certain pre-N apps are forced to the resizeable. 553 * 554 * @hide 555 */ 556 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION = 557 1 << 12; 558 559 /** 560 * Value for {@link #privateFlags}: {@code true} means the OS should go ahead and 561 * run full-data backup operations for the app even when it is in a 562 * foreground-equivalent run state. Defaults to {@code false} if unspecified. 563 * @hide 564 */ 565 public static final int PRIVATE_FLAG_BACKUP_IN_FOREGROUND = 1 << 13; 566 567 /** 568 * Value for {@link #privateFlags}: {@code true} means this application 569 * contains a static shared library. Defaults to {@code false} if unspecified. 570 * @hide 571 */ 572 public static final int PRIVATE_FLAG_STATIC_SHARED_LIBRARY = 1 << 14; 573 574 /** 575 * Value for {@linl #privateFlags}: When set, the application will only have its splits loaded 576 * if they are required to load a component. Splits can be loaded on demand using the 577 * {@link Context#createContextForSplit(String)} API. 578 * @hide 579 */ 580 public static final int PRIVATE_FLAG_ISOLATED_SPLIT_LOADING = 1 << 15; 581 582 /** 583 * Private/hidden flags. See {@code PRIVATE_FLAG_...} constants. 584 * {@hide} 585 */ 586 public int privateFlags; 587 588 /** 589 * @hide 590 */ 591 public static final String METADATA_PRELOADED_FONTS = "preloaded_fonts"; 592 593 /** 594 * The required smallest screen width the application can run on. If 0, 595 * nothing has been specified. Comes from 596 * {@link android.R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp 597 * android:requiresSmallestWidthDp} attribute of the <supports-screens> tag. 598 */ 599 public int requiresSmallestWidthDp = 0; 600 601 /** 602 * The maximum smallest screen width the application is designed for. If 0, 603 * nothing has been specified. Comes from 604 * {@link android.R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp 605 * android:compatibleWidthLimitDp} attribute of the <supports-screens> tag. 606 */ 607 public int compatibleWidthLimitDp = 0; 608 609 /** 610 * The maximum smallest screen width the application will work on. If 0, 611 * nothing has been specified. Comes from 612 * {@link android.R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp 613 * android:largestWidthLimitDp} attribute of the <supports-screens> tag. 614 */ 615 public int largestWidthLimitDp = 0; 616 617 /** 618 * Value indicating the maximum aspect ratio the application supports. 619 * <p> 620 * 0 means unset. 621 * @See {@link android.R.attr#maxAspectRatio}. 622 * @hide 623 */ 624 public float maxAspectRatio; 625 626 /** @removed */ 627 @Deprecated 628 public String volumeUuid; 629 630 /** 631 * UUID of the storage volume on which this application is being hosted. For 632 * apps hosted on the default internal storage at 633 * {@link Environment#getDataDirectory()}, the UUID value is 634 * {@link StorageManager#UUID_DEFAULT}. 635 */ 636 public UUID storageUuid; 637 638 /** {@hide} */ 639 public String scanSourceDir; 640 /** {@hide} */ 641 public String scanPublicSourceDir; 642 643 /** 644 * Full path to the base APK for this application. 645 */ 646 public String sourceDir; 647 648 /** 649 * Full path to the publicly available parts of {@link #sourceDir}, 650 * including resources and manifest. This may be different from 651 * {@link #sourceDir} if an application is forward locked. 652 */ 653 public String publicSourceDir; 654 655 /** 656 * The names of all installed split APKs, ordered lexicographically. 657 */ 658 public String[] splitNames; 659 660 /** 661 * Full paths to zero or more split APKs, indexed by the same order as {@link #splitNames}. 662 */ 663 public String[] splitSourceDirs; 664 665 /** 666 * Full path to the publicly available parts of {@link #splitSourceDirs}, 667 * including resources and manifest. This may be different from 668 * {@link #splitSourceDirs} if an application is forward locked. 669 * 670 * @see #splitSourceDirs 671 */ 672 public String[] splitPublicSourceDirs; 673 674 /** 675 * Maps the dependencies between split APKs. All splits implicitly depend on the base APK. 676 * 677 * Available since platform version O. 678 * 679 * Only populated if the application opts in to isolated split loading via the 680 * {@link android.R.attr.isolatedSplits} attribute in the <manifest> tag of the app's 681 * AndroidManifest.xml. 682 * 683 * The keys and values are all indices into the {@link #splitNames}, {@link #splitSourceDirs}, 684 * and {@link #splitPublicSourceDirs} arrays. 685 * Each key represents a split and its value is an array of splits. The first element of this 686 * array is the parent split, and the rest are configuration splits. These configuration splits 687 * have no dependencies themselves. 688 * Cycles do not exist because they are illegal and screened for during installation. 689 * 690 * May be null if no splits are installed, or if no dependencies exist between them. 691 * @hide 692 */ 693 public SparseArray<int[]> splitDependencies; 694 695 /** 696 * Full paths to the locations of extra resource packages (runtime overlays) 697 * this application uses. This field is only used if there are extra resource 698 * packages, otherwise it is null. 699 * 700 * {@hide} 701 */ 702 public String[] resourceDirs; 703 704 /** 705 * String retrieved from the seinfo tag found in selinux policy. This value 706 * can be overridden with a value set through the mac_permissions.xml policy 707 * construct. This value is useful in setting an SELinux security context on 708 * the process as well as its data directory. The String default is being used 709 * here to represent a catchall label when no policy matches. 710 * 711 * {@hide} 712 */ 713 public String seInfo = "default"; 714 715 /** 716 * The seinfo tag generated per-user. This value may change based upon the 717 * user's configuration. For example, when an instant app is installed for 718 * a user. It is an error if this field is ever {@code null} when trying to 719 * start a new process. 720 * <p>NOTE: We need to separate this out because we modify per-user values 721 * multiple times. This needs to be refactored since we're performing more 722 * work than necessary and these values should only be set once. When that 723 * happens, we can merge the per-user value with the seInfo state above. 724 * 725 * {@hide} 726 */ 727 public String seInfoUser; 728 729 /** 730 * Paths to all shared libraries this application is linked against. This 731 * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES 732 * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving 733 * the structure. 734 */ 735 public String[] sharedLibraryFiles; 736 737 /** 738 * Full path to the default directory assigned to the package for its 739 * persistent data. 740 */ 741 public String dataDir; 742 743 /** 744 * Full path to the device-protected directory assigned to the package for 745 * its persistent data. 746 * 747 * @see Context#createDeviceProtectedStorageContext() 748 */ 749 public String deviceProtectedDataDir; 750 751 /** 752 * Full path to the credential-protected directory assigned to the package 753 * for its persistent data. 754 * 755 * @hide 756 */ 757 @SystemApi 758 public String credentialProtectedDataDir; 759 760 /** 761 * Full path to the directory where native JNI libraries are stored. 762 */ 763 public String nativeLibraryDir; 764 765 /** 766 * Full path where unpacked native libraries for {@link #secondaryCpuAbi} 767 * are stored, if present. 768 * 769 * The main reason this exists is for bundled multi-arch apps, where 770 * it's not trivial to calculate the location of libs for the secondary abi 771 * given the location of the primary. 772 * 773 * TODO: Change the layout of bundled installs so that we can use 774 * nativeLibraryRootDir & nativeLibraryRootRequiresIsa there as well. 775 * (e.g {@code [ "/system/app-lib/Foo/arm", "/system/app-lib/Foo/arm64" ]} 776 * instead of {@code [ "/system/lib/Foo", "/system/lib64/Foo" ]}. 777 * 778 * @hide 779 */ 780 public String secondaryNativeLibraryDir; 781 782 /** 783 * The root path where unpacked native libraries are stored. 784 * <p> 785 * When {@link #nativeLibraryRootRequiresIsa} is set, the libraries are 786 * placed in ISA-specific subdirectories under this path, otherwise the 787 * libraries are placed directly at this path. 788 * 789 * @hide 790 */ 791 public String nativeLibraryRootDir; 792 793 /** 794 * Flag indicating that ISA must be appended to 795 * {@link #nativeLibraryRootDir} to be useful. 796 * 797 * @hide 798 */ 799 public boolean nativeLibraryRootRequiresIsa; 800 801 /** 802 * The primary ABI that this application requires, This is inferred from the ABIs 803 * of the native JNI libraries the application bundles. Will be {@code null} 804 * if this application does not require any particular ABI. 805 * 806 * If non-null, the application will always be launched with this ABI. 807 * 808 * {@hide} 809 */ 810 public String primaryCpuAbi; 811 812 /** 813 * The secondary ABI for this application. Might be non-null for multi-arch 814 * installs. The application itself never uses this ABI, but other applications that 815 * use its code might. 816 * 817 * {@hide} 818 */ 819 public String secondaryCpuAbi; 820 821 /** 822 * The kernel user-ID that has been assigned to this application; 823 * currently this is not a unique ID (multiple applications can have 824 * the same uid). 825 */ 826 public int uid; 827 828 /** 829 * The minimum SDK version this application can run on. It will not run 830 * on earlier versions. 831 */ 832 public int minSdkVersion; 833 834 /** 835 * The minimum SDK version this application targets. It may run on earlier 836 * versions, but it knows how to work with any new behavior added at this 837 * version. Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT} 838 * if this is a development build and the app is targeting that. You should 839 * compare that this number is >= the SDK version number at which your 840 * behavior was introduced. 841 */ 842 public int targetSdkVersion; 843 844 /** 845 * The app's declared version code. 846 * @hide 847 */ 848 public int versionCode; 849 850 /** 851 * When false, indicates that all components within this application are 852 * considered disabled, regardless of their individually set enabled status. 853 */ 854 public boolean enabled = true; 855 856 /** 857 * For convenient access to the current enabled setting of this app. 858 * @hide 859 */ 860 public int enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 861 862 /** 863 * For convenient access to package's install location. 864 * @hide 865 */ 866 public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 867 868 /** 869 * Resource file providing the application's Network Security Config. 870 * @hide 871 */ 872 public int networkSecurityConfigRes; 873 874 /** 875 * Version of the sandbox the application wants to run in. 876 * @hide 877 */ 878 public int targetSandboxVersion; 879 880 /** 881 * The category of this app. Categories are used to cluster multiple apps 882 * together into meaningful groups, such as when summarizing battery, 883 * network, or disk usage. Apps should only define this value when they fit 884 * well into one of the specific categories. 885 * <p> 886 * Set from the {@link android.R.attr#appCategory} attribute in the 887 * manifest. If the manifest doesn't define a category, this value may have 888 * been provided by the installer via 889 * {@link PackageManager#setApplicationCategoryHint(String, int)}. 890 */ 891 public @Category int category = CATEGORY_UNDEFINED; 892 893 /** {@hide} */ 894 @IntDef(prefix = { "CATEGORY_" }, value = { 895 CATEGORY_UNDEFINED, 896 CATEGORY_GAME, 897 CATEGORY_AUDIO, 898 CATEGORY_VIDEO, 899 CATEGORY_IMAGE, 900 CATEGORY_SOCIAL, 901 CATEGORY_NEWS, 902 CATEGORY_MAPS, 903 CATEGORY_PRODUCTIVITY 904 }) 905 @Retention(RetentionPolicy.SOURCE) 906 public @interface Category { 907 } 908 909 /** 910 * Value when category is undefined. 911 * 912 * @see #category 913 */ 914 public static final int CATEGORY_UNDEFINED = -1; 915 916 /** 917 * Category for apps which are primarily games. 918 * 919 * @see #category 920 */ 921 public static final int CATEGORY_GAME = 0; 922 923 /** 924 * Category for apps which primarily work with audio or music, such as music 925 * players. 926 * 927 * @see #category 928 */ 929 public static final int CATEGORY_AUDIO = 1; 930 931 /** 932 * Category for apps which primarily work with video or movies, such as 933 * streaming video apps. 934 * 935 * @see #category 936 */ 937 public static final int CATEGORY_VIDEO = 2; 938 939 /** 940 * Category for apps which primarily work with images or photos, such as 941 * camera or gallery apps. 942 * 943 * @see #category 944 */ 945 public static final int CATEGORY_IMAGE = 3; 946 947 /** 948 * Category for apps which are primarily social apps, such as messaging, 949 * communication, email, or social network apps. 950 * 951 * @see #category 952 */ 953 public static final int CATEGORY_SOCIAL = 4; 954 955 /** 956 * Category for apps which are primarily news apps, such as newspapers, 957 * magazines, or sports apps. 958 * 959 * @see #category 960 */ 961 public static final int CATEGORY_NEWS = 5; 962 963 /** 964 * Category for apps which are primarily maps apps, such as navigation apps. 965 * 966 * @see #category 967 */ 968 public static final int CATEGORY_MAPS = 6; 969 970 /** 971 * Category for apps which are primarily productivity apps, such as cloud 972 * storage or workplace apps. 973 * 974 * @see #category 975 */ 976 public static final int CATEGORY_PRODUCTIVITY = 7; 977 978 /** 979 * Return a concise, localized title for the given 980 * {@link ApplicationInfo#category} value, or {@code null} for unknown 981 * values such as {@link #CATEGORY_UNDEFINED}. 982 * 983 * @see #category 984 */ getCategoryTitle(Context context, @Category int category)985 public static CharSequence getCategoryTitle(Context context, @Category int category) { 986 switch (category) { 987 case ApplicationInfo.CATEGORY_GAME: 988 return context.getText(com.android.internal.R.string.app_category_game); 989 case ApplicationInfo.CATEGORY_AUDIO: 990 return context.getText(com.android.internal.R.string.app_category_audio); 991 case ApplicationInfo.CATEGORY_VIDEO: 992 return context.getText(com.android.internal.R.string.app_category_video); 993 case ApplicationInfo.CATEGORY_IMAGE: 994 return context.getText(com.android.internal.R.string.app_category_image); 995 case ApplicationInfo.CATEGORY_SOCIAL: 996 return context.getText(com.android.internal.R.string.app_category_social); 997 case ApplicationInfo.CATEGORY_NEWS: 998 return context.getText(com.android.internal.R.string.app_category_news); 999 case ApplicationInfo.CATEGORY_MAPS: 1000 return context.getText(com.android.internal.R.string.app_category_maps); 1001 case ApplicationInfo.CATEGORY_PRODUCTIVITY: 1002 return context.getText(com.android.internal.R.string.app_category_productivity); 1003 default: 1004 return null; 1005 } 1006 } 1007 dump(Printer pw, String prefix)1008 public void dump(Printer pw, String prefix) { 1009 dump(pw, prefix, DUMP_FLAG_ALL); 1010 } 1011 1012 /** @hide */ dump(Printer pw, String prefix, int flags)1013 public void dump(Printer pw, String prefix, int flags) { 1014 super.dumpFront(pw, prefix); 1015 if ((flags&DUMP_FLAG_DETAILS) != 0 && className != null) { 1016 pw.println(prefix + "className=" + className); 1017 } 1018 if (permission != null) { 1019 pw.println(prefix + "permission=" + permission); 1020 } 1021 pw.println(prefix + "processName=" + processName); 1022 if ((flags&DUMP_FLAG_DETAILS) != 0) { 1023 pw.println(prefix + "taskAffinity=" + taskAffinity); 1024 } 1025 pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags) 1026 + " privateFlags=0x" + Integer.toHexString(privateFlags) 1027 + " theme=0x" + Integer.toHexString(theme)); 1028 if ((flags&DUMP_FLAG_DETAILS) != 0) { 1029 pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp 1030 + " compatibleWidthLimitDp=" + compatibleWidthLimitDp 1031 + " largestWidthLimitDp=" + largestWidthLimitDp); 1032 } 1033 pw.println(prefix + "sourceDir=" + sourceDir); 1034 if (!Objects.equals(sourceDir, publicSourceDir)) { 1035 pw.println(prefix + "publicSourceDir=" + publicSourceDir); 1036 } 1037 if (!ArrayUtils.isEmpty(splitSourceDirs)) { 1038 pw.println(prefix + "splitSourceDirs=" + Arrays.toString(splitSourceDirs)); 1039 } 1040 if (!ArrayUtils.isEmpty(splitPublicSourceDirs) 1041 && !Arrays.equals(splitSourceDirs, splitPublicSourceDirs)) { 1042 pw.println(prefix + "splitPublicSourceDirs=" + Arrays.toString(splitPublicSourceDirs)); 1043 } 1044 if (resourceDirs != null) { 1045 pw.println(prefix + "resourceDirs=" + Arrays.toString(resourceDirs)); 1046 } 1047 if ((flags&DUMP_FLAG_DETAILS) != 0 && seInfo != null) { 1048 pw.println(prefix + "seinfo=" + seInfo); 1049 pw.println(prefix + "seinfoUser=" + seInfoUser); 1050 } 1051 pw.println(prefix + "dataDir=" + dataDir); 1052 if ((flags&DUMP_FLAG_DETAILS) != 0) { 1053 pw.println(prefix + "deviceProtectedDataDir=" + deviceProtectedDataDir); 1054 pw.println(prefix + "credentialProtectedDataDir=" + credentialProtectedDataDir); 1055 if (sharedLibraryFiles != null) { 1056 pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles)); 1057 } 1058 } 1059 pw.println(prefix + "enabled=" + enabled 1060 + " minSdkVersion=" + minSdkVersion 1061 + " targetSdkVersion=" + targetSdkVersion 1062 + " versionCode=" + versionCode 1063 + " targetSandboxVersion=" + targetSandboxVersion); 1064 if ((flags&DUMP_FLAG_DETAILS) != 0) { 1065 if (manageSpaceActivityName != null) { 1066 pw.println(prefix + "manageSpaceActivityName=" + manageSpaceActivityName); 1067 } 1068 if (descriptionRes != 0) { 1069 pw.println(prefix + "description=0x" + Integer.toHexString(descriptionRes)); 1070 } 1071 if (uiOptions != 0) { 1072 pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions)); 1073 } 1074 pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false")); 1075 if (fullBackupContent > 0) { 1076 pw.println(prefix + "fullBackupContent=@xml/" + fullBackupContent); 1077 } else { 1078 pw.println(prefix + "fullBackupContent=" 1079 + (fullBackupContent < 0 ? "false" : "true")); 1080 } 1081 if (networkSecurityConfigRes != 0) { 1082 pw.println(prefix + "networkSecurityConfigRes=0x" 1083 + Integer.toHexString(networkSecurityConfigRes)); 1084 } 1085 if (category != CATEGORY_UNDEFINED) { 1086 pw.println(prefix + "category=" + category); 1087 } 1088 } 1089 super.dumpBack(pw, prefix); 1090 } 1091 1092 /** 1093 * @return true if "supportsRtl" has been set to true in the AndroidManifest 1094 * @hide 1095 */ hasRtlSupport()1096 public boolean hasRtlSupport() { 1097 return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL; 1098 } 1099 1100 /** {@hide} */ hasCode()1101 public boolean hasCode() { 1102 return (flags & FLAG_HAS_CODE) != 0; 1103 } 1104 1105 public static class DisplayNameComparator 1106 implements Comparator<ApplicationInfo> { DisplayNameComparator(PackageManager pm)1107 public DisplayNameComparator(PackageManager pm) { 1108 mPM = pm; 1109 } 1110 compare(ApplicationInfo aa, ApplicationInfo ab)1111 public final int compare(ApplicationInfo aa, ApplicationInfo ab) { 1112 CharSequence sa = mPM.getApplicationLabel(aa); 1113 if (sa == null) { 1114 sa = aa.packageName; 1115 } 1116 CharSequence sb = mPM.getApplicationLabel(ab); 1117 if (sb == null) { 1118 sb = ab.packageName; 1119 } 1120 1121 return sCollator.compare(sa.toString(), sb.toString()); 1122 } 1123 1124 private final Collator sCollator = Collator.getInstance(); 1125 private PackageManager mPM; 1126 } 1127 ApplicationInfo()1128 public ApplicationInfo() { 1129 } 1130 ApplicationInfo(ApplicationInfo orig)1131 public ApplicationInfo(ApplicationInfo orig) { 1132 super(orig); 1133 taskAffinity = orig.taskAffinity; 1134 permission = orig.permission; 1135 processName = orig.processName; 1136 className = orig.className; 1137 theme = orig.theme; 1138 flags = orig.flags; 1139 privateFlags = orig.privateFlags; 1140 requiresSmallestWidthDp = orig.requiresSmallestWidthDp; 1141 compatibleWidthLimitDp = orig.compatibleWidthLimitDp; 1142 largestWidthLimitDp = orig.largestWidthLimitDp; 1143 volumeUuid = orig.volumeUuid; 1144 storageUuid = orig.storageUuid; 1145 scanSourceDir = orig.scanSourceDir; 1146 scanPublicSourceDir = orig.scanPublicSourceDir; 1147 sourceDir = orig.sourceDir; 1148 publicSourceDir = orig.publicSourceDir; 1149 splitNames = orig.splitNames; 1150 splitSourceDirs = orig.splitSourceDirs; 1151 splitPublicSourceDirs = orig.splitPublicSourceDirs; 1152 splitDependencies = orig.splitDependencies; 1153 nativeLibraryDir = orig.nativeLibraryDir; 1154 secondaryNativeLibraryDir = orig.secondaryNativeLibraryDir; 1155 nativeLibraryRootDir = orig.nativeLibraryRootDir; 1156 nativeLibraryRootRequiresIsa = orig.nativeLibraryRootRequiresIsa; 1157 primaryCpuAbi = orig.primaryCpuAbi; 1158 secondaryCpuAbi = orig.secondaryCpuAbi; 1159 resourceDirs = orig.resourceDirs; 1160 seInfo = orig.seInfo; 1161 seInfoUser = orig.seInfoUser; 1162 sharedLibraryFiles = orig.sharedLibraryFiles; 1163 dataDir = orig.dataDir; 1164 deviceProtectedDataDir = orig.deviceProtectedDataDir; 1165 credentialProtectedDataDir = orig.credentialProtectedDataDir; 1166 uid = orig.uid; 1167 minSdkVersion = orig.minSdkVersion; 1168 targetSdkVersion = orig.targetSdkVersion; 1169 versionCode = orig.versionCode; 1170 enabled = orig.enabled; 1171 enabledSetting = orig.enabledSetting; 1172 installLocation = orig.installLocation; 1173 manageSpaceActivityName = orig.manageSpaceActivityName; 1174 descriptionRes = orig.descriptionRes; 1175 uiOptions = orig.uiOptions; 1176 backupAgentName = orig.backupAgentName; 1177 fullBackupContent = orig.fullBackupContent; 1178 networkSecurityConfigRes = orig.networkSecurityConfigRes; 1179 category = orig.category; 1180 targetSandboxVersion = orig.targetSandboxVersion; 1181 } 1182 toString()1183 public String toString() { 1184 return "ApplicationInfo{" 1185 + Integer.toHexString(System.identityHashCode(this)) 1186 + " " + packageName + "}"; 1187 } 1188 describeContents()1189 public int describeContents() { 1190 return 0; 1191 } 1192 1193 @SuppressWarnings("unchecked") writeToParcel(Parcel dest, int parcelableFlags)1194 public void writeToParcel(Parcel dest, int parcelableFlags) { 1195 super.writeToParcel(dest, parcelableFlags); 1196 dest.writeString(taskAffinity); 1197 dest.writeString(permission); 1198 dest.writeString(processName); 1199 dest.writeString(className); 1200 dest.writeInt(theme); 1201 dest.writeInt(flags); 1202 dest.writeInt(privateFlags); 1203 dest.writeInt(requiresSmallestWidthDp); 1204 dest.writeInt(compatibleWidthLimitDp); 1205 dest.writeInt(largestWidthLimitDp); 1206 if (storageUuid != null) { 1207 dest.writeInt(1); 1208 dest.writeLong(storageUuid.getMostSignificantBits()); 1209 dest.writeLong(storageUuid.getLeastSignificantBits()); 1210 } else { 1211 dest.writeInt(0); 1212 } 1213 dest.writeString(scanSourceDir); 1214 dest.writeString(scanPublicSourceDir); 1215 dest.writeString(sourceDir); 1216 dest.writeString(publicSourceDir); 1217 dest.writeStringArray(splitNames); 1218 dest.writeStringArray(splitSourceDirs); 1219 dest.writeStringArray(splitPublicSourceDirs); 1220 dest.writeSparseArray((SparseArray) splitDependencies); 1221 dest.writeString(nativeLibraryDir); 1222 dest.writeString(secondaryNativeLibraryDir); 1223 dest.writeString(nativeLibraryRootDir); 1224 dest.writeInt(nativeLibraryRootRequiresIsa ? 1 : 0); 1225 dest.writeString(primaryCpuAbi); 1226 dest.writeString(secondaryCpuAbi); 1227 dest.writeStringArray(resourceDirs); 1228 dest.writeString(seInfo); 1229 dest.writeString(seInfoUser); 1230 dest.writeStringArray(sharedLibraryFiles); 1231 dest.writeString(dataDir); 1232 dest.writeString(deviceProtectedDataDir); 1233 dest.writeString(credentialProtectedDataDir); 1234 dest.writeInt(uid); 1235 dest.writeInt(minSdkVersion); 1236 dest.writeInt(targetSdkVersion); 1237 dest.writeInt(versionCode); 1238 dest.writeInt(enabled ? 1 : 0); 1239 dest.writeInt(enabledSetting); 1240 dest.writeInt(installLocation); 1241 dest.writeString(manageSpaceActivityName); 1242 dest.writeString(backupAgentName); 1243 dest.writeInt(descriptionRes); 1244 dest.writeInt(uiOptions); 1245 dest.writeInt(fullBackupContent); 1246 dest.writeInt(networkSecurityConfigRes); 1247 dest.writeInt(category); 1248 dest.writeInt(targetSandboxVersion); 1249 } 1250 1251 public static final Parcelable.Creator<ApplicationInfo> CREATOR 1252 = new Parcelable.Creator<ApplicationInfo>() { 1253 public ApplicationInfo createFromParcel(Parcel source) { 1254 return new ApplicationInfo(source); 1255 } 1256 public ApplicationInfo[] newArray(int size) { 1257 return new ApplicationInfo[size]; 1258 } 1259 }; 1260 1261 @SuppressWarnings("unchecked") ApplicationInfo(Parcel source)1262 private ApplicationInfo(Parcel source) { 1263 super(source); 1264 taskAffinity = source.readString(); 1265 permission = source.readString(); 1266 processName = source.readString(); 1267 className = source.readString(); 1268 theme = source.readInt(); 1269 flags = source.readInt(); 1270 privateFlags = source.readInt(); 1271 requiresSmallestWidthDp = source.readInt(); 1272 compatibleWidthLimitDp = source.readInt(); 1273 largestWidthLimitDp = source.readInt(); 1274 if (source.readInt() != 0) { 1275 storageUuid = new UUID(source.readLong(), source.readLong()); 1276 volumeUuid = StorageManager.convert(storageUuid); 1277 } 1278 scanSourceDir = source.readString(); 1279 scanPublicSourceDir = source.readString(); 1280 sourceDir = source.readString(); 1281 publicSourceDir = source.readString(); 1282 splitNames = source.readStringArray(); 1283 splitSourceDirs = source.readStringArray(); 1284 splitPublicSourceDirs = source.readStringArray(); 1285 splitDependencies = source.readSparseArray(null); 1286 nativeLibraryDir = source.readString(); 1287 secondaryNativeLibraryDir = source.readString(); 1288 nativeLibraryRootDir = source.readString(); 1289 nativeLibraryRootRequiresIsa = source.readInt() != 0; 1290 primaryCpuAbi = source.readString(); 1291 secondaryCpuAbi = source.readString(); 1292 resourceDirs = source.readStringArray(); 1293 seInfo = source.readString(); 1294 seInfoUser = source.readString(); 1295 sharedLibraryFiles = source.readStringArray(); 1296 dataDir = source.readString(); 1297 deviceProtectedDataDir = source.readString(); 1298 credentialProtectedDataDir = source.readString(); 1299 uid = source.readInt(); 1300 minSdkVersion = source.readInt(); 1301 targetSdkVersion = source.readInt(); 1302 versionCode = source.readInt(); 1303 enabled = source.readInt() != 0; 1304 enabledSetting = source.readInt(); 1305 installLocation = source.readInt(); 1306 manageSpaceActivityName = source.readString(); 1307 backupAgentName = source.readString(); 1308 descriptionRes = source.readInt(); 1309 uiOptions = source.readInt(); 1310 fullBackupContent = source.readInt(); 1311 networkSecurityConfigRes = source.readInt(); 1312 category = source.readInt(); 1313 targetSandboxVersion = source.readInt(); 1314 } 1315 1316 /** 1317 * Retrieve the textual description of the application. This 1318 * will call back on the given PackageManager to load the description from 1319 * the application. 1320 * 1321 * @param pm A PackageManager from which the label can be loaded; usually 1322 * the PackageManager from which you originally retrieved this item. 1323 * 1324 * @return Returns a CharSequence containing the application's description. 1325 * If there is no description, null is returned. 1326 */ loadDescription(PackageManager pm)1327 public CharSequence loadDescription(PackageManager pm) { 1328 if (descriptionRes != 0) { 1329 CharSequence label = pm.getText(packageName, descriptionRes, this); 1330 if (label != null) { 1331 return label; 1332 } 1333 } 1334 return null; 1335 } 1336 1337 /** 1338 * Disable compatibility mode 1339 * 1340 * @hide 1341 */ disableCompatibilityMode()1342 public void disableCompatibilityMode() { 1343 flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS | 1344 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS | 1345 FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS); 1346 } 1347 1348 /** 1349 * Is using compatibility mode for non densty aware legacy applications. 1350 * 1351 * @hide 1352 */ usesCompatibilityMode()1353 public boolean usesCompatibilityMode() { 1354 return targetSdkVersion < DONUT || 1355 (flags & (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS | 1356 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS | 1357 FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS)) == 0; 1358 } 1359 1360 /** {@hide} */ initForUser(int userId)1361 public void initForUser(int userId) { 1362 uid = UserHandle.getUid(userId, UserHandle.getAppId(uid)); 1363 1364 if ("android".equals(packageName)) { 1365 dataDir = Environment.getDataSystemDirectory().getAbsolutePath(); 1366 return; 1367 } 1368 1369 deviceProtectedDataDir = Environment 1370 .getDataUserDePackageDirectory(volumeUuid, userId, packageName) 1371 .getAbsolutePath(); 1372 credentialProtectedDataDir = Environment 1373 .getDataUserCePackageDirectory(volumeUuid, userId, packageName) 1374 .getAbsolutePath(); 1375 1376 if ((privateFlags & PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0 1377 && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) { 1378 dataDir = deviceProtectedDataDir; 1379 } else { 1380 dataDir = credentialProtectedDataDir; 1381 } 1382 } 1383 1384 /** 1385 * @hide 1386 */ 1387 @Override loadDefaultIcon(PackageManager pm)1388 public Drawable loadDefaultIcon(PackageManager pm) { 1389 if ((flags & FLAG_EXTERNAL_STORAGE) != 0 1390 && isPackageUnavailable(pm)) { 1391 return Resources.getSystem().getDrawable( 1392 com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon); 1393 } 1394 return pm.getDefaultActivityIcon(); 1395 } 1396 isPackageUnavailable(PackageManager pm)1397 private boolean isPackageUnavailable(PackageManager pm) { 1398 try { 1399 return pm.getPackageInfo(packageName, 0) == null; 1400 } catch (NameNotFoundException ex) { 1401 return true; 1402 } 1403 } 1404 1405 /** 1406 * @hide 1407 */ isForwardLocked()1408 public boolean isForwardLocked() { 1409 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0; 1410 } 1411 1412 /** 1413 * @hide 1414 */ 1415 @TestApi isSystemApp()1416 public boolean isSystemApp() { 1417 return (flags & ApplicationInfo.FLAG_SYSTEM) != 0; 1418 } 1419 1420 /** 1421 * @hide 1422 */ 1423 @TestApi isPrivilegedApp()1424 public boolean isPrivilegedApp() { 1425 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; 1426 } 1427 1428 /** 1429 * @hide 1430 */ isUpdatedSystemApp()1431 public boolean isUpdatedSystemApp() { 1432 return (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 1433 } 1434 1435 /** @hide */ isInternal()1436 public boolean isInternal() { 1437 return (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0; 1438 } 1439 1440 /** @hide */ isExternalAsec()1441 public boolean isExternalAsec() { 1442 return TextUtils.isEmpty(volumeUuid) 1443 && (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; 1444 } 1445 1446 /** @hide */ isDefaultToDeviceProtectedStorage()1447 public boolean isDefaultToDeviceProtectedStorage() { 1448 return (privateFlags 1449 & ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0; 1450 } 1451 1452 /** @hide */ isDirectBootAware()1453 public boolean isDirectBootAware() { 1454 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE) != 0; 1455 } 1456 1457 /** @hide */ isPartiallyDirectBootAware()1458 public boolean isPartiallyDirectBootAware() { 1459 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE) != 0; 1460 } 1461 1462 /** 1463 * @hide 1464 */ isInstantApp()1465 public boolean isInstantApp() { 1466 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0; 1467 } 1468 1469 /** 1470 * @hide 1471 */ isRequiredForSystemUser()1472 public boolean isRequiredForSystemUser() { 1473 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER) != 0; 1474 } 1475 1476 /** 1477 * Returns true if the app has declared in its manifest that it wants its split APKs to be 1478 * loaded into isolated Contexts, with their own ClassLoaders and Resources objects. 1479 * @hide 1480 */ requestsIsolatedSplitLoading()1481 public boolean requestsIsolatedSplitLoading() { 1482 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING) != 0; 1483 } 1484 1485 /** 1486 * @hide 1487 */ isStaticSharedLibrary()1488 public boolean isStaticSharedLibrary() { 1489 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY) != 0; 1490 } 1491 1492 /** 1493 * @hide 1494 */ getApplicationInfo()1495 @Override protected ApplicationInfo getApplicationInfo() { 1496 return this; 1497 } 1498 setCodePath(String codePath)1499 /** {@hide} */ public void setCodePath(String codePath) { scanSourceDir = codePath; } setBaseCodePath(String baseCodePath)1500 /** {@hide} */ public void setBaseCodePath(String baseCodePath) { sourceDir = baseCodePath; } setSplitCodePaths(String[] splitCodePaths)1501 /** {@hide} */ public void setSplitCodePaths(String[] splitCodePaths) { splitSourceDirs = splitCodePaths; } setResourcePath(String resourcePath)1502 /** {@hide} */ public void setResourcePath(String resourcePath) { scanPublicSourceDir = resourcePath; } setBaseResourcePath(String baseResourcePath)1503 /** {@hide} */ public void setBaseResourcePath(String baseResourcePath) { publicSourceDir = baseResourcePath; } setSplitResourcePaths(String[] splitResourcePaths)1504 /** {@hide} */ public void setSplitResourcePaths(String[] splitResourcePaths) { splitPublicSourceDirs = splitResourcePaths; } 1505 getCodePath()1506 /** {@hide} */ public String getCodePath() { return scanSourceDir; } getBaseCodePath()1507 /** {@hide} */ public String getBaseCodePath() { return sourceDir; } getSplitCodePaths()1508 /** {@hide} */ public String[] getSplitCodePaths() { return splitSourceDirs; } getResourcePath()1509 /** {@hide} */ public String getResourcePath() { return scanPublicSourceDir; } getBaseResourcePath()1510 /** {@hide} */ public String getBaseResourcePath() { return publicSourceDir; } getSplitResourcePaths()1511 /** {@hide} */ public String[] getSplitResourcePaths() { return splitPublicSourceDirs; } 1512 } 1513