Home | History | Annotate | Download | only in pm
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.content.pm;
     18 
     19 import android.content.pm.PackageManager.NameNotFoundException;
     20 import android.content.res.Resources;
     21 import android.graphics.drawable.Drawable;
     22 import android.os.Parcel;
     23 import android.os.Parcelable;
     24 import android.util.Printer;
     25 
     26 import com.android.internal.util.ArrayUtils;
     27 
     28 import java.text.Collator;
     29 import java.util.Arrays;
     30 import java.util.Comparator;
     31 import java.util.Objects;
     32 
     33 /**
     34  * Information you can retrieve about a particular application.  This
     35  * corresponds to information collected from the AndroidManifest.xml's
     36  * <application> tag.
     37  */
     38 public class ApplicationInfo extends PackageItemInfo implements Parcelable {
     39 
     40     /**
     41      * Default task affinity of all activities in this application. See
     42      * {@link ActivityInfo#taskAffinity} for more information.  This comes
     43      * from the "taskAffinity" attribute.
     44      */
     45     public String taskAffinity;
     46 
     47     /**
     48      * Optional name of a permission required to be able to access this
     49      * application's components.  From the "permission" attribute.
     50      */
     51     public String permission;
     52 
     53     /**
     54      * The name of the process this application should run in.  From the
     55      * "process" attribute or, if not set, the same as
     56      * <var>packageName</var>.
     57      */
     58     public String processName;
     59 
     60     /**
     61      * Class implementing the Application object.  From the "class"
     62      * attribute.
     63      */
     64     public String className;
     65 
     66     /**
     67      * A style resource identifier (in the package's resources) of the
     68      * description of an application.  From the "description" attribute
     69      * or, if not set, 0.
     70      */
     71     public int descriptionRes;
     72 
     73     /**
     74      * A style resource identifier (in the package's resources) of the
     75      * default visual theme of the application.  From the "theme" attribute
     76      * or, if not set, 0.
     77      */
     78     public int theme;
     79 
     80     /**
     81      * Class implementing the Application's manage space
     82      * functionality.  From the "manageSpaceActivity"
     83      * attribute. This is an optional attribute and will be null if
     84      * applications don't specify it in their manifest
     85      */
     86     public String manageSpaceActivityName;
     87 
     88     /**
     89      * Class implementing the Application's backup functionality.  From
     90      * the "backupAgent" attribute.  This is an optional attribute and
     91      * will be null if the application does not specify it in its manifest.
     92      *
     93      * <p>If android:allowBackup is set to false, this attribute is ignored.
     94      */
     95     public String backupAgentName;
     96 
     97     /**
     98      * The default extra UI options for activities in this application.
     99      * Set from the {@link android.R.attr#uiOptions} attribute in the
    100      * activity's manifest.
    101      */
    102     public int uiOptions = 0;
    103 
    104     /**
    105      * Value for {@link #flags}: if set, this application is installed in the
    106      * device's system image.
    107      */
    108     public static final int FLAG_SYSTEM = 1<<0;
    109 
    110     /**
    111      * Value for {@link #flags}: set to true if this application would like to
    112      * allow debugging of its
    113      * code, even when installed on a non-development system.  Comes
    114      * from {@link android.R.styleable#AndroidManifestApplication_debuggable
    115      * android:debuggable} of the &lt;application&gt; tag.
    116      */
    117     public static final int FLAG_DEBUGGABLE = 1<<1;
    118 
    119     /**
    120      * Value for {@link #flags}: set to true if this application has code
    121      * associated with it.  Comes
    122      * from {@link android.R.styleable#AndroidManifestApplication_hasCode
    123      * android:hasCode} of the &lt;application&gt; tag.
    124      */
    125     public static final int FLAG_HAS_CODE = 1<<2;
    126 
    127     /**
    128      * Value for {@link #flags}: set to true if this application is persistent.
    129      * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent
    130      * android:persistent} of the &lt;application&gt; tag.
    131      */
    132     public static final int FLAG_PERSISTENT = 1<<3;
    133 
    134     /**
    135      * Value for {@link #flags}: set to true if this application holds the
    136      * {@link android.Manifest.permission#FACTORY_TEST} permission and the
    137      * device is running in factory test mode.
    138      */
    139     public static final int FLAG_FACTORY_TEST = 1<<4;
    140 
    141     /**
    142      * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
    143      * Comes from {@link android.R.styleable#AndroidManifestApplication_allowTaskReparenting
    144      * android:allowTaskReparenting} of the &lt;application&gt; tag.
    145      */
    146     public static final int FLAG_ALLOW_TASK_REPARENTING = 1<<5;
    147 
    148     /**
    149      * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
    150      * Comes from {@link android.R.styleable#AndroidManifestApplication_allowClearUserData
    151      * android:allowClearUserData} of the &lt;application&gt; tag.
    152      */
    153     public static final int FLAG_ALLOW_CLEAR_USER_DATA = 1<<6;
    154 
    155     /**
    156      * Value for {@link #flags}: this is set if this application has been
    157      * install as an update to a built-in system application.
    158      */
    159     public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7;
    160 
    161     /**
    162      * Value for {@link #flags}: this is set of the application has specified
    163      * {@link android.R.styleable#AndroidManifestApplication_testOnly
    164      * android:testOnly} to be true.
    165      */
    166     public static final int FLAG_TEST_ONLY = 1<<8;
    167 
    168     /**
    169      * Value for {@link #flags}: true when the application's window can be
    170      * reduced in size for smaller screens.  Corresponds to
    171      * {@link android.R.styleable#AndroidManifestSupportsScreens_smallScreens
    172      * android:smallScreens}.
    173      */
    174     public static final int FLAG_SUPPORTS_SMALL_SCREENS = 1<<9;
    175 
    176     /**
    177      * Value for {@link #flags}: true when the application's window can be
    178      * displayed on normal screens.  Corresponds to
    179      * {@link android.R.styleable#AndroidManifestSupportsScreens_normalScreens
    180      * android:normalScreens}.
    181      */
    182     public static final int FLAG_SUPPORTS_NORMAL_SCREENS = 1<<10;
    183 
    184     /**
    185      * Value for {@link #flags}: true when the application's window can be
    186      * increased in size for larger screens.  Corresponds to
    187      * {@link android.R.styleable#AndroidManifestSupportsScreens_largeScreens
    188      * android:largeScreens}.
    189      */
    190     public static final int FLAG_SUPPORTS_LARGE_SCREENS = 1<<11;
    191 
    192     /**
    193      * Value for {@link #flags}: true when the application knows how to adjust
    194      * its UI for different screen sizes.  Corresponds to
    195      * {@link android.R.styleable#AndroidManifestSupportsScreens_resizeable
    196      * android:resizeable}.
    197      */
    198     public static final int FLAG_RESIZEABLE_FOR_SCREENS = 1<<12;
    199 
    200     /**
    201      * Value for {@link #flags}: true when the application knows how to
    202      * accomodate different screen densities.  Corresponds to
    203      * {@link android.R.styleable#AndroidManifestSupportsScreens_anyDensity
    204      * android:anyDensity}.
    205      */
    206     public static final int FLAG_SUPPORTS_SCREEN_DENSITIES = 1<<13;
    207 
    208     /**
    209      * Value for {@link #flags}: set to true if this application would like to
    210      * request the VM to operate under the safe mode. Comes from
    211      * {@link android.R.styleable#AndroidManifestApplication_vmSafeMode
    212      * android:vmSafeMode} of the &lt;application&gt; tag.
    213      */
    214     public static final int FLAG_VM_SAFE_MODE = 1<<14;
    215 
    216     /**
    217      * Value for {@link #flags}: set to <code>false</code> if the application does not wish
    218      * to permit any OS-driven backups of its data; <code>true</code> otherwise.
    219      *
    220      * <p>Comes from the
    221      * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
    222      * attribute of the &lt;application&gt; tag.
    223      */
    224     public static final int FLAG_ALLOW_BACKUP = 1<<15;
    225 
    226     /**
    227      * Value for {@link #flags}: set to <code>false</code> if the application must be kept
    228      * in memory following a full-system restore operation; <code>true</code> otherwise.
    229      * Ordinarily, during a full system restore operation each application is shut down
    230      * following execution of its agent's onRestore() method.  Setting this attribute to
    231      * <code>false</code> prevents this.  Most applications will not need to set this attribute.
    232      *
    233      * <p>If
    234      * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
    235      * is set to <code>false</code> or no
    236      * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent}
    237      * is specified, this flag will be ignored.
    238      *
    239      * <p>Comes from the
    240      * {@link android.R.styleable#AndroidManifestApplication_killAfterRestore android:killAfterRestore}
    241      * attribute of the &lt;application&gt; tag.
    242      */
    243     public static final int FLAG_KILL_AFTER_RESTORE = 1<<16;
    244 
    245     /**
    246      * Value for {@link #flags}: Set to <code>true</code> if the application's backup
    247      * agent claims to be able to handle restore data even "from the future,"
    248      * i.e. from versions of the application with a versionCode greater than
    249      * the one currently installed on the device.  <i>Use with caution!</i>  By default
    250      * this attribute is <code>false</code> and the Backup Manager will ensure that data
    251      * from "future" versions of the application are never supplied during a restore operation.
    252      *
    253      * <p>If
    254      * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
    255      * is set to <code>false</code> or no
    256      * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent}
    257      * is specified, this flag will be ignored.
    258      *
    259      * <p>Comes from the
    260      * {@link android.R.styleable#AndroidManifestApplication_restoreAnyVersion android:restoreAnyVersion}
    261      * attribute of the &lt;application&gt; tag.
    262      */
    263     public static final int FLAG_RESTORE_ANY_VERSION = 1<<17;
    264 
    265     /**
    266      * Value for {@link #flags}: Set to true if the application is
    267      * currently installed on external/removable/unprotected storage.  Such
    268      * applications may not be available if their storage is not currently
    269      * mounted.  When the storage it is on is not available, it will look like
    270      * the application has been uninstalled (its .apk is no longer available)
    271      * but its persistent data is not removed.
    272      */
    273     public static final int FLAG_EXTERNAL_STORAGE = 1<<18;
    274 
    275     /**
    276      * Value for {@link #flags}: true when the application's window can be
    277      * increased in size for extra large screens.  Corresponds to
    278      * {@link android.R.styleable#AndroidManifestSupportsScreens_xlargeScreens
    279      * android:xlargeScreens}.
    280      */
    281     public static final int FLAG_SUPPORTS_XLARGE_SCREENS = 1<<19;
    282 
    283     /**
    284      * Value for {@link #flags}: true when the application has requested a
    285      * large heap for its processes.  Corresponds to
    286      * {@link android.R.styleable#AndroidManifestApplication_largeHeap
    287      * android:largeHeap}.
    288      */
    289     public static final int FLAG_LARGE_HEAP = 1<<20;
    290 
    291     /**
    292      * Value for {@link #flags}: true if this application's package is in
    293      * the stopped state.
    294      */
    295     public static final int FLAG_STOPPED = 1<<21;
    296 
    297     /**
    298      * Value for {@link #flags}: true  when the application is willing to support
    299      * RTL (right to left). All activities will inherit this value.
    300      *
    301      * Set from the {@link android.R.attr#supportsRtl} attribute in the
    302      * activity's manifest.
    303      *
    304      * Default value is false (no support for RTL).
    305      */
    306     public static final int FLAG_SUPPORTS_RTL = 1<<22;
    307 
    308     /**
    309      * Value for {@link #flags}: true if the application is currently
    310      * installed for the calling user.
    311      */
    312     public static final int FLAG_INSTALLED = 1<<23;
    313 
    314     /**
    315      * Value for {@link #flags}: true if the application only has its
    316      * data installed; the application package itself does not currently
    317      * exist on the device.
    318      */
    319     public static final int FLAG_IS_DATA_ONLY = 1<<24;
    320 
    321     /**
    322      * Value for {@link #flags}: true if the application was declared to be a game, or
    323      * false if it is a non-game application.
    324      */
    325     public static final int FLAG_IS_GAME = 1<<25;
    326 
    327     /**
    328      * Value for {@link #flags}: {@code true} if the application asks that only
    329      * full-data streaming backups of its data be performed even though it defines
    330      * a {@link android.app.backup.BackupAgent BackupAgent}, which normally
    331      * indicates that the app will manage its backed-up data via incremental
    332      * key/value updates.
    333      */
    334     public static final int FLAG_FULL_BACKUP_ONLY = 1<<26;
    335 
    336     /**
    337      * Value for {@link #flags}: true if the application is hidden via restrictions and for
    338      * most purposes is considered as not installed.
    339      * {@hide}
    340      */
    341     public static final int FLAG_HIDDEN = 1<<27;
    342 
    343     /**
    344      * Value for {@link #flags}: set to <code>true</code> if the application
    345      * has reported that it is heavy-weight, and thus can not participate in
    346      * the normal application lifecycle.
    347      *
    348      * <p>Comes from the
    349      * android.R.styleable#AndroidManifestApplication_cantSaveState
    350      * attribute of the &lt;application&gt; tag.
    351      *
    352      * {@hide}
    353      */
    354     public static final int FLAG_CANT_SAVE_STATE = 1<<28;
    355 
    356     /**
    357      * Value for {@link #flags}: Set to true if the application has been
    358      * installed using the forward lock option.
    359      *
    360      * NOTE: DO NOT CHANGE THIS VALUE!  It is saved in packages.xml.
    361      *
    362      * {@hide}
    363      */
    364     public static final int FLAG_FORWARD_LOCK = 1<<29;
    365 
    366     /**
    367      * Value for {@link #flags}: set to {@code true} if the application
    368      * is permitted to hold privileged permissions.
    369      *
    370      * {@hide}
    371      */
    372     public static final int FLAG_PRIVILEGED = 1<<30;
    373 
    374     /**
    375      * Value for {@link #flags}: true if code from this application will need to be
    376      * loaded into other applications' processes. On devices that support multiple
    377      * instruction sets, this implies the code might be loaded into a process that's
    378      * using any of the devices supported instruction sets.
    379      *
    380      * <p> The system might treat such applications specially, for eg., by
    381      * extracting the application's native libraries for all supported instruction
    382      * sets or by compiling the application's dex code for all supported instruction
    383      * sets.
    384      */
    385     public static final int FLAG_MULTIARCH  = 1 << 31;
    386 
    387     /**
    388      * Flags associated with the application.  Any combination of
    389      * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
    390      * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and
    391      * {@link #FLAG_ALLOW_TASK_REPARENTING}
    392      * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
    393      * {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS},
    394      * {@link #FLAG_SUPPORTS_NORMAL_SCREENS},
    395      * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_SUPPORTS_XLARGE_SCREENS},
    396      * {@link #FLAG_RESIZEABLE_FOR_SCREENS},
    397      * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}, {@link #FLAG_VM_SAFE_MODE},
    398      * {@link #FLAG_INSTALLED}, {@link #FLAG_IS_GAME}.
    399      */
    400     public int flags = 0;
    401 
    402     /**
    403      * The required smallest screen width the application can run on.  If 0,
    404      * nothing has been specified.  Comes from
    405      * {@link android.R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp
    406      * android:requiresSmallestWidthDp} attribute of the &lt;supports-screens&gt; tag.
    407      */
    408     public int requiresSmallestWidthDp = 0;
    409 
    410     /**
    411      * The maximum smallest screen width the application is designed for.  If 0,
    412      * nothing has been specified.  Comes from
    413      * {@link android.R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp
    414      * android:compatibleWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
    415      */
    416     public int compatibleWidthLimitDp = 0;
    417 
    418     /**
    419      * The maximum smallest screen width the application will work on.  If 0,
    420      * nothing has been specified.  Comes from
    421      * {@link android.R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp
    422      * android:largestWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
    423      */
    424     public int largestWidthLimitDp = 0;
    425 
    426     /** {@hide} */
    427     public String scanSourceDir;
    428     /** {@hide} */
    429     public String scanPublicSourceDir;
    430 
    431     /**
    432      * Full path to the base APK for this application.
    433      */
    434     public String sourceDir;
    435 
    436     /**
    437      * Full path to the publicly available parts of {@link #sourceDir},
    438      * including resources and manifest. This may be different from
    439      * {@link #sourceDir} if an application is forward locked.
    440      */
    441     public String publicSourceDir;
    442 
    443     /**
    444      * Full paths to zero or more split APKs that, when combined with the base
    445      * APK defined in {@link #sourceDir}, form a complete application.
    446      */
    447     public String[] splitSourceDirs;
    448 
    449     /**
    450      * Full path to the publicly available parts of {@link #splitSourceDirs},
    451      * including resources and manifest. This may be different from
    452      * {@link #splitSourceDirs} if an application is forward locked.
    453      */
    454     public String[] splitPublicSourceDirs;
    455 
    456     /**
    457      * Full paths to the locations of extra resource packages this application
    458      * uses. This field is only used if there are extra resource packages,
    459      * otherwise it is null.
    460      *
    461      * {@hide}
    462      */
    463     public String[] resourceDirs;
    464 
    465     /**
    466      * String retrieved from the seinfo tag found in selinux policy. This value
    467      * is useful in setting an SELinux security context on the process as well
    468      * as its data directory.
    469      *
    470      * {@hide}
    471      */
    472     public String seinfo;
    473 
    474     /**
    475      * Paths to all shared libraries this application is linked against.  This
    476      * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES
    477      * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving
    478      * the structure.
    479      */
    480     public String[] sharedLibraryFiles;
    481 
    482     /**
    483      * Full path to a directory assigned to the package for its persistent
    484      * data.
    485      */
    486     public String dataDir;
    487 
    488     /**
    489      * Full path to the directory where native JNI libraries are stored.
    490      */
    491     public String nativeLibraryDir;
    492 
    493     /**
    494      * Full path where unpacked native libraries for {@link #secondaryCpuAbi}
    495      * are stored, if present.
    496      *
    497      * The main reason this exists is for bundled multi-arch apps, where
    498      * it's not trivial to calculate the location of libs for the secondary abi
    499      * given the location of the primary.
    500      *
    501      * TODO: Change the layout of bundled installs so that we can use
    502      * nativeLibraryRootDir & nativeLibraryRootRequiresIsa there as well.
    503      * (e.g {@code [ "/system/app-lib/Foo/arm", "/system/app-lib/Foo/arm64" ]}
    504      * instead of {@code [ "/system/lib/Foo", "/system/lib64/Foo" ]}.
    505      *
    506      * @hide
    507      */
    508     public String secondaryNativeLibraryDir;
    509 
    510     /**
    511      * The root path where unpacked native libraries are stored.
    512      * <p>
    513      * When {@link #nativeLibraryRootRequiresIsa} is set, the libraries are
    514      * placed in ISA-specific subdirectories under this path, otherwise the
    515      * libraries are placed directly at this path.
    516      *
    517      * @hide
    518      */
    519     public String nativeLibraryRootDir;
    520 
    521     /**
    522      * Flag indicating that ISA must be appended to
    523      * {@link #nativeLibraryRootDir} to be useful.
    524      *
    525      * @hide
    526      */
    527     public boolean nativeLibraryRootRequiresIsa;
    528 
    529     /**
    530      * The primary ABI that this application requires, This is inferred from the ABIs
    531      * of the native JNI libraries the application bundles. Will be {@code null}
    532      * if this application does not require any particular ABI.
    533      *
    534      * If non-null, the application will always be launched with this ABI.
    535      *
    536      * {@hide}
    537      */
    538     public String primaryCpuAbi;
    539 
    540     /**
    541      * The secondary ABI for this application. Might be non-null for multi-arch
    542      * installs. The application itself never uses this ABI, but other applications that
    543      * use its code might.
    544      *
    545      * {@hide}
    546      */
    547     public String secondaryCpuAbi;
    548 
    549     /**
    550      * The kernel user-ID that has been assigned to this application;
    551      * currently this is not a unique ID (multiple applications can have
    552      * the same uid).
    553      */
    554     public int uid;
    555 
    556     /**
    557      * The minimum SDK version this application targets.  It may run on earlier
    558      * versions, but it knows how to work with any new behavior added at this
    559      * version.  Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
    560      * if this is a development build and the app is targeting that.  You should
    561      * compare that this number is >= the SDK version number at which your
    562      * behavior was introduced.
    563      */
    564     public int targetSdkVersion;
    565 
    566     /**
    567      * The app's declared version code.
    568      * @hide
    569      */
    570     public int versionCode;
    571 
    572     /**
    573      * When false, indicates that all components within this application are
    574      * considered disabled, regardless of their individually set enabled status.
    575      */
    576     public boolean enabled = true;
    577 
    578     /**
    579      * For convenient access to the current enabled setting of this app.
    580      * @hide
    581      */
    582     public int enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
    583 
    584     /**
    585      * For convenient access to package's install location.
    586      * @hide
    587      */
    588     public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
    589 
    590     public void dump(Printer pw, String prefix) {
    591         super.dumpFront(pw, prefix);
    592         if (className != null) {
    593             pw.println(prefix + "className=" + className);
    594         }
    595         if (permission != null) {
    596             pw.println(prefix + "permission=" + permission);
    597         }
    598         pw.println(prefix + "processName=" + processName);
    599         pw.println(prefix + "taskAffinity=" + taskAffinity);
    600         pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags)
    601                 + " theme=0x" + Integer.toHexString(theme));
    602         pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp
    603                 + " compatibleWidthLimitDp=" + compatibleWidthLimitDp
    604                 + " largestWidthLimitDp=" + largestWidthLimitDp);
    605         pw.println(prefix + "sourceDir=" + sourceDir);
    606         if (!Objects.equals(sourceDir, publicSourceDir)) {
    607             pw.println(prefix + "publicSourceDir=" + publicSourceDir);
    608         }
    609         if (!ArrayUtils.isEmpty(splitSourceDirs)) {
    610             pw.println(prefix + "splitSourceDirs=" + Arrays.toString(splitSourceDirs));
    611         }
    612         if (!ArrayUtils.isEmpty(splitPublicSourceDirs)
    613                 && !Arrays.equals(splitSourceDirs, splitPublicSourceDirs)) {
    614             pw.println(prefix + "splitPublicSourceDirs=" + Arrays.toString(splitPublicSourceDirs));
    615         }
    616         if (resourceDirs != null) {
    617             pw.println(prefix + "resourceDirs=" + resourceDirs);
    618         }
    619         if (seinfo != null) {
    620             pw.println(prefix + "seinfo=" + seinfo);
    621         }
    622         pw.println(prefix + "dataDir=" + dataDir);
    623         if (sharedLibraryFiles != null) {
    624             pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
    625         }
    626         pw.println(prefix + "enabled=" + enabled + " targetSdkVersion=" + targetSdkVersion
    627                 + " versionCode=" + versionCode);
    628         if (manageSpaceActivityName != null) {
    629             pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
    630         }
    631         if (descriptionRes != 0) {
    632             pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
    633         }
    634         if (uiOptions != 0) {
    635             pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions));
    636         }
    637         pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false"));
    638         super.dumpBack(pw, prefix);
    639     }
    640 
    641     /**
    642      * @return true if "supportsRtl" has been set to true in the AndroidManifest
    643      * @hide
    644      */
    645     public boolean hasRtlSupport() {
    646         return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL;
    647     }
    648 
    649     public static class DisplayNameComparator
    650             implements Comparator<ApplicationInfo> {
    651         public DisplayNameComparator(PackageManager pm) {
    652             mPM = pm;
    653         }
    654 
    655         public final int compare(ApplicationInfo aa, ApplicationInfo ab) {
    656             CharSequence  sa = mPM.getApplicationLabel(aa);
    657             if (sa == null) {
    658                 sa = aa.packageName;
    659             }
    660             CharSequence  sb = mPM.getApplicationLabel(ab);
    661             if (sb == null) {
    662                 sb = ab.packageName;
    663             }
    664 
    665             return sCollator.compare(sa.toString(), sb.toString());
    666         }
    667 
    668         private final Collator   sCollator = Collator.getInstance();
    669         private PackageManager   mPM;
    670     }
    671 
    672     public ApplicationInfo() {
    673     }
    674 
    675     public ApplicationInfo(ApplicationInfo orig) {
    676         super(orig);
    677         taskAffinity = orig.taskAffinity;
    678         permission = orig.permission;
    679         processName = orig.processName;
    680         className = orig.className;
    681         theme = orig.theme;
    682         flags = orig.flags;
    683         requiresSmallestWidthDp = orig.requiresSmallestWidthDp;
    684         compatibleWidthLimitDp = orig.compatibleWidthLimitDp;
    685         largestWidthLimitDp = orig.largestWidthLimitDp;
    686         scanSourceDir = orig.scanSourceDir;
    687         scanPublicSourceDir = orig.scanPublicSourceDir;
    688         sourceDir = orig.sourceDir;
    689         publicSourceDir = orig.publicSourceDir;
    690         splitSourceDirs = orig.splitSourceDirs;
    691         splitPublicSourceDirs = orig.splitPublicSourceDirs;
    692         nativeLibraryDir = orig.nativeLibraryDir;
    693         secondaryNativeLibraryDir = orig.secondaryNativeLibraryDir;
    694         nativeLibraryRootDir = orig.nativeLibraryRootDir;
    695         nativeLibraryRootRequiresIsa = orig.nativeLibraryRootRequiresIsa;
    696         primaryCpuAbi = orig.primaryCpuAbi;
    697         secondaryCpuAbi = orig.secondaryCpuAbi;
    698         resourceDirs = orig.resourceDirs;
    699         seinfo = orig.seinfo;
    700         sharedLibraryFiles = orig.sharedLibraryFiles;
    701         dataDir = orig.dataDir;
    702         uid = orig.uid;
    703         targetSdkVersion = orig.targetSdkVersion;
    704         versionCode = orig.versionCode;
    705         enabled = orig.enabled;
    706         enabledSetting = orig.enabledSetting;
    707         installLocation = orig.installLocation;
    708         manageSpaceActivityName = orig.manageSpaceActivityName;
    709         descriptionRes = orig.descriptionRes;
    710         uiOptions = orig.uiOptions;
    711         backupAgentName = orig.backupAgentName;
    712     }
    713 
    714 
    715     public String toString() {
    716         return "ApplicationInfo{"
    717             + Integer.toHexString(System.identityHashCode(this))
    718             + " " + packageName + "}";
    719     }
    720 
    721     public int describeContents() {
    722         return 0;
    723     }
    724 
    725     public void writeToParcel(Parcel dest, int parcelableFlags) {
    726         super.writeToParcel(dest, parcelableFlags);
    727         dest.writeString(taskAffinity);
    728         dest.writeString(permission);
    729         dest.writeString(processName);
    730         dest.writeString(className);
    731         dest.writeInt(theme);
    732         dest.writeInt(flags);
    733         dest.writeInt(requiresSmallestWidthDp);
    734         dest.writeInt(compatibleWidthLimitDp);
    735         dest.writeInt(largestWidthLimitDp);
    736         dest.writeString(scanSourceDir);
    737         dest.writeString(scanPublicSourceDir);
    738         dest.writeString(sourceDir);
    739         dest.writeString(publicSourceDir);
    740         dest.writeStringArray(splitSourceDirs);
    741         dest.writeStringArray(splitPublicSourceDirs);
    742         dest.writeString(nativeLibraryDir);
    743         dest.writeString(secondaryNativeLibraryDir);
    744         dest.writeString(nativeLibraryRootDir);
    745         dest.writeInt(nativeLibraryRootRequiresIsa ? 1 : 0);
    746         dest.writeString(primaryCpuAbi);
    747         dest.writeString(secondaryCpuAbi);
    748         dest.writeStringArray(resourceDirs);
    749         dest.writeString(seinfo);
    750         dest.writeStringArray(sharedLibraryFiles);
    751         dest.writeString(dataDir);
    752         dest.writeInt(uid);
    753         dest.writeInt(targetSdkVersion);
    754         dest.writeInt(versionCode);
    755         dest.writeInt(enabled ? 1 : 0);
    756         dest.writeInt(enabledSetting);
    757         dest.writeInt(installLocation);
    758         dest.writeString(manageSpaceActivityName);
    759         dest.writeString(backupAgentName);
    760         dest.writeInt(descriptionRes);
    761         dest.writeInt(uiOptions);
    762     }
    763 
    764     public static final Parcelable.Creator<ApplicationInfo> CREATOR
    765             = new Parcelable.Creator<ApplicationInfo>() {
    766         public ApplicationInfo createFromParcel(Parcel source) {
    767             return new ApplicationInfo(source);
    768         }
    769         public ApplicationInfo[] newArray(int size) {
    770             return new ApplicationInfo[size];
    771         }
    772     };
    773 
    774     private ApplicationInfo(Parcel source) {
    775         super(source);
    776         taskAffinity = source.readString();
    777         permission = source.readString();
    778         processName = source.readString();
    779         className = source.readString();
    780         theme = source.readInt();
    781         flags = source.readInt();
    782         requiresSmallestWidthDp = source.readInt();
    783         compatibleWidthLimitDp = source.readInt();
    784         largestWidthLimitDp = source.readInt();
    785         scanSourceDir = source.readString();
    786         scanPublicSourceDir = source.readString();
    787         sourceDir = source.readString();
    788         publicSourceDir = source.readString();
    789         splitSourceDirs = source.readStringArray();
    790         splitPublicSourceDirs = source.readStringArray();
    791         nativeLibraryDir = source.readString();
    792         secondaryNativeLibraryDir = source.readString();
    793         nativeLibraryRootDir = source.readString();
    794         nativeLibraryRootRequiresIsa = source.readInt() != 0;
    795         primaryCpuAbi = source.readString();
    796         secondaryCpuAbi = source.readString();
    797         resourceDirs = source.readStringArray();
    798         seinfo = source.readString();
    799         sharedLibraryFiles = source.readStringArray();
    800         dataDir = source.readString();
    801         uid = source.readInt();
    802         targetSdkVersion = source.readInt();
    803         versionCode = source.readInt();
    804         enabled = source.readInt() != 0;
    805         enabledSetting = source.readInt();
    806         installLocation = source.readInt();
    807         manageSpaceActivityName = source.readString();
    808         backupAgentName = source.readString();
    809         descriptionRes = source.readInt();
    810         uiOptions = source.readInt();
    811     }
    812 
    813     /**
    814      * Retrieve the textual description of the application.  This
    815      * will call back on the given PackageManager to load the description from
    816      * the application.
    817      *
    818      * @param pm A PackageManager from which the label can be loaded; usually
    819      * the PackageManager from which you originally retrieved this item.
    820      *
    821      * @return Returns a CharSequence containing the application's description.
    822      * If there is no description, null is returned.
    823      */
    824     public CharSequence loadDescription(PackageManager pm) {
    825         if (descriptionRes != 0) {
    826             CharSequence label = pm.getText(packageName, descriptionRes, this);
    827             if (label != null) {
    828                 return label;
    829             }
    830         }
    831         return null;
    832     }
    833 
    834     /**
    835      * Disable compatibility mode
    836      *
    837      * @hide
    838      */
    839     public void disableCompatibilityMode() {
    840         flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
    841                 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
    842                 FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS);
    843     }
    844 
    845     /**
    846      * @hide
    847      */
    848     @Override
    849     public Drawable loadDefaultIcon(PackageManager pm) {
    850         if ((flags & FLAG_EXTERNAL_STORAGE) != 0
    851                 && isPackageUnavailable(pm)) {
    852             return Resources.getSystem().getDrawable(
    853                     com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon);
    854         }
    855         return pm.getDefaultActivityIcon();
    856     }
    857 
    858     private boolean isPackageUnavailable(PackageManager pm) {
    859         try {
    860             return pm.getPackageInfo(packageName, 0) == null;
    861         } catch (NameNotFoundException ex) {
    862             return true;
    863         }
    864     }
    865 
    866     /**
    867      * @hide
    868      */
    869     @Override protected ApplicationInfo getApplicationInfo() {
    870         return this;
    871     }
    872 
    873     /** {@hide} */ public void setCodePath(String codePath) { scanSourceDir = codePath; }
    874     /** {@hide} */ public void setBaseCodePath(String baseCodePath) { sourceDir = baseCodePath; }
    875     /** {@hide} */ public void setSplitCodePaths(String[] splitCodePaths) { splitSourceDirs = splitCodePaths; }
    876     /** {@hide} */ public void setResourcePath(String resourcePath) { scanPublicSourceDir = resourcePath; }
    877     /** {@hide} */ public void setBaseResourcePath(String baseResourcePath) { publicSourceDir = baseResourcePath; }
    878     /** {@hide} */ public void setSplitResourcePaths(String[] splitResourcePaths) { splitPublicSourceDirs = splitResourcePaths; }
    879 
    880     /** {@hide} */ public String getCodePath() { return scanSourceDir; }
    881     /** {@hide} */ public String getBaseCodePath() { return sourceDir; }
    882     /** {@hide} */ public String[] getSplitCodePaths() { return splitSourceDirs; }
    883     /** {@hide} */ public String getResourcePath() { return scanPublicSourceDir; }
    884     /** {@hide} */ public String getBaseResourcePath() { return publicSourceDir; }
    885     /** {@hide} */ public String[] getSplitResourcePaths() { return splitSourceDirs; }
    886 }
    887