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