blob: 3120421622a40fa780f42028874adab3ab28f237 [file] [log] [blame]
Kenny Root15a4d2f2010-03-11 18:20:12 -08001/*
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
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080017package android.content.pm;
18
Jeff Sharkey9bc89af2017-01-11 11:25:50 -070019import static android.os.Build.VERSION_CODES.DONUT;
20
21import android.annotation.IntDef;
Alan Viveretteb6a25732017-11-21 14:49:24 -050022import android.annotation.Nullable;
Jeff Sharkey8a372a02016-03-16 16:25:45 -060023import android.annotation.SystemApi;
Jeff Sharkeya73b8fd2016-01-06 17:02:08 -070024import android.annotation.TestApi;
Jeff Sharkey8a372a02016-03-16 16:25:45 -060025import android.content.Context;
Jeff Brown07330792010-03-30 19:57:08 -070026import android.content.pm.PackageManager.NameNotFoundException;
27import android.content.res.Resources;
28import android.graphics.drawable.Drawable;
Mathew Inwood1ab30252018-04-03 14:47:26 +010029import android.os.Build;
Jeff Sharkey15447792015-11-05 16:18:51 -080030import android.os.Environment;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080031import android.os.Parcel;
32import android.os.Parcelable;
Jeff Sharkey15447792015-11-05 16:18:51 -080033import android.os.UserHandle;
Jeff Sharkey789a8fc2017-04-16 13:18:35 -060034import android.os.storage.StorageManager;
Jeff Sharkeye2d45be2015-04-15 17:14:12 -070035import android.text.TextUtils;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036import android.util.Printer;
Adam Lesinski1665d0f2017-03-10 14:46:57 -080037import android.util.SparseArray;
Yi Jin148d7f42017-11-28 14:23:56 -080038import android.util.proto.ProtoOutputStream;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080039
Jeff Sharkey8a4c9722014-06-16 13:48:42 -070040import com.android.internal.util.ArrayUtils;
Mathew Inwood4693a752018-02-20 16:04:25 +000041import com.android.server.SystemConfig;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -070042
Jeff Sharkey9bc89af2017-01-11 11:25:50 -070043import java.lang.annotation.Retention;
44import java.lang.annotation.RetentionPolicy;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045import java.text.Collator;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -070046import java.util.Arrays;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047import java.util.Comparator;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -070048import java.util.Objects;
Jeff Sharkey789a8fc2017-04-16 13:18:35 -060049import java.util.UUID;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080050
51/**
52 * Information you can retrieve about a particular application. This
53 * corresponds to information collected from the AndroidManifest.xml's
54 * <application> tag.
55 */
56public class ApplicationInfo extends PackageItemInfo implements Parcelable {
57
58 /**
59 * Default task affinity of all activities in this application. See
60 * {@link ActivityInfo#taskAffinity} for more information. This comes
61 * from the "taskAffinity" attribute.
62 */
63 public String taskAffinity;
64
65 /**
66 * Optional name of a permission required to be able to access this
67 * application's components. From the "permission" attribute.
68 */
69 public String permission;
70
71 /**
72 * The name of the process this application should run in. From the
73 * "process" attribute or, if not set, the same as
74 * <var>packageName</var>.
75 */
76 public String processName;
77
78 /**
79 * Class implementing the Application object. From the "class"
80 * attribute.
81 */
82 public String className;
83
84 /**
85 * A style resource identifier (in the package's resources) of the
86 * description of an application. From the "description" attribute
87 * or, if not set, 0.
88 */
89 public int descriptionRes;
90
91 /**
92 * A style resource identifier (in the package's resources) of the
93 * default visual theme of the application. From the "theme" attribute
94 * or, if not set, 0.
95 */
96 public int theme;
97
98 /**
99 * Class implementing the Application's manage space
100 * functionality. From the "manageSpaceActivity"
101 * attribute. This is an optional attribute and will be null if
Christopher Tate181fafa2009-05-14 11:12:14 -0700102 * applications don't specify it in their manifest
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800103 */
104 public String manageSpaceActivityName;
105
106 /**
Christopher Tate181fafa2009-05-14 11:12:14 -0700107 * Class implementing the Application's backup functionality. From
108 * the "backupAgent" attribute. This is an optional attribute and
109 * will be null if the application does not specify it in its manifest.
110 *
111 * <p>If android:allowBackup is set to false, this attribute is ignored.
Christopher Tate181fafa2009-05-14 11:12:14 -0700112 */
113 public String backupAgentName;
Christopher Tate4a627c72011-04-01 14:43:32 -0700114
115 /**
Matthew Williams303650c2015-04-17 18:22:51 -0700116 * An optional attribute that indicates the app supports automatic backup of app data.
117 * <p>0 is the default and means the app's entire data folder + managed external storage will
118 * be backed up;
119 * Any negative value indicates the app does not support full-data backup, though it may still
120 * want to participate via the traditional key/value backup API;
121 * A positive number specifies an xml resource in which the application has defined its backup
122 * include/exclude criteria.
123 * <p>If android:allowBackup is set to false, this attribute is ignored.
124 *
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600125 * @see android.content.Context#getNoBackupFilesDir()
126 * @see #FLAG_ALLOW_BACKUP
Christopher Tate98fa6562015-05-14 13:20:10 -0700127 *
128 * @hide
Matthew Williams303650c2015-04-17 18:22:51 -0700129 */
130 public int fullBackupContent = 0;
131
132 /**
Adam Powell269248d2011-08-02 10:26:54 -0700133 * The default extra UI options for activities in this application.
134 * Set from the {@link android.R.attr#uiOptions} attribute in the
135 * activity's manifest.
136 */
137 public int uiOptions = 0;
138
139 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800140 * Value for {@link #flags}: if set, this application is installed in the
141 * device's system image.
142 */
143 public static final int FLAG_SYSTEM = 1<<0;
144
145 /**
146 * Value for {@link #flags}: set to true if this application would like to
147 * allow debugging of its
148 * code, even when installed on a non-development system. Comes
149 * from {@link android.R.styleable#AndroidManifestApplication_debuggable
150 * android:debuggable} of the &lt;application&gt; tag.
151 */
152 public static final int FLAG_DEBUGGABLE = 1<<1;
153
154 /**
155 * Value for {@link #flags}: set to true if this application has code
156 * associated with it. Comes
157 * from {@link android.R.styleable#AndroidManifestApplication_hasCode
158 * android:hasCode} of the &lt;application&gt; tag.
159 */
160 public static final int FLAG_HAS_CODE = 1<<2;
161
162 /**
163 * Value for {@link #flags}: set to true if this application is persistent.
164 * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent
165 * android:persistent} of the &lt;application&gt; tag.
166 */
167 public static final int FLAG_PERSISTENT = 1<<3;
168
169 /**
Christopher Tate181fafa2009-05-14 11:12:14 -0700170 * Value for {@link #flags}: set to true if this application holds the
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800171 * {@link android.Manifest.permission#FACTORY_TEST} permission and the
172 * device is running in factory test mode.
173 */
174 public static final int FLAG_FACTORY_TEST = 1<<4;
175
176 /**
177 * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
178 * Comes from {@link android.R.styleable#AndroidManifestApplication_allowTaskReparenting
179 * android:allowTaskReparenting} of the &lt;application&gt; tag.
180 */
181 public static final int FLAG_ALLOW_TASK_REPARENTING = 1<<5;
182
183 /**
184 * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
185 * Comes from {@link android.R.styleable#AndroidManifestApplication_allowClearUserData
186 * android:allowClearUserData} of the &lt;application&gt; tag.
187 */
188 public static final int FLAG_ALLOW_CLEAR_USER_DATA = 1<<6;
189
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800190 /**
Dianne Hackborn851a5412009-05-08 12:06:44 -0700191 * Value for {@link #flags}: this is set if this application has been
Kweku Adams8de29ca2016-01-22 12:30:26 -0800192 * installed as an update to a built-in system application.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800193 */
194 public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7;
Dianne Hackborn851a5412009-05-08 12:06:44 -0700195
196 /**
Svet Ganov354cd3c2015-12-17 11:35:04 -0800197 * Value for {@link #flags}: this is set if the application has specified
Dianne Hackborn7f205432009-07-28 00:13:47 -0700198 * {@link android.R.styleable#AndroidManifestApplication_testOnly
199 * android:testOnly} to be true.
Dianne Hackborn851a5412009-05-08 12:06:44 -0700200 */
Dianne Hackborna96cbb42009-05-13 15:06:13 -0700201 public static final int FLAG_TEST_ONLY = 1<<8;
Dianne Hackbornade3eca2009-05-11 18:54:45 -0700202
203 /**
Dianne Hackborn5c1e00b2009-06-18 17:10:57 -0700204 * Value for {@link #flags}: true when the application's window can be
Dianne Hackborn723738c2009-06-25 19:48:04 -0700205 * reduced in size for smaller screens. Corresponds to
206 * {@link android.R.styleable#AndroidManifestSupportsScreens_smallScreens
207 * android:smallScreens}.
Dianne Hackborn5c1e00b2009-06-18 17:10:57 -0700208 */
Dianne Hackborn723738c2009-06-25 19:48:04 -0700209 public static final int FLAG_SUPPORTS_SMALL_SCREENS = 1<<9;
210
211 /**
212 * Value for {@link #flags}: true when the application's window can be
213 * displayed on normal screens. Corresponds to
214 * {@link android.R.styleable#AndroidManifestSupportsScreens_normalScreens
215 * android:normalScreens}.
216 */
217 public static final int FLAG_SUPPORTS_NORMAL_SCREENS = 1<<10;
218
219 /**
220 * Value for {@link #flags}: true when the application's window can be
221 * increased in size for larger screens. Corresponds to
222 * {@link android.R.styleable#AndroidManifestSupportsScreens_largeScreens
Dianne Hackborn22ec9ab2010-04-29 17:56:03 -0700223 * android:largeScreens}.
Dianne Hackborn723738c2009-06-25 19:48:04 -0700224 */
225 public static final int FLAG_SUPPORTS_LARGE_SCREENS = 1<<11;
Dianne Hackborn5c1e00b2009-06-18 17:10:57 -0700226
227 /**
Dianne Hackbornc4db95c2009-07-21 17:46:02 -0700228 * Value for {@link #flags}: true when the application knows how to adjust
229 * its UI for different screen sizes. Corresponds to
230 * {@link android.R.styleable#AndroidManifestSupportsScreens_resizeable
231 * android:resizeable}.
232 */
233 public static final int FLAG_RESIZEABLE_FOR_SCREENS = 1<<12;
234
235 /**
Dianne Hackborn11b822d2009-07-21 20:03:02 -0700236 * Value for {@link #flags}: true when the application knows how to
237 * accomodate different screen densities. Corresponds to
238 * {@link android.R.styleable#AndroidManifestSupportsScreens_anyDensity
239 * android:anyDensity}.
240 */
241 public static final int FLAG_SUPPORTS_SCREEN_DENSITIES = 1<<13;
242
243 /**
Ben Cheng23085b72010-02-08 16:06:32 -0800244 * Value for {@link #flags}: set to true if this application would like to
245 * request the VM to operate under the safe mode. Comes from
Ben Chengef3f5dd2010-03-29 15:47:26 -0700246 * {@link android.R.styleable#AndroidManifestApplication_vmSafeMode
247 * android:vmSafeMode} of the &lt;application&gt; tag.
Ben Cheng23085b72010-02-08 16:06:32 -0800248 */
249 public static final int FLAG_VM_SAFE_MODE = 1<<14;
250
251 /**
Christopher Tate3de55bc2010-03-12 17:28:08 -0800252 * Value for {@link #flags}: set to <code>false</code> if the application does not wish
253 * to permit any OS-driven backups of its data; <code>true</code> otherwise.
Christopher Tate181fafa2009-05-14 11:12:14 -0700254 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800255 * <p>Comes from the
256 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
257 * attribute of the &lt;application&gt; tag.
Christopher Tate181fafa2009-05-14 11:12:14 -0700258 */
Ben Cheng23085b72010-02-08 16:06:32 -0800259 public static final int FLAG_ALLOW_BACKUP = 1<<15;
Christopher Tate5e1ab332009-09-01 20:32:49 -0700260
261 /**
Christopher Tate3de55bc2010-03-12 17:28:08 -0800262 * Value for {@link #flags}: set to <code>false</code> if the application must be kept
263 * in memory following a full-system restore operation; <code>true</code> otherwise.
264 * Ordinarily, during a full system restore operation each application is shut down
265 * following execution of its agent's onRestore() method. Setting this attribute to
266 * <code>false</code> prevents this. Most applications will not need to set this attribute.
Christopher Tate5e1ab332009-09-01 20:32:49 -0700267 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800268 * <p>If
269 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
270 * is set to <code>false</code> or no
271 * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent}
Christopher Tate5e1ab332009-09-01 20:32:49 -0700272 * is specified, this flag will be ignored.
273 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800274 * <p>Comes from the
275 * {@link android.R.styleable#AndroidManifestApplication_killAfterRestore android:killAfterRestore}
276 * attribute of the &lt;application&gt; tag.
Christopher Tate5e1ab332009-09-01 20:32:49 -0700277 */
Ben Cheng23085b72010-02-08 16:06:32 -0800278 public static final int FLAG_KILL_AFTER_RESTORE = 1<<16;
Christopher Tate5e1ab332009-09-01 20:32:49 -0700279
280 /**
Christopher Tate3de55bc2010-03-12 17:28:08 -0800281 * Value for {@link #flags}: Set to <code>true</code> if the application's backup
282 * agent claims to be able to handle restore data even "from the future,"
283 * i.e. from versions of the application with a versionCode greater than
284 * the one currently installed on the device. <i>Use with caution!</i> By default
285 * this attribute is <code>false</code> and the Backup Manager will ensure that data
286 * from "future" versions of the application are never supplied during a restore operation.
Christopher Tate5e1ab332009-09-01 20:32:49 -0700287 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800288 * <p>If
289 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
290 * is set to <code>false</code> or no
291 * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent}
Christopher Tate5e1ab332009-09-01 20:32:49 -0700292 * is specified, this flag will be ignored.
293 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800294 * <p>Comes from the
295 * {@link android.R.styleable#AndroidManifestApplication_restoreAnyVersion android:restoreAnyVersion}
296 * attribute of the &lt;application&gt; tag.
Christopher Tate5e1ab332009-09-01 20:32:49 -0700297 */
Christopher Tate3de55bc2010-03-12 17:28:08 -0800298 public static final int FLAG_RESTORE_ANY_VERSION = 1<<17;
Christopher Tate5e1ab332009-09-01 20:32:49 -0700299
Christopher Tate181fafa2009-05-14 11:12:14 -0700300 /**
Dianne Hackborn3202d382010-04-26 17:51:34 -0700301 * Value for {@link #flags}: Set to true if the application is
302 * currently installed on external/removable/unprotected storage. Such
303 * applications may not be available if their storage is not currently
304 * mounted. When the storage it is on is not available, it will look like
305 * the application has been uninstalled (its .apk is no longer available)
306 * but its persistent data is not removed.
Suchi Amalapurapuaf8e9f42010-01-12 10:17:28 -0800307 */
Dianne Hackborn94c567e2010-04-26 18:13:10 -0700308 public static final int FLAG_EXTERNAL_STORAGE = 1<<18;
Suchi Amalapurapuaf8e9f42010-01-12 10:17:28 -0800309
310 /**
Dianne Hackborn14cee9f2010-04-23 17:51:26 -0700311 * Value for {@link #flags}: true when the application's window can be
312 * increased in size for extra large screens. Corresponds to
313 * {@link android.R.styleable#AndroidManifestSupportsScreens_xlargeScreens
Dianne Hackborn22ec9ab2010-04-29 17:56:03 -0700314 * android:xlargeScreens}.
Dianne Hackborn14cee9f2010-04-23 17:51:26 -0700315 */
316 public static final int FLAG_SUPPORTS_XLARGE_SCREENS = 1<<19;
317
318 /**
Dianne Hackborn3b81bc12011-01-15 11:50:52 -0800319 * Value for {@link #flags}: true when the application has requested a
320 * large heap for its processes. Corresponds to
321 * {@link android.R.styleable#AndroidManifestApplication_largeHeap
322 * android:largeHeap}.
Jason parksa3cdaa52011-01-13 14:15:43 -0600323 */
Dianne Hackborn3b81bc12011-01-15 11:50:52 -0800324 public static final int FLAG_LARGE_HEAP = 1<<20;
Jason parksa3cdaa52011-01-13 14:15:43 -0600325
326 /**
Dianne Hackborne7f97212011-02-24 14:40:20 -0800327 * Value for {@link #flags}: true if this application's package is in
328 * the stopped state.
329 */
330 public static final int FLAG_STOPPED = 1<<21;
331
332 /**
Fabrice Di Meglio59dfce82012-04-02 16:17:20 -0700333 * Value for {@link #flags}: true when the application is willing to support
334 * RTL (right to left). All activities will inherit this value.
335 *
336 * Set from the {@link android.R.attr#supportsRtl} attribute in the
337 * activity's manifest.
338 *
339 * Default value is false (no support for RTL).
340 */
341 public static final int FLAG_SUPPORTS_RTL = 1<<22;
342
343 /**
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700344 * Value for {@link #flags}: true if the application is currently
345 * installed for the calling user.
346 */
347 public static final int FLAG_INSTALLED = 1<<23;
348
349 /**
Dianne Hackborn5e03e2c2012-09-06 14:21:19 -0700350 * Value for {@link #flags}: true if the application only has its
351 * data installed; the application package itself does not currently
352 * exist on the device.
353 */
354 public static final int FLAG_IS_DATA_ONLY = 1<<24;
355
356 /**
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700357 * Value for {@link #flags}: true if the application was declared to be a
358 * game, or false if it is a non-game application.
359 *
360 * @deprecated use {@link #CATEGORY_GAME} instead.
Jose Lima12d0b4c2014-03-14 16:55:12 -0700361 */
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700362 @Deprecated
Jose Lima12d0b4c2014-03-14 16:55:12 -0700363 public static final int FLAG_IS_GAME = 1<<25;
364
365 /**
Christopher Tated1de2562014-06-17 17:12:35 -0700366 * Value for {@link #flags}: {@code true} if the application asks that only
367 * full-data streaming backups of its data be performed even though it defines
368 * a {@link android.app.backup.BackupAgent BackupAgent}, which normally
369 * indicates that the app will manage its backed-up data via incremental
370 * key/value updates.
371 */
372 public static final int FLAG_FULL_BACKUP_ONLY = 1<<26;
373
374 /**
Alex Klyubin01a959d2015-03-18 10:05:45 -0700375 * Value for {@link #flags}: {@code true} if the application may use cleartext network traffic
376 * (e.g., HTTP rather than HTTPS; WebSockets rather than WebSockets Secure; XMPP, IMAP, STMP
377 * without STARTTLS or TLS). If {@code false}, the app declares that it does not intend to use
378 * cleartext network traffic, in which case platform components (e.g., HTTP stacks,
Alex Klyubinfbf45992015-04-21 13:44:29 -0700379 * {@code DownloadManager}, {@code MediaPlayer}) will refuse app's requests to use cleartext
380 * traffic. Third-party libraries are encouraged to honor this flag as well.
381 *
Nate Fischer6a2a5412017-10-23 18:02:41 -0700382 * <p>NOTE: {@code WebView} honors this flag for applications targeting API level 26 and up.
Alex Klyubinfbf45992015-04-21 13:44:29 -0700383 *
Chad Brubaker2df5ba72016-04-11 13:31:24 -0700384 * <p>This flag is ignored on Android N and above if an Android Network Security Config is
385 * present.
386 *
Alex Klyubinfbf45992015-04-21 13:44:29 -0700387 * <p>This flag comes from
388 * {@link android.R.styleable#AndroidManifestApplication_usesCleartextTraffic
389 * android:usesCleartextTraffic} of the &lt;application&gt; tag.
Alex Klyubin01a959d2015-03-18 10:05:45 -0700390 */
391 public static final int FLAG_USES_CLEARTEXT_TRAFFIC = 1<<27;
392
393 /**
Dmitriy Ivanovff193d62014-09-30 15:10:48 -0700394 * When set installer extracts native libs from .apk files.
395 */
396 public static final int FLAG_EXTRACT_NATIVE_LIBS = 1<<28;
397
398 /**
Alan Viveretted70b9e72015-05-27 14:29:20 -0700399 * Value for {@link #flags}: {@code true} when the application's rendering
400 * should be hardware accelerated.
401 */
402 public static final int FLAG_HARDWARE_ACCELERATED = 1<<29;
403
404 /**
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000405 * Value for {@link #flags}: true if this application's package is in
406 * the suspended state.
407 */
408 public static final int FLAG_SUSPENDED = 1<<30;
409
410 /**
Narayan Kamath589a1bc2014-07-03 14:43:26 +0100411 * Value for {@link #flags}: true if code from this application will need to be
412 * loaded into other applications' processes. On devices that support multiple
413 * instruction sets, this implies the code might be loaded into a process that's
414 * using any of the devices supported instruction sets.
415 *
416 * <p> The system might treat such applications specially, for eg., by
417 * extracting the application's native libraries for all supported instruction
418 * sets or by compiling the application's dex code for all supported instruction
419 * sets.
420 */
421 public static final int FLAG_MULTIARCH = 1 << 31;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700422
423 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800424 * Flags associated with the application. Any combination of
425 * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
426 * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and
427 * {@link #FLAG_ALLOW_TASK_REPARENTING}
Dianne Hackborn851a5412009-05-08 12:06:44 -0700428 * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
Dianne Hackborn723738c2009-06-25 19:48:04 -0700429 * {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS},
430 * {@link #FLAG_SUPPORTS_NORMAL_SCREENS},
Dianne Hackborn14cee9f2010-04-23 17:51:26 -0700431 * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_SUPPORTS_XLARGE_SCREENS},
432 * {@link #FLAG_RESIZEABLE_FOR_SCREENS},
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700433 * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}, {@link #FLAG_VM_SAFE_MODE},
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800434 * {@link #FLAG_ALLOW_BACKUP}, {@link #FLAG_KILL_AFTER_RESTORE},
435 * {@link #FLAG_RESTORE_ANY_VERSION}, {@link #FLAG_EXTERNAL_STORAGE},
436 * {@link #FLAG_LARGE_HEAP}, {@link #FLAG_STOPPED},
437 * {@link #FLAG_SUPPORTS_RTL}, {@link #FLAG_INSTALLED},
438 * {@link #FLAG_IS_DATA_ONLY}, {@link #FLAG_IS_GAME},
Alex Klyubin7cb000f2015-03-26 11:00:04 -0700439 * {@link #FLAG_FULL_BACKUP_ONLY}, {@link #FLAG_USES_CLEARTEXT_TRAFFIC},
440 * {@link #FLAG_MULTIARCH}.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800441 */
442 public int flags = 0;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700443
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800444 /**
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800445 * Value for {@link #privateFlags}: true if the application is hidden via restrictions and for
446 * most purposes is considered as not installed.
447 * {@hide}
448 */
449 public static final int PRIVATE_FLAG_HIDDEN = 1<<0;
450
451 /**
452 * Value for {@link #privateFlags}: set to <code>true</code> if the application
453 * has reported that it is heavy-weight, and thus can not participate in
454 * the normal application lifecycle.
455 *
456 * <p>Comes from the
457 * android.R.styleable#AndroidManifestApplication_cantSaveState
458 * attribute of the &lt;application&gt; tag.
459 *
460 * {@hide}
461 */
462 public static final int PRIVATE_FLAG_CANT_SAVE_STATE = 1<<1;
463
464 /**
465 * Value for {@link #privateFlags}: Set to true if the application has been
466 * installed using the forward lock option.
467 *
468 * NOTE: DO NOT CHANGE THIS VALUE! It is saved in packages.xml.
469 *
470 * {@hide}
471 */
472 public static final int PRIVATE_FLAG_FORWARD_LOCK = 1<<2;
473
474 /**
475 * Value for {@link #privateFlags}: set to {@code true} if the application
476 * is permitted to hold privileged permissions.
477 *
478 * {@hide}
479 */
480 public static final int PRIVATE_FLAG_PRIVILEGED = 1<<3;
481
482 /**
Svet Ganov2acf0632015-11-24 19:10:59 -0800483 * Value for {@link #privateFlags}: {@code true} if the application has any IntentFiler
484 * with some data URI using HTTP or HTTPS with an associated VIEW action.
Fabrice Di Megliod3d8a322015-04-01 15:58:47 -0700485 *
486 * {@hide}
487 */
488 public static final int PRIVATE_FLAG_HAS_DOMAIN_URLS = 1<<4;
489
490 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600491 * When set, the default data storage directory for this app is pointed at
492 * the device-protected location.
Jeff Sharkey15447792015-11-05 16:18:51 -0800493 *
494 * @hide
495 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600496 public static final int PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1 << 5;
Jeff Sharkey15447792015-11-05 16:18:51 -0800497
498 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600499 * When set, assume that all components under the given app are direct boot
Jeff Sharkeyf9fc6d62015-11-08 16:46:05 -0800500 * aware, unless otherwise specified.
501 *
502 * @hide
503 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600504 public static final int PRIVATE_FLAG_DIRECT_BOOT_AWARE = 1 << 6;
Jeff Sharkeyf9fc6d62015-11-08 16:46:05 -0800505
506 /**
Todd Kennedybe0b8892017-02-15 14:13:52 -0800507 * Value for {@link #privateFlags}: {@code true} if the application is installed
508 * as instant app.
509 *
510 * @hide
Chad Brubaker4389c232016-11-04 14:50:50 -0700511 */
Todd Kennedybe0b8892017-02-15 14:13:52 -0800512 public static final int PRIVATE_FLAG_INSTANT = 1 << 7;
Chad Brubaker4389c232016-11-04 14:50:50 -0700513
514 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600515 * When set, at least one component inside this application is direct boot
516 * aware.
Jeff Sharkey8924e872015-11-30 12:52:10 -0700517 *
518 * @hide
519 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600520 public static final int PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE = 1 << 8;
Jeff Sharkey8924e872015-11-30 12:52:10 -0700521
Fyodor Kupolovf99104d2015-12-14 11:31:29 -0800522
523 /**
Fyodor Kupolovbdbc9692015-12-14 13:11:13 -0800524 * When set, signals that the application is required for the system user and should not be
525 * uninstalled.
526 *
527 * @hide
528 */
Chad Brubaker4389c232016-11-04 14:50:50 -0700529 public static final int PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER = 1 << 9;
Fyodor Kupolovbdbc9692015-12-14 13:11:13 -0800530
531 /**
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700532 * When set, the application explicitly requested that its activities be resizeable by default.
Wale Ogunwale6afdf912016-01-30 13:01:33 -0800533 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity
534 *
535 * @hide
536 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700537 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE = 1 << 10;
538
539 /**
540 * When set, the application explicitly requested that its activities *not* be resizeable by
541 * default.
542 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity
543 *
544 * @hide
545 */
546 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE = 1 << 11;
Wale Ogunwale72a73e32016-10-13 12:16:39 -0700547
548 /**
549 * The application isn't requesting explicitly requesting for its activities to be resizeable or
550 * non-resizeable by default. So, we are making it activities resizeable by default based on the
551 * target SDK version of the app.
552 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity
553 *
554 * NOTE: This only affects apps with target SDK >= N where the resizeableActivity attribute was
555 * introduced. It shouldn't be confused with {@link ActivityInfo#RESIZE_MODE_FORCE_RESIZEABLE}
556 * where certain pre-N apps are forced to the resizeable.
557 *
558 * @hide
559 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700560 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION =
561 1 << 12;
Wale Ogunwale6afdf912016-01-30 13:01:33 -0800562
563 /**
Christopher Tate43fbc5f2016-02-17 18:00:48 -0800564 * Value for {@link #privateFlags}: {@code true} means the OS should go ahead and
565 * run full-data backup operations for the app even when it is in a
566 * foreground-equivalent run state. Defaults to {@code false} if unspecified.
567 * @hide
568 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700569 public static final int PRIVATE_FLAG_BACKUP_IN_FOREGROUND = 1 << 13;
Christopher Tate43fbc5f2016-02-17 18:00:48 -0800570
571 /**
Svet Ganov67882122016-12-11 16:36:34 -0800572 * Value for {@link #privateFlags}: {@code true} means this application
573 * contains a static shared library. Defaults to {@code false} if unspecified.
574 * @hide
575 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700576 public static final int PRIVATE_FLAG_STATIC_SHARED_LIBRARY = 1 << 14;
Svet Ganov67882122016-12-11 16:36:34 -0800577
578 /**
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700579 * Value for {@link #privateFlags}: When set, the application will only have its splits loaded
Adam Lesinski4e862812016-11-21 16:02:24 -0800580 * if they are required to load a component. Splits can be loaded on demand using the
581 * {@link Context#createContextForSplit(String)} API.
582 * @hide
583 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700584 public static final int PRIVATE_FLAG_ISOLATED_SPLIT_LOADING = 1 << 15;
Adam Lesinski4e862812016-11-21 16:02:24 -0800585
586 /**
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700587 * Value for {@link #privateFlags}: When set, the application was installed as
588 * a virtual preload.
589 * @hide
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800590 */
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700591 public static final int PRIVATE_FLAG_VIRTUAL_PRELOAD = 1 << 16;
592
Svet Ganov087dce22017-09-07 15:42:16 -0700593 /**
Mathew Inwood9d895432018-04-04 16:08:21 +0100594 * Value for {@link #privateFlags}: whether this app is pre-installed on the
Svet Ganov087dce22017-09-07 15:42:16 -0700595 * OEM partition of the system image.
596 * @hide
597 */
598 public static final int PRIVATE_FLAG_OEM = 1 << 17;
599
Jiyong Park002fdbd2017-02-13 20:50:31 +0900600 /**
Mathew Inwood9d895432018-04-04 16:08:21 +0100601 * Value for {@link #privateFlags}: whether this app is pre-installed on the
Jiyong Park002fdbd2017-02-13 20:50:31 +0900602 * vendor partition of the system image.
603 * @hide
604 */
605 public static final int PRIVATE_FLAG_VENDOR = 1 << 18;
606
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900607 /**
Mathew Inwood9d895432018-04-04 16:08:21 +0100608 * Value for {@link #privateFlags}: whether this app is pre-installed on the
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900609 * product partition of the system image.
610 * @hide
611 */
612 public static final int PRIVATE_FLAG_PRODUCT = 1 << 19;
613
Mathew Inwood9d895432018-04-04 16:08:21 +0100614 /**
615 * Value for {@link #privateFlags}: whether this app is signed with the
616 * platform key.
617 * @hide
618 */
619 public static final int PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY = 1 << 20;
620
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700621 /** @hide */
622 @IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = {
Svet Ganov087dce22017-09-07 15:42:16 -0700623 PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE,
624 PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION,
625 PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE,
626 PRIVATE_FLAG_BACKUP_IN_FOREGROUND,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700627 PRIVATE_FLAG_CANT_SAVE_STATE,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700628 PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE,
629 PRIVATE_FLAG_DIRECT_BOOT_AWARE,
Svet Ganov087dce22017-09-07 15:42:16 -0700630 PRIVATE_FLAG_FORWARD_LOCK,
631 PRIVATE_FLAG_HAS_DOMAIN_URLS,
632 PRIVATE_FLAG_HIDDEN,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700633 PRIVATE_FLAG_INSTANT,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700634 PRIVATE_FLAG_ISOLATED_SPLIT_LOADING,
Svet Ganov087dce22017-09-07 15:42:16 -0700635 PRIVATE_FLAG_OEM,
636 PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE,
637 PRIVATE_FLAG_PRIVILEGED,
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900638 PRIVATE_FLAG_PRODUCT,
Svet Ganov087dce22017-09-07 15:42:16 -0700639 PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER,
Mathew Inwood9d895432018-04-04 16:08:21 +0100640 PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY,
Svet Ganov087dce22017-09-07 15:42:16 -0700641 PRIVATE_FLAG_STATIC_SHARED_LIBRARY,
Jiyong Park002fdbd2017-02-13 20:50:31 +0900642 PRIVATE_FLAG_VENDOR,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700643 PRIVATE_FLAG_VIRTUAL_PRELOAD,
644 })
645 @Retention(RetentionPolicy.SOURCE)
646 public @interface ApplicationInfoPrivateFlags {}
647
648 /**
649 * Private/hidden flags. See {@code PRIVATE_FLAG_...} constants.
650 * @hide
651 */
652 public @ApplicationInfoPrivateFlags int privateFlags;
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800653
654 /**
Clara Bayarri4b5a4d22017-01-27 20:15:45 +0000655 * @hide
656 */
657 public static final String METADATA_PRELOADED_FONTS = "preloaded_fonts";
658
659 /**
Dianne Hackborndf6e9802011-05-26 14:20:23 -0700660 * The required smallest screen width the application can run on. If 0,
661 * nothing has been specified. Comes from
662 * {@link android.R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp
663 * android:requiresSmallestWidthDp} attribute of the &lt;supports-screens&gt; tag.
664 */
665 public int requiresSmallestWidthDp = 0;
666
667 /**
668 * The maximum smallest screen width the application is designed for. If 0,
669 * nothing has been specified. Comes from
670 * {@link android.R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp
671 * android:compatibleWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
672 */
673 public int compatibleWidthLimitDp = 0;
674
675 /**
Dianne Hackborn2762ff32011-06-01 21:27:05 -0700676 * The maximum smallest screen width the application will work on. If 0,
677 * nothing has been specified. Comes from
678 * {@link android.R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp
679 * android:largestWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
680 */
681 public int largestWidthLimitDp = 0;
682
Jeff Sharkey61128602017-01-26 17:07:35 -0700683 /**
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700684 * Value indicating the maximum aspect ratio the application supports.
685 * <p>
686 * 0 means unset.
687 * @See {@link android.R.attr#maxAspectRatio}.
688 * @hide
689 */
690 public float maxAspectRatio;
691
Jeff Sharkey789a8fc2017-04-16 13:18:35 -0600692 /** @removed */
693 @Deprecated
694 public String volumeUuid;
695
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700696 /**
Jeff Sharkey61128602017-01-26 17:07:35 -0700697 * UUID of the storage volume on which this application is being hosted. For
698 * apps hosted on the default internal storage at
Jeff Sharkey789a8fc2017-04-16 13:18:35 -0600699 * {@link Environment#getDataDirectory()}, the UUID value is
700 * {@link StorageManager#UUID_DEFAULT}.
Jeff Sharkey61128602017-01-26 17:07:35 -0700701 */
Jeff Sharkey789a8fc2017-04-16 13:18:35 -0600702 public UUID storageUuid;
Jeff Sharkey61128602017-01-26 17:07:35 -0700703
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700704 /** {@hide} */
Jeff Sharkeyd7460572014-07-06 20:44:55 -0700705 public String scanSourceDir;
706 /** {@hide} */
707 public String scanPublicSourceDir;
708
Dianne Hackborn2762ff32011-06-01 21:27:05 -0700709 /**
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700710 * Full path to the base APK for this application.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800711 */
712 public String sourceDir;
713
714 /**
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700715 * Full path to the publicly available parts of {@link #sourceDir},
716 * including resources and manifest. This may be different from
717 * {@link #sourceDir} if an application is forward locked.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800718 */
719 public String publicSourceDir;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700720
721 /**
Adam Lesinski4e862812016-11-21 16:02:24 -0800722 * The names of all installed split APKs, ordered lexicographically.
723 */
724 public String[] splitNames;
725
726 /**
727 * Full paths to zero or more split APKs, indexed by the same order as {@link #splitNames}.
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700728 */
729 public String[] splitSourceDirs;
730
731 /**
732 * Full path to the publicly available parts of {@link #splitSourceDirs},
733 * including resources and manifest. This may be different from
734 * {@link #splitSourceDirs} if an application is forward locked.
Adam Lesinski4e862812016-11-21 16:02:24 -0800735 *
736 * @see #splitSourceDirs
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700737 */
738 public String[] splitPublicSourceDirs;
739
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800740 /**
Adam Lesinski4e862812016-11-21 16:02:24 -0800741 * Maps the dependencies between split APKs. All splits implicitly depend on the base APK.
742 *
743 * Available since platform version O.
744 *
745 * Only populated if the application opts in to isolated split loading via the
746 * {@link android.R.attr.isolatedSplits} attribute in the &lt;manifest&gt; tag of the app's
747 * AndroidManifest.xml.
748 *
749 * The keys and values are all indices into the {@link #splitNames}, {@link #splitSourceDirs},
750 * and {@link #splitPublicSourceDirs} arrays.
Adam Lesinski1665d0f2017-03-10 14:46:57 -0800751 * Each key represents a split and its value is an array of splits. The first element of this
752 * array is the parent split, and the rest are configuration splits. These configuration splits
753 * have no dependencies themselves.
Adam Lesinski4e862812016-11-21 16:02:24 -0800754 * Cycles do not exist because they are illegal and screened for during installation.
755 *
756 * May be null if no splits are installed, or if no dependencies exist between them.
Calin Juravleda098152017-09-01 17:30:01 -0700757 *
758 * NOTE: Any change to the way split dependencies are stored must update the logic that
759 * creates the class loader context for dexopt (DexoptUtils#getClassLoaderContexts).
760 *
Adam Lesinski4e862812016-11-21 16:02:24 -0800761 * @hide
762 */
Adam Lesinski1665d0f2017-03-10 14:46:57 -0800763 public SparseArray<int[]> splitDependencies;
Adam Lesinski4e862812016-11-21 16:02:24 -0800764
765 /**
766 * Full paths to the locations of extra resource packages (runtime overlays)
767 * this application uses. This field is only used if there are extra resource
768 * packages, otherwise it is null.
769 *
Kenny Rootace5a3f2010-02-05 12:59:28 -0800770 * {@hide}
Kenny Rootd1ab0162010-01-21 17:27:14 -0800771 */
772 public String[] resourceDirs;
773
774 /**
Jeff Vander Stoepcab36392018-03-06 15:52:22 -0800775 * String retrieved from the seinfo tag found in selinux policy. This value can be set through
776 * the mac_permissions.xml policy construct. This value is used for setting an SELinux security
777 * context on the process as well as its data directory.
Robert Craig0f40dc92013-03-25 06:33:03 -0400778 *
779 * {@hide}
780 */
Jeff Vander Stoepcab36392018-03-06 15:52:22 -0800781 public String seInfo;
Todd Kennedybe0b8892017-02-15 14:13:52 -0800782
783 /**
784 * The seinfo tag generated per-user. This value may change based upon the
785 * user's configuration. For example, when an instant app is installed for
786 * a user. It is an error if this field is ever {@code null} when trying to
787 * start a new process.
788 * <p>NOTE: We need to separate this out because we modify per-user values
789 * multiple times. This needs to be refactored since we're performing more
790 * work than necessary and these values should only be set once. When that
791 * happens, we can merge the per-user value with the seInfo state above.
792 *
793 * {@hide}
794 */
795 public String seInfoUser;
Robert Craig0f40dc92013-03-25 06:33:03 -0400796
797 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800798 * Paths to all shared libraries this application is linked against. This
799 * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES
800 * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving
801 * the structure.
802 */
803 public String[] sharedLibraryFiles;
804
805 /**
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700806 * Full path to the default directory assigned to the package for its
807 * persistent data.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800808 */
809 public String dataDir;
Kenny Root85387d72010-08-26 10:13:11 -0700810
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700811 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600812 * Full path to the device-protected directory assigned to the package for
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700813 * its persistent data.
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600814 *
815 * @see Context#createDeviceProtectedStorageContext()
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700816 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600817 public String deviceProtectedDataDir;
818
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700819 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600820 * Full path to the credential-protected directory assigned to the package
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700821 * for its persistent data.
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600822 *
823 * @hide
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700824 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600825 @SystemApi
826 public String credentialProtectedDataDir;
827
Kenny Root85387d72010-08-26 10:13:11 -0700828 /**
829 * Full path to the directory where native JNI libraries are stored.
Kenny Root85387d72010-08-26 10:13:11 -0700830 */
831 public String nativeLibraryDir;
832
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800833 /**
Narayan Kamath7dba6eb2014-07-16 08:53:30 +0100834 * Full path where unpacked native libraries for {@link #secondaryCpuAbi}
835 * are stored, if present.
836 *
837 * The main reason this exists is for bundled multi-arch apps, where
838 * it's not trivial to calculate the location of libs for the secondary abi
839 * given the location of the primary.
840 *
841 * TODO: Change the layout of bundled installs so that we can use
842 * nativeLibraryRootDir & nativeLibraryRootRequiresIsa there as well.
843 * (e.g {@code [ "/system/app-lib/Foo/arm", "/system/app-lib/Foo/arm64" ]}
844 * instead of {@code [ "/system/lib/Foo", "/system/lib64/Foo" ]}.
845 *
846 * @hide
847 */
848 public String secondaryNativeLibraryDir;
849
850 /**
Jeff Sharkey84f12942014-07-10 17:48:11 -0700851 * The root path where unpacked native libraries are stored.
852 * <p>
853 * When {@link #nativeLibraryRootRequiresIsa} is set, the libraries are
854 * placed in ISA-specific subdirectories under this path, otherwise the
855 * libraries are placed directly at this path.
Narayan Kamathff110bd2014-07-04 18:30:45 +0100856 *
Jeff Sharkey84f12942014-07-10 17:48:11 -0700857 * @hide
Narayan Kamathff110bd2014-07-04 18:30:45 +0100858 */
Jeff Sharkey84f12942014-07-10 17:48:11 -0700859 public String nativeLibraryRootDir;
860
861 /**
862 * Flag indicating that ISA must be appended to
863 * {@link #nativeLibraryRootDir} to be useful.
864 *
865 * @hide
866 */
867 public boolean nativeLibraryRootRequiresIsa;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100868
869 /**
870 * The primary ABI that this application requires, This is inferred from the ABIs
Ramin Zaghiff0c4702014-04-01 15:02:29 +0100871 * of the native JNI libraries the application bundles. Will be {@code null}
872 * if this application does not require any particular ABI.
873 *
Narayan Kamathff110bd2014-07-04 18:30:45 +0100874 * If non-null, the application will always be launched with this ABI.
875 *
Ramin Zaghiff0c4702014-04-01 15:02:29 +0100876 * {@hide}
877 */
Narayan Kamathff110bd2014-07-04 18:30:45 +0100878 public String primaryCpuAbi;
879
880 /**
881 * The secondary ABI for this application. Might be non-null for multi-arch
882 * installs. The application itself never uses this ABI, but other applications that
883 * use its code might.
884 *
885 * {@hide}
886 */
887 public String secondaryCpuAbi;
888
889 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800890 * The kernel user-ID that has been assigned to this application;
891 * currently this is not a unique ID (multiple applications can have
892 * the same uid).
893 */
894 public int uid;
895
Mitsuru Oshima8d112672009-04-27 12:01:23 -0700896 /**
Todd Kennedy89d60182016-03-11 11:18:32 -0800897 * The minimum SDK version this application can run on. It will not run
898 * on earlier versions.
899 */
Todd Kennedy6e2e7f52016-05-02 14:56:45 -0700900 public int minSdkVersion;
Todd Kennedy89d60182016-03-11 11:18:32 -0800901
902 /**
Dianne Hackborn3b3e1452009-09-24 19:22:12 -0700903 * The minimum SDK version this application targets. It may run on earlier
Dianne Hackborna96cbb42009-05-13 15:06:13 -0700904 * versions, but it knows how to work with any new behavior added at this
905 * version. Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
906 * if this is a development build and the app is targeting that. You should
907 * compare that this number is >= the SDK version number at which your
908 * behavior was introduced.
909 */
910 public int targetSdkVersion;
Dianne Hackborn8472e612014-01-23 17:57:20 -0800911
912 /**
913 * The app's declared version code.
914 * @hide
915 */
Patrick Baumannc2def582018-04-04 12:14:15 -0700916 public long longVersionCode;
917
918 /**
919 * An integer representation of the app's declared version code. This is being left in place as
920 * some apps were using reflection to access it before the move to long in
921 * {@link android.os.Build.VERSION_CODES#P}
922 * @deprecated Use {@link #longVersionCode} instead.
923 * @hide
924 */
925 @Deprecated
926 public int versionCode;
Dianne Hackborn8472e612014-01-23 17:57:20 -0800927
Dianne Hackborna96cbb42009-05-13 15:06:13 -0700928 /**
Alan Viveretteb6a25732017-11-21 14:49:24 -0500929 * The user-visible SDK version (ex. 26) of the framework against which the application claims
930 * to have been compiled, or {@code 0} if not specified.
931 * <p>
932 * This property is the compile-time equivalent of
933 * {@link android.os.Build.VERSION#CODENAME Build.VERSION.SDK_INT}.
934 *
935 * @hide For platform use only; we don't expect developers to need to read this value.
936 */
937 public int compileSdkVersion;
938
939 /**
940 * The development codename (ex. "O", "REL") of the framework against which the application
941 * claims to have been compiled, or {@code null} if not specified.
942 * <p>
943 * This property is the compile-time equivalent of
944 * {@link android.os.Build.VERSION#CODENAME Build.VERSION.CODENAME}.
945 *
946 * @hide For platform use only; we don't expect developers to need to read this value.
947 */
948 @Nullable
949 public String compileSdkVersionCodename;
950
951 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800952 * When false, indicates that all components within this application are
953 * considered disabled, regardless of their individually set enabled status.
954 */
955 public boolean enabled = true;
956
Dianne Hackborn54e570f2010-10-04 18:32:32 -0700957 /**
Dianne Hackborn0ac30312011-06-17 14:49:23 -0700958 * For convenient access to the current enabled setting of this app.
959 * @hide
960 */
961 public int enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
962
963 /**
Dianne Hackborn54e570f2010-10-04 18:32:32 -0700964 * For convenient access to package's install location.
965 * @hide
966 */
967 public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
Jose Lima12d0b4c2014-03-14 16:55:12 -0700968
Chad Brubakerc845b2a2016-05-13 14:09:27 -0700969 /**
970 * Resource file providing the application's Network Security Config.
971 * @hide
972 */
973 public int networkSecurityConfigRes;
974
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700975 /**
Todd Kennedy11e45072017-01-25 13:24:21 -0800976 * Version of the sandbox the application wants to run in.
977 * @hide
978 */
Patrick Baumann159cd022018-01-11 13:25:05 -0800979 @SystemApi
Todd Kennedy11e45072017-01-25 13:24:21 -0800980 public int targetSandboxVersion;
981
982 /**
Jason Monka80bfb52017-11-16 17:15:37 -0500983 * The factory of this package, as specified by the &lt;manifest&gt;
984 * tag's {@link android.R.styleable#AndroidManifestApplication_appComponentFactory}
985 * attribute.
986 */
987 public String appComponentFactory;
988
989 /**
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700990 * The category of this app. Categories are used to cluster multiple apps
991 * together into meaningful groups, such as when summarizing battery,
992 * network, or disk usage. Apps should only define this value when they fit
993 * well into one of the specific categories.
994 * <p>
995 * Set from the {@link android.R.attr#appCategory} attribute in the
996 * manifest. If the manifest doesn't define a category, this value may have
997 * been provided by the installer via
998 * {@link PackageManager#setApplicationCategoryHint(String, int)}.
999 */
1000 public @Category int category = CATEGORY_UNDEFINED;
1001
1002 /** {@hide} */
Jeff Sharkey4347f812017-04-21 12:08:39 -06001003 @IntDef(prefix = { "CATEGORY_" }, value = {
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001004 CATEGORY_UNDEFINED,
1005 CATEGORY_GAME,
1006 CATEGORY_AUDIO,
1007 CATEGORY_VIDEO,
1008 CATEGORY_IMAGE,
1009 CATEGORY_SOCIAL,
1010 CATEGORY_NEWS,
1011 CATEGORY_MAPS,
1012 CATEGORY_PRODUCTIVITY
1013 })
1014 @Retention(RetentionPolicy.SOURCE)
1015 public @interface Category {
1016 }
1017
1018 /**
1019 * Value when category is undefined.
1020 *
1021 * @see #category
1022 */
1023 public static final int CATEGORY_UNDEFINED = -1;
1024
1025 /**
1026 * Category for apps which are primarily games.
1027 *
1028 * @see #category
1029 */
1030 public static final int CATEGORY_GAME = 0;
1031
1032 /**
1033 * Category for apps which primarily work with audio or music, such as music
1034 * players.
1035 *
1036 * @see #category
1037 */
1038 public static final int CATEGORY_AUDIO = 1;
1039
1040 /**
1041 * Category for apps which primarily work with video or movies, such as
1042 * streaming video apps.
1043 *
1044 * @see #category
1045 */
1046 public static final int CATEGORY_VIDEO = 2;
1047
1048 /**
1049 * Category for apps which primarily work with images or photos, such as
1050 * camera or gallery apps.
1051 *
1052 * @see #category
1053 */
1054 public static final int CATEGORY_IMAGE = 3;
1055
1056 /**
1057 * Category for apps which are primarily social apps, such as messaging,
Jeff Sharkeyd2b69102017-03-21 19:40:38 -06001058 * communication, email, or social network apps.
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001059 *
1060 * @see #category
1061 */
1062 public static final int CATEGORY_SOCIAL = 4;
1063
1064 /**
1065 * Category for apps which are primarily news apps, such as newspapers,
1066 * magazines, or sports apps.
1067 *
1068 * @see #category
1069 */
1070 public static final int CATEGORY_NEWS = 5;
1071
1072 /**
1073 * Category for apps which are primarily maps apps, such as navigation apps.
1074 *
1075 * @see #category
1076 */
1077 public static final int CATEGORY_MAPS = 6;
1078
1079 /**
1080 * Category for apps which are primarily productivity apps, such as cloud
1081 * storage or workplace apps.
1082 *
1083 * @see #category
1084 */
1085 public static final int CATEGORY_PRODUCTIVITY = 7;
1086
1087 /**
1088 * Return a concise, localized title for the given
1089 * {@link ApplicationInfo#category} value, or {@code null} for unknown
1090 * values such as {@link #CATEGORY_UNDEFINED}.
1091 *
1092 * @see #category
1093 */
1094 public static CharSequence getCategoryTitle(Context context, @Category int category) {
1095 switch (category) {
1096 case ApplicationInfo.CATEGORY_GAME:
1097 return context.getText(com.android.internal.R.string.app_category_game);
1098 case ApplicationInfo.CATEGORY_AUDIO:
1099 return context.getText(com.android.internal.R.string.app_category_audio);
1100 case ApplicationInfo.CATEGORY_VIDEO:
1101 return context.getText(com.android.internal.R.string.app_category_video);
1102 case ApplicationInfo.CATEGORY_IMAGE:
1103 return context.getText(com.android.internal.R.string.app_category_image);
1104 case ApplicationInfo.CATEGORY_SOCIAL:
1105 return context.getText(com.android.internal.R.string.app_category_social);
1106 case ApplicationInfo.CATEGORY_NEWS:
1107 return context.getText(com.android.internal.R.string.app_category_news);
1108 case ApplicationInfo.CATEGORY_MAPS:
1109 return context.getText(com.android.internal.R.string.app_category_maps);
1110 case ApplicationInfo.CATEGORY_PRODUCTIVITY:
1111 return context.getText(com.android.internal.R.string.app_category_productivity);
1112 default:
1113 return null;
1114 }
1115 }
1116
Narayan Kamathf9419f02017-06-15 11:35:38 +01001117 /** @hide */
1118 public String classLoaderName;
1119
1120 /** @hide */
1121 public String[] splitClassLoaderNames;
1122
Rhed Jaoc19da782018-06-13 11:16:16 +08001123 /** @hide */
1124 public boolean hiddenUntilInstalled;
1125
Mathew Inwoode3299532018-02-22 13:19:53 +00001126 /**
1127 * Represents the default policy. The actual policy used will depend on other properties of
1128 * the application, e.g. the target SDK version.
1129 * @hide
1130 */
1131 public static final int HIDDEN_API_ENFORCEMENT_DEFAULT = -1;
1132 /**
1133 * No API enforcement; the app can access the entire internal private API. Only for use by
1134 * system apps.
1135 * @hide
1136 */
1137 public static final int HIDDEN_API_ENFORCEMENT_NONE = 0;
1138 /**
Mathew Inwooda6d02fb2018-04-05 15:44:20 +01001139 * No API enforcement, but enable the detection logic and warnings. Observed behaviour is the
Mathew Inwood5e986dc2018-04-06 13:53:45 +01001140 * same as {@link #HIDDEN_API_ENFORCEMENT_NONE} but you may see warnings in the log when APIs
Mathew Inwooda6d02fb2018-04-05 15:44:20 +01001141 * are accessed.
Mathew Inwoode3299532018-02-22 13:19:53 +00001142 * @hide
1143 * */
Mathew Inwooda6d02fb2018-04-05 15:44:20 +01001144 public static final int HIDDEN_API_ENFORCEMENT_JUST_WARN = 1;
Mathew Inwoode3299532018-02-22 13:19:53 +00001145 /**
1146 * Dark grey list enforcement. Enforces the dark grey and black lists
1147 * @hide
1148 */
1149 public static final int HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK = 2;
1150 /**
1151 * Blacklist enforcement only.
1152 * @hide
1153 */
1154 public static final int HIDDEN_API_ENFORCEMENT_BLACK = 3;
1155
1156 private static final int HIDDEN_API_ENFORCEMENT_MAX = HIDDEN_API_ENFORCEMENT_BLACK;
1157
1158 /**
1159 * Values in this IntDef MUST be kept in sync with enum hiddenapi::EnforcementPolicy in
1160 * art/runtime/hidden_api.h
1161 * @hide
1162 */
1163 @IntDef(prefix = { "HIDDEN_API_ENFORCEMENT_" }, value = {
1164 HIDDEN_API_ENFORCEMENT_DEFAULT,
1165 HIDDEN_API_ENFORCEMENT_NONE,
Mathew Inwooda6d02fb2018-04-05 15:44:20 +01001166 HIDDEN_API_ENFORCEMENT_JUST_WARN,
Mathew Inwoode3299532018-02-22 13:19:53 +00001167 HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK,
1168 HIDDEN_API_ENFORCEMENT_BLACK,
1169 })
1170 @Retention(RetentionPolicy.SOURCE)
1171 public @interface HiddenApiEnforcementPolicy {}
1172
Mathew Inwood1ab30252018-04-03 14:47:26 +01001173 /** @hide */
1174 public static boolean isValidHiddenApiEnforcementPolicy(int policy) {
Mathew Inwoode3299532018-02-22 13:19:53 +00001175 return policy >= HIDDEN_API_ENFORCEMENT_DEFAULT && policy <= HIDDEN_API_ENFORCEMENT_MAX;
1176 }
1177
1178 private int mHiddenApiPolicy = HIDDEN_API_ENFORCEMENT_DEFAULT;
1179
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001180 public void dump(Printer pw, String prefix) {
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001181 dump(pw, prefix, DUMP_FLAG_ALL);
1182 }
1183
1184 /** @hide */
Yohei Yukawa8f272172017-08-31 00:26:01 -07001185 public void dump(Printer pw, String prefix, int dumpFlags) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001186 super.dumpFront(pw, prefix);
Yohei Yukawa8f272172017-08-31 00:26:01 -07001187 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0 && className != null) {
Dianne Hackborn12527f92009-11-11 17:39:50 -08001188 pw.println(prefix + "className=" + className);
1189 }
1190 if (permission != null) {
1191 pw.println(prefix + "permission=" + permission);
1192 }
Dianne Hackborn39792d22010-08-19 18:01:52 -07001193 pw.println(prefix + "processName=" + processName);
Yohei Yukawa8f272172017-08-31 00:26:01 -07001194 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001195 pw.println(prefix + "taskAffinity=" + taskAffinity);
1196 }
Dianne Hackborn39792d22010-08-19 18:01:52 -07001197 pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags)
Alex Klyubinb9f8a522015-02-03 11:12:59 -08001198 + " privateFlags=0x" + Integer.toHexString(privateFlags)
Dianne Hackborn39792d22010-08-19 18:01:52 -07001199 + " theme=0x" + Integer.toHexString(theme));
Yohei Yukawa8f272172017-08-31 00:26:01 -07001200 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001201 pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp
1202 + " compatibleWidthLimitDp=" + compatibleWidthLimitDp
1203 + " largestWidthLimitDp=" + largestWidthLimitDp);
1204 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001205 pw.println(prefix + "sourceDir=" + sourceDir);
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001206 if (!Objects.equals(sourceDir, publicSourceDir)) {
Dianne Hackborn39792d22010-08-19 18:01:52 -07001207 pw.println(prefix + "publicSourceDir=" + publicSourceDir);
1208 }
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001209 if (!ArrayUtils.isEmpty(splitSourceDirs)) {
1210 pw.println(prefix + "splitSourceDirs=" + Arrays.toString(splitSourceDirs));
1211 }
1212 if (!ArrayUtils.isEmpty(splitPublicSourceDirs)
1213 && !Arrays.equals(splitSourceDirs, splitPublicSourceDirs)) {
1214 pw.println(prefix + "splitPublicSourceDirs=" + Arrays.toString(splitPublicSourceDirs));
1215 }
Dianne Hackborn39792d22010-08-19 18:01:52 -07001216 if (resourceDirs != null) {
Andreas Gampee6748ce2015-12-11 18:00:38 -08001217 pw.println(prefix + "resourceDirs=" + Arrays.toString(resourceDirs));
Dianne Hackborn39792d22010-08-19 18:01:52 -07001218 }
Yohei Yukawa8f272172017-08-31 00:26:01 -07001219 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0 && seInfo != null) {
Todd Kennedybe0b8892017-02-15 14:13:52 -08001220 pw.println(prefix + "seinfo=" + seInfo);
1221 pw.println(prefix + "seinfoUser=" + seInfoUser);
Robert Craig0f40dc92013-03-25 06:33:03 -04001222 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001223 pw.println(prefix + "dataDir=" + dataDir);
Yohei Yukawa8f272172017-08-31 00:26:01 -07001224 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001225 pw.println(prefix + "deviceProtectedDataDir=" + deviceProtectedDataDir);
1226 pw.println(prefix + "credentialProtectedDataDir=" + credentialProtectedDataDir);
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001227 if (sharedLibraryFiles != null) {
1228 pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles));
1229 }
Dianne Hackborn12527f92009-11-11 17:39:50 -08001230 }
Narayan Kamathf9419f02017-06-15 11:35:38 +01001231 if (classLoaderName != null) {
1232 pw.println(prefix + "classLoaderName=" + classLoaderName);
1233 }
1234 if (!ArrayUtils.isEmpty(splitClassLoaderNames)) {
1235 pw.println(prefix + "splitClassLoaderNames=" + Arrays.toString(splitClassLoaderNames));
1236 }
1237
Todd Kennedy89d60182016-03-11 11:18:32 -08001238 pw.println(prefix + "enabled=" + enabled
1239 + " minSdkVersion=" + minSdkVersion
1240 + " targetSdkVersion=" + targetSdkVersion
Patrick Baumannc2def582018-04-04 12:14:15 -07001241 + " versionCode=" + longVersionCode
Todd Kennedy11e45072017-01-25 13:24:21 -08001242 + " targetSandboxVersion=" + targetSandboxVersion);
Yohei Yukawa8f272172017-08-31 00:26:01 -07001243 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001244 if (manageSpaceActivityName != null) {
1245 pw.println(prefix + "manageSpaceActivityName=" + manageSpaceActivityName);
1246 }
1247 if (descriptionRes != 0) {
1248 pw.println(prefix + "description=0x" + Integer.toHexString(descriptionRes));
1249 }
1250 if (uiOptions != 0) {
1251 pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions));
1252 }
1253 pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false"));
1254 if (fullBackupContent > 0) {
1255 pw.println(prefix + "fullBackupContent=@xml/" + fullBackupContent);
1256 } else {
1257 pw.println(prefix + "fullBackupContent="
1258 + (fullBackupContent < 0 ? "false" : "true"));
1259 }
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001260 if (networkSecurityConfigRes != 0) {
1261 pw.println(prefix + "networkSecurityConfigRes=0x"
1262 + Integer.toHexString(networkSecurityConfigRes));
1263 }
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001264 if (category != CATEGORY_UNDEFINED) {
1265 pw.println(prefix + "category=" + category);
1266 }
Mathew Inwoode3299532018-02-22 13:19:53 +00001267 pw.println(prefix + "HiddenApiEnforcementPolicy=" + getHiddenApiEnforcementPolicy());
Matthew Williams303650c2015-04-17 18:22:51 -07001268 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001269 super.dumpBack(pw, prefix);
1270 }
Fabrice Di Meglio59dfce82012-04-02 16:17:20 -07001271
Yi Jin148d7f42017-11-28 14:23:56 -08001272 /** {@hide} */
1273 public void writeToProto(ProtoOutputStream proto, long fieldId, int dumpFlags) {
1274 long token = proto.start(fieldId);
1275 super.writeToProto(proto, ApplicationInfoProto.PACKAGE);
1276 proto.write(ApplicationInfoProto.PERMISSION, permission);
1277 proto.write(ApplicationInfoProto.PROCESS_NAME, processName);
1278 proto.write(ApplicationInfoProto.UID, uid);
1279 proto.write(ApplicationInfoProto.FLAGS, flags);
1280 proto.write(ApplicationInfoProto.PRIVATE_FLAGS, privateFlags);
1281 proto.write(ApplicationInfoProto.THEME, theme);
1282 proto.write(ApplicationInfoProto.SOURCE_DIR, sourceDir);
1283 if (!Objects.equals(sourceDir, publicSourceDir)) {
1284 proto.write(ApplicationInfoProto.PUBLIC_SOURCE_DIR, publicSourceDir);
1285 }
1286 if (!ArrayUtils.isEmpty(splitSourceDirs)) {
1287 for (String dir : splitSourceDirs) {
1288 proto.write(ApplicationInfoProto.SPLIT_SOURCE_DIRS, dir);
1289 }
1290 }
1291 if (!ArrayUtils.isEmpty(splitPublicSourceDirs)
1292 && !Arrays.equals(splitSourceDirs, splitPublicSourceDirs)) {
1293 for (String dir : splitPublicSourceDirs) {
1294 proto.write(ApplicationInfoProto.SPLIT_PUBLIC_SOURCE_DIRS, dir);
1295 }
1296 }
1297 if (resourceDirs != null) {
1298 for (String dir : resourceDirs) {
1299 proto.write(ApplicationInfoProto.RESOURCE_DIRS, dir);
1300 }
1301 }
1302 proto.write(ApplicationInfoProto.DATA_DIR, dataDir);
1303 proto.write(ApplicationInfoProto.CLASS_LOADER_NAME, classLoaderName);
1304 if (!ArrayUtils.isEmpty(splitClassLoaderNames)) {
1305 for (String name : splitClassLoaderNames) {
1306 proto.write(ApplicationInfoProto.SPLIT_CLASS_LOADER_NAMES, name);
1307 }
1308 }
1309
1310 long versionToken = proto.start(ApplicationInfoProto.VERSION);
1311 proto.write(ApplicationInfoProto.Version.ENABLED, enabled);
1312 proto.write(ApplicationInfoProto.Version.MIN_SDK_VERSION, minSdkVersion);
1313 proto.write(ApplicationInfoProto.Version.TARGET_SDK_VERSION, targetSdkVersion);
Patrick Baumannc2def582018-04-04 12:14:15 -07001314 proto.write(ApplicationInfoProto.Version.VERSION_CODE, longVersionCode);
Yi Jin148d7f42017-11-28 14:23:56 -08001315 proto.write(ApplicationInfoProto.Version.TARGET_SANDBOX_VERSION, targetSandboxVersion);
1316 proto.end(versionToken);
1317
1318 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
1319 long detailToken = proto.start(ApplicationInfoProto.DETAIL);
1320 if (className != null) {
1321 proto.write(ApplicationInfoProto.Detail.CLASS_NAME, className);
1322 }
1323 proto.write(ApplicationInfoProto.Detail.TASK_AFFINITY, taskAffinity);
1324 proto.write(ApplicationInfoProto.Detail.REQUIRES_SMALLEST_WIDTH_DP,
1325 requiresSmallestWidthDp);
1326 proto.write(ApplicationInfoProto.Detail.COMPATIBLE_WIDTH_LIMIT_DP,
1327 compatibleWidthLimitDp);
1328 proto.write(ApplicationInfoProto.Detail.LARGEST_WIDTH_LIMIT_DP,
1329 largestWidthLimitDp);
1330 if (seInfo != null) {
1331 proto.write(ApplicationInfoProto.Detail.SEINFO, seInfo);
1332 proto.write(ApplicationInfoProto.Detail.SEINFO_USER, seInfoUser);
1333 }
1334 proto.write(ApplicationInfoProto.Detail.DEVICE_PROTECTED_DATA_DIR,
1335 deviceProtectedDataDir);
1336 proto.write(ApplicationInfoProto.Detail.CREDENTIAL_PROTECTED_DATA_DIR,
1337 credentialProtectedDataDir);
1338 if (sharedLibraryFiles != null) {
1339 for (String f : sharedLibraryFiles) {
1340 proto.write(ApplicationInfoProto.Detail.SHARED_LIBRARY_FILES, f);
1341 }
1342 }
1343 if (manageSpaceActivityName != null) {
1344 proto.write(ApplicationInfoProto.Detail.MANAGE_SPACE_ACTIVITY_NAME,
1345 manageSpaceActivityName);
1346 }
1347 if (descriptionRes != 0) {
1348 proto.write(ApplicationInfoProto.Detail.DESCRIPTION_RES, descriptionRes);
1349 }
1350 if (uiOptions != 0) {
1351 proto.write(ApplicationInfoProto.Detail.UI_OPTIONS, uiOptions);
1352 }
1353 proto.write(ApplicationInfoProto.Detail.SUPPORTS_RTL, hasRtlSupport());
1354 if (fullBackupContent > 0) {
1355 proto.write(ApplicationInfoProto.Detail.CONTENT, "@xml/" + fullBackupContent);
1356 } else {
1357 proto.write(ApplicationInfoProto.Detail.IS_FULL_BACKUP, fullBackupContent == 0);
1358 }
1359 if (networkSecurityConfigRes != 0) {
1360 proto.write(ApplicationInfoProto.Detail.NETWORK_SECURITY_CONFIG_RES,
1361 networkSecurityConfigRes);
1362 }
1363 if (category != CATEGORY_UNDEFINED) {
1364 proto.write(ApplicationInfoProto.Detail.CATEGORY, category);
1365 }
1366 proto.end(detailToken);
1367 }
1368 proto.end(token);
1369 }
1370
Fabrice Di Meglio59dfce82012-04-02 16:17:20 -07001371 /**
1372 * @return true if "supportsRtl" has been set to true in the AndroidManifest
1373 * @hide
1374 */
1375 public boolean hasRtlSupport() {
1376 return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL;
1377 }
Jeff Sharkeyba75a9b2016-01-07 11:51:33 -07001378
1379 /** {@hide} */
1380 public boolean hasCode() {
1381 return (flags & FLAG_HAS_CODE) != 0;
1382 }
1383
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001384 public static class DisplayNameComparator
1385 implements Comparator<ApplicationInfo> {
1386 public DisplayNameComparator(PackageManager pm) {
1387 mPM = pm;
1388 }
1389
1390 public final int compare(ApplicationInfo aa, ApplicationInfo ab) {
1391 CharSequence sa = mPM.getApplicationLabel(aa);
1392 if (sa == null) {
1393 sa = aa.packageName;
1394 }
1395 CharSequence sb = mPM.getApplicationLabel(ab);
1396 if (sb == null) {
1397 sb = ab.packageName;
1398 }
1399
1400 return sCollator.compare(sa.toString(), sb.toString());
1401 }
1402
1403 private final Collator sCollator = Collator.getInstance();
1404 private PackageManager mPM;
1405 }
1406
1407 public ApplicationInfo() {
1408 }
1409
1410 public ApplicationInfo(ApplicationInfo orig) {
1411 super(orig);
1412 taskAffinity = orig.taskAffinity;
1413 permission = orig.permission;
1414 processName = orig.processName;
1415 className = orig.className;
1416 theme = orig.theme;
1417 flags = orig.flags;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08001418 privateFlags = orig.privateFlags;
Dianne Hackborndf6e9802011-05-26 14:20:23 -07001419 requiresSmallestWidthDp = orig.requiresSmallestWidthDp;
1420 compatibleWidthLimitDp = orig.compatibleWidthLimitDp;
Dianne Hackborn2762ff32011-06-01 21:27:05 -07001421 largestWidthLimitDp = orig.largestWidthLimitDp;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07001422 volumeUuid = orig.volumeUuid;
Jeff Sharkey789a8fc2017-04-16 13:18:35 -06001423 storageUuid = orig.storageUuid;
Jeff Sharkey7f1a57a2014-10-08 10:14:53 -07001424 scanSourceDir = orig.scanSourceDir;
1425 scanPublicSourceDir = orig.scanPublicSourceDir;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001426 sourceDir = orig.sourceDir;
1427 publicSourceDir = orig.publicSourceDir;
Adam Lesinski4e862812016-11-21 16:02:24 -08001428 splitNames = orig.splitNames;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001429 splitSourceDirs = orig.splitSourceDirs;
1430 splitPublicSourceDirs = orig.splitPublicSourceDirs;
Adam Lesinski4e862812016-11-21 16:02:24 -08001431 splitDependencies = orig.splitDependencies;
Kenny Root85387d72010-08-26 10:13:11 -07001432 nativeLibraryDir = orig.nativeLibraryDir;
Narayan Kamath7dba6eb2014-07-16 08:53:30 +01001433 secondaryNativeLibraryDir = orig.secondaryNativeLibraryDir;
Jeff Sharkey84f12942014-07-10 17:48:11 -07001434 nativeLibraryRootDir = orig.nativeLibraryRootDir;
1435 nativeLibraryRootRequiresIsa = orig.nativeLibraryRootRequiresIsa;
Narayan Kamathff110bd2014-07-04 18:30:45 +01001436 primaryCpuAbi = orig.primaryCpuAbi;
1437 secondaryCpuAbi = orig.secondaryCpuAbi;
Kenny Rootd1ab0162010-01-21 17:27:14 -08001438 resourceDirs = orig.resourceDirs;
Todd Kennedybe0b8892017-02-15 14:13:52 -08001439 seInfo = orig.seInfo;
1440 seInfoUser = orig.seInfoUser;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001441 sharedLibraryFiles = orig.sharedLibraryFiles;
1442 dataDir = orig.dataDir;
Jeff Sharkeydd9bda82017-02-23 17:38:31 -07001443 deviceProtectedDataDir = orig.deviceProtectedDataDir;
1444 credentialProtectedDataDir = orig.credentialProtectedDataDir;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001445 uid = orig.uid;
Todd Kennedy89d60182016-03-11 11:18:32 -08001446 minSdkVersion = orig.minSdkVersion;
Dianne Hackborna96cbb42009-05-13 15:06:13 -07001447 targetSdkVersion = orig.targetSdkVersion;
Patrick Baumannc2def582018-04-04 12:14:15 -07001448 setVersionCode(orig.longVersionCode);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001449 enabled = orig.enabled;
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001450 enabledSetting = orig.enabledSetting;
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001451 installLocation = orig.installLocation;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001452 manageSpaceActivityName = orig.manageSpaceActivityName;
1453 descriptionRes = orig.descriptionRes;
Adam Powell269248d2011-08-02 10:26:54 -07001454 uiOptions = orig.uiOptions;
Christopher Tatebcb02552012-10-16 17:14:34 -07001455 backupAgentName = orig.backupAgentName;
Matthew Williams303650c2015-04-17 18:22:51 -07001456 fullBackupContent = orig.fullBackupContent;
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001457 networkSecurityConfigRes = orig.networkSecurityConfigRes;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001458 category = orig.category;
Todd Kennedy11e45072017-01-25 13:24:21 -08001459 targetSandboxVersion = orig.targetSandboxVersion;
Narayan Kamathf9419f02017-06-15 11:35:38 +01001460 classLoaderName = orig.classLoaderName;
1461 splitClassLoaderNames = orig.splitClassLoaderNames;
Jason Monka80bfb52017-11-16 17:15:37 -05001462 appComponentFactory = orig.appComponentFactory;
Adam Lesinskid3ea00992018-02-20 16:51:13 -08001463 compileSdkVersion = orig.compileSdkVersion;
1464 compileSdkVersionCodename = orig.compileSdkVersionCodename;
Mathew Inwoode3299532018-02-22 13:19:53 +00001465 mHiddenApiPolicy = orig.mHiddenApiPolicy;
Rhed Jaoc19da782018-06-13 11:16:16 +08001466 hiddenUntilInstalled = orig.hiddenUntilInstalled;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001467 }
1468
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001469 public String toString() {
1470 return "ApplicationInfo{"
1471 + Integer.toHexString(System.identityHashCode(this))
1472 + " " + packageName + "}";
1473 }
1474
1475 public int describeContents() {
1476 return 0;
1477 }
1478
Adam Lesinski4e862812016-11-21 16:02:24 -08001479 @SuppressWarnings("unchecked")
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001480 public void writeToParcel(Parcel dest, int parcelableFlags) {
1481 super.writeToParcel(dest, parcelableFlags);
1482 dest.writeString(taskAffinity);
1483 dest.writeString(permission);
1484 dest.writeString(processName);
1485 dest.writeString(className);
1486 dest.writeInt(theme);
1487 dest.writeInt(flags);
Alex Klyubinb9f8a522015-02-03 11:12:59 -08001488 dest.writeInt(privateFlags);
Dianne Hackborndf6e9802011-05-26 14:20:23 -07001489 dest.writeInt(requiresSmallestWidthDp);
1490 dest.writeInt(compatibleWidthLimitDp);
Dianne Hackborn2762ff32011-06-01 21:27:05 -07001491 dest.writeInt(largestWidthLimitDp);
Jeff Sharkey67c8c1e2017-04-19 11:22:02 -06001492 if (storageUuid != null) {
1493 dest.writeInt(1);
Jeff Sharkeya4d34d92017-04-27 11:21:41 -06001494 dest.writeLong(storageUuid.getMostSignificantBits());
1495 dest.writeLong(storageUuid.getLeastSignificantBits());
Jeff Sharkey67c8c1e2017-04-19 11:22:02 -06001496 } else {
1497 dest.writeInt(0);
1498 }
Jeff Sharkey7f1a57a2014-10-08 10:14:53 -07001499 dest.writeString(scanSourceDir);
1500 dest.writeString(scanPublicSourceDir);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001501 dest.writeString(sourceDir);
1502 dest.writeString(publicSourceDir);
Adam Lesinski4e862812016-11-21 16:02:24 -08001503 dest.writeStringArray(splitNames);
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001504 dest.writeStringArray(splitSourceDirs);
1505 dest.writeStringArray(splitPublicSourceDirs);
Adam Lesinski1665d0f2017-03-10 14:46:57 -08001506 dest.writeSparseArray((SparseArray) splitDependencies);
Kenny Root85387d72010-08-26 10:13:11 -07001507 dest.writeString(nativeLibraryDir);
Narayan Kamath7dba6eb2014-07-16 08:53:30 +01001508 dest.writeString(secondaryNativeLibraryDir);
Jeff Sharkey84f12942014-07-10 17:48:11 -07001509 dest.writeString(nativeLibraryRootDir);
1510 dest.writeInt(nativeLibraryRootRequiresIsa ? 1 : 0);
Narayan Kamathff110bd2014-07-04 18:30:45 +01001511 dest.writeString(primaryCpuAbi);
1512 dest.writeString(secondaryCpuAbi);
Kenny Rootd1ab0162010-01-21 17:27:14 -08001513 dest.writeStringArray(resourceDirs);
Todd Kennedybe0b8892017-02-15 14:13:52 -08001514 dest.writeString(seInfo);
1515 dest.writeString(seInfoUser);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001516 dest.writeStringArray(sharedLibraryFiles);
1517 dest.writeString(dataDir);
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001518 dest.writeString(deviceProtectedDataDir);
1519 dest.writeString(credentialProtectedDataDir);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001520 dest.writeInt(uid);
Todd Kennedy6e2e7f52016-05-02 14:56:45 -07001521 dest.writeInt(minSdkVersion);
Dianne Hackborna96cbb42009-05-13 15:06:13 -07001522 dest.writeInt(targetSdkVersion);
Patrick Baumannc2def582018-04-04 12:14:15 -07001523 dest.writeLong(longVersionCode);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001524 dest.writeInt(enabled ? 1 : 0);
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001525 dest.writeInt(enabledSetting);
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001526 dest.writeInt(installLocation);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001527 dest.writeString(manageSpaceActivityName);
Christopher Tate181fafa2009-05-14 11:12:14 -07001528 dest.writeString(backupAgentName);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001529 dest.writeInt(descriptionRes);
Adam Powell269248d2011-08-02 10:26:54 -07001530 dest.writeInt(uiOptions);
Matthew Williams303650c2015-04-17 18:22:51 -07001531 dest.writeInt(fullBackupContent);
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001532 dest.writeInt(networkSecurityConfigRes);
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001533 dest.writeInt(category);
Todd Kennedy11e45072017-01-25 13:24:21 -08001534 dest.writeInt(targetSandboxVersion);
Narayan Kamathf9419f02017-06-15 11:35:38 +01001535 dest.writeString(classLoaderName);
1536 dest.writeStringArray(splitClassLoaderNames);
Alan Viveretteb6a25732017-11-21 14:49:24 -05001537 dest.writeInt(compileSdkVersion);
1538 dest.writeString(compileSdkVersionCodename);
Jason Monka80bfb52017-11-16 17:15:37 -05001539 dest.writeString(appComponentFactory);
Mathew Inwoode3299532018-02-22 13:19:53 +00001540 dest.writeInt(mHiddenApiPolicy);
Rhed Jaoc19da782018-06-13 11:16:16 +08001541 dest.writeInt(hiddenUntilInstalled ? 1 : 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001542 }
1543
1544 public static final Parcelable.Creator<ApplicationInfo> CREATOR
1545 = new Parcelable.Creator<ApplicationInfo>() {
1546 public ApplicationInfo createFromParcel(Parcel source) {
1547 return new ApplicationInfo(source);
1548 }
1549 public ApplicationInfo[] newArray(int size) {
1550 return new ApplicationInfo[size];
1551 }
1552 };
1553
Adam Lesinski4e862812016-11-21 16:02:24 -08001554 @SuppressWarnings("unchecked")
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001555 private ApplicationInfo(Parcel source) {
1556 super(source);
1557 taskAffinity = source.readString();
1558 permission = source.readString();
1559 processName = source.readString();
1560 className = source.readString();
1561 theme = source.readInt();
1562 flags = source.readInt();
Alex Klyubinb9f8a522015-02-03 11:12:59 -08001563 privateFlags = source.readInt();
Dianne Hackborndf6e9802011-05-26 14:20:23 -07001564 requiresSmallestWidthDp = source.readInt();
1565 compatibleWidthLimitDp = source.readInt();
Dianne Hackborn2762ff32011-06-01 21:27:05 -07001566 largestWidthLimitDp = source.readInt();
Jeff Sharkey67c8c1e2017-04-19 11:22:02 -06001567 if (source.readInt() != 0) {
Jeff Sharkeya4d34d92017-04-27 11:21:41 -06001568 storageUuid = new UUID(source.readLong(), source.readLong());
Jeff Sharkey67c8c1e2017-04-19 11:22:02 -06001569 volumeUuid = StorageManager.convert(storageUuid);
1570 }
Jeff Sharkey7f1a57a2014-10-08 10:14:53 -07001571 scanSourceDir = source.readString();
1572 scanPublicSourceDir = source.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001573 sourceDir = source.readString();
1574 publicSourceDir = source.readString();
Adam Lesinski4e862812016-11-21 16:02:24 -08001575 splitNames = source.readStringArray();
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001576 splitSourceDirs = source.readStringArray();
1577 splitPublicSourceDirs = source.readStringArray();
Adam Lesinski1665d0f2017-03-10 14:46:57 -08001578 splitDependencies = source.readSparseArray(null);
Kenny Root85387d72010-08-26 10:13:11 -07001579 nativeLibraryDir = source.readString();
Narayan Kamath7dba6eb2014-07-16 08:53:30 +01001580 secondaryNativeLibraryDir = source.readString();
Jeff Sharkey84f12942014-07-10 17:48:11 -07001581 nativeLibraryRootDir = source.readString();
1582 nativeLibraryRootRequiresIsa = source.readInt() != 0;
Narayan Kamathff110bd2014-07-04 18:30:45 +01001583 primaryCpuAbi = source.readString();
1584 secondaryCpuAbi = source.readString();
Kenny Rootd1ab0162010-01-21 17:27:14 -08001585 resourceDirs = source.readStringArray();
Todd Kennedybe0b8892017-02-15 14:13:52 -08001586 seInfo = source.readString();
1587 seInfoUser = source.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001588 sharedLibraryFiles = source.readStringArray();
1589 dataDir = source.readString();
Jeff Sharkeydd9bda82017-02-23 17:38:31 -07001590 deviceProtectedDataDir = source.readString();
1591 credentialProtectedDataDir = source.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001592 uid = source.readInt();
Todd Kennedy6e2e7f52016-05-02 14:56:45 -07001593 minSdkVersion = source.readInt();
Dianne Hackborna96cbb42009-05-13 15:06:13 -07001594 targetSdkVersion = source.readInt();
Patrick Baumannc2def582018-04-04 12:14:15 -07001595 setVersionCode(source.readLong());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001596 enabled = source.readInt() != 0;
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001597 enabledSetting = source.readInt();
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001598 installLocation = source.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001599 manageSpaceActivityName = source.readString();
Christopher Tate181fafa2009-05-14 11:12:14 -07001600 backupAgentName = source.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001601 descriptionRes = source.readInt();
Adam Powell269248d2011-08-02 10:26:54 -07001602 uiOptions = source.readInt();
Matthew Williams303650c2015-04-17 18:22:51 -07001603 fullBackupContent = source.readInt();
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001604 networkSecurityConfigRes = source.readInt();
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001605 category = source.readInt();
Todd Kennedy11e45072017-01-25 13:24:21 -08001606 targetSandboxVersion = source.readInt();
Narayan Kamathf9419f02017-06-15 11:35:38 +01001607 classLoaderName = source.readString();
1608 splitClassLoaderNames = source.readStringArray();
Alan Viveretteb6a25732017-11-21 14:49:24 -05001609 compileSdkVersion = source.readInt();
1610 compileSdkVersionCodename = source.readString();
Jason Monka80bfb52017-11-16 17:15:37 -05001611 appComponentFactory = source.readString();
Mathew Inwoode3299532018-02-22 13:19:53 +00001612 mHiddenApiPolicy = source.readInt();
Rhed Jaoc19da782018-06-13 11:16:16 +08001613 hiddenUntilInstalled = source.readInt() != 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001614 }
Mitsuru Oshima8d112672009-04-27 12:01:23 -07001615
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001616 /**
1617 * Retrieve the textual description of the application. This
1618 * will call back on the given PackageManager to load the description from
1619 * the application.
1620 *
1621 * @param pm A PackageManager from which the label can be loaded; usually
1622 * the PackageManager from which you originally retrieved this item.
1623 *
1624 * @return Returns a CharSequence containing the application's description.
1625 * If there is no description, null is returned.
1626 */
1627 public CharSequence loadDescription(PackageManager pm) {
1628 if (descriptionRes != 0) {
Jeff Brown07330792010-03-30 19:57:08 -07001629 CharSequence label = pm.getText(packageName, descriptionRes, this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001630 if (label != null) {
1631 return label;
1632 }
1633 }
1634 return null;
1635 }
Mitsuru Oshimae5fb3282009-06-09 21:16:08 -07001636
1637 /**
1638 * Disable compatibility mode
1639 *
1640 * @hide
1641 */
1642 public void disableCompatibilityMode() {
Mitsuru Oshima69fff4a2009-07-21 09:51:05 -07001643 flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
Dianne Hackborn11b822d2009-07-21 20:03:02 -07001644 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
Dianne Hackborn14cee9f2010-04-23 17:51:26 -07001645 FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS);
Mitsuru Oshimae5fb3282009-06-09 21:16:08 -07001646 }
Jeff Sharkey15447792015-11-05 16:18:51 -08001647
skuhne@google.com7e85eb02017-01-04 13:49:54 -08001648 /**
1649 * Is using compatibility mode for non densty aware legacy applications.
1650 *
1651 * @hide
1652 */
1653 public boolean usesCompatibilityMode() {
1654 return targetSdkVersion < DONUT ||
1655 (flags & (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
1656 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
1657 FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS)) == 0;
1658 }
1659
Jeff Sharkey15447792015-11-05 16:18:51 -08001660 /** {@hide} */
1661 public void initForUser(int userId) {
1662 uid = UserHandle.getUid(userId, UserHandle.getAppId(uid));
1663
1664 if ("android".equals(packageName)) {
1665 dataDir = Environment.getDataSystemDirectory().getAbsolutePath();
1666 return;
1667 }
1668
Jeff Sharkeydd9bda82017-02-23 17:38:31 -07001669 deviceProtectedDataDir = Environment
Jeff Sharkey8212ae02016-02-10 14:46:43 -07001670 .getDataUserDePackageDirectory(volumeUuid, userId, packageName)
Jeff Sharkey15447792015-11-05 16:18:51 -08001671 .getAbsolutePath();
Jeff Sharkeydd9bda82017-02-23 17:38:31 -07001672 credentialProtectedDataDir = Environment
Jeff Sharkey8212ae02016-02-10 14:46:43 -07001673 .getDataUserCePackageDirectory(volumeUuid, userId, packageName)
Jeff Sharkey15447792015-11-05 16:18:51 -08001674 .getAbsolutePath();
1675
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001676 if ((privateFlags & PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0
1677 && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) {
1678 dataDir = deviceProtectedDataDir;
Jeff Sharkey15447792015-11-05 16:18:51 -08001679 } else {
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001680 dataDir = credentialProtectedDataDir;
Jeff Sharkey15447792015-11-05 16:18:51 -08001681 }
1682 }
1683
Mathew Inwoode3299532018-02-22 13:19:53 +00001684 private boolean isPackageWhitelistedForHiddenApis() {
1685 return SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
1686 }
1687
Mathew Inwood9d895432018-04-04 16:08:21 +01001688 private boolean isAllowedToUseHiddenApis() {
1689 return isSignedWithPlatformKey()
1690 || (isPackageWhitelistedForHiddenApis() && (isSystemApp() || isUpdatedSystemApp()));
1691 }
1692
Jeff Brown07330792010-03-30 19:57:08 -07001693 /**
1694 * @hide
1695 */
Mathew Inwoode3299532018-02-22 13:19:53 +00001696 public @HiddenApiEnforcementPolicy int getHiddenApiEnforcementPolicy() {
Mathew Inwood9d895432018-04-04 16:08:21 +01001697 if (isAllowedToUseHiddenApis()) {
Mathew Inwoode3299532018-02-22 13:19:53 +00001698 return HIDDEN_API_ENFORCEMENT_NONE;
1699 }
Mathew Inwood1ab30252018-04-03 14:47:26 +01001700 if (mHiddenApiPolicy != HIDDEN_API_ENFORCEMENT_DEFAULT) {
1701 return mHiddenApiPolicy;
1702 }
Jeff Sharkeyaa1a9112018-04-10 15:18:12 -06001703 if (targetSdkVersion < Build.VERSION_CODES.P) {
Mathew Inwood1ab30252018-04-03 14:47:26 +01001704 return HIDDEN_API_ENFORCEMENT_BLACK;
1705 } else {
1706 return HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK;
1707 }
Mathew Inwoode3299532018-02-22 13:19:53 +00001708 }
1709
1710 /**
1711 * @hide
1712 */
1713 public void setHiddenApiEnforcementPolicy(@HiddenApiEnforcementPolicy int policy) {
1714 if (!isValidHiddenApiEnforcementPolicy(policy)) {
1715 throw new IllegalArgumentException("Invalid API enforcement policy: " + policy);
1716 }
1717 mHiddenApiPolicy = policy;
David Brazdil464ed3d2018-01-18 15:25:18 +00001718 }
1719
1720 /**
Mathew Inwood1ab30252018-04-03 14:47:26 +01001721 * Updates the hidden API enforcement policy for this app from the given values, if appropriate.
1722 *
1723 * This will have no effect if this app is not subject to hidden API enforcement, i.e. if it
1724 * is on the package whitelist.
1725 *
1726 * @param policyPreP configured policy for pre-P apps, or {@link
1727 * #HIDDEN_API_ENFORCEMENT_DEFAULT} if nothing configured.
1728 * @param policyP configured policy for apps targeting P or later, or {@link
1729 * #HIDDEN_API_ENFORCEMENT_DEFAULT} if nothing configured.
1730 * @hide
1731 */
1732 public void maybeUpdateHiddenApiEnforcementPolicy(
1733 @HiddenApiEnforcementPolicy int policyPreP, @HiddenApiEnforcementPolicy int policyP) {
1734 if (isPackageWhitelistedForHiddenApis()) {
1735 return;
1736 }
Jeff Sharkeyaa1a9112018-04-10 15:18:12 -06001737 if (targetSdkVersion < Build.VERSION_CODES.P) {
Mathew Inwood1ab30252018-04-03 14:47:26 +01001738 setHiddenApiEnforcementPolicy(policyPreP);
Jeff Sharkeyaa1a9112018-04-10 15:18:12 -06001739 } else if (targetSdkVersion >= Build.VERSION_CODES.P) {
Mathew Inwood1ab30252018-04-03 14:47:26 +01001740 setHiddenApiEnforcementPolicy(policyP);
1741 }
1742
1743 }
1744
1745 /**
David Brazdil464ed3d2018-01-18 15:25:18 +00001746 * @hide
1747 */
Patrick Baumannc2def582018-04-04 12:14:15 -07001748 public void setVersionCode(long newVersionCode) {
1749 longVersionCode = newVersionCode;
1750 versionCode = (int) newVersionCode;
1751 }
1752
1753 /**
1754 * @hide
1755 */
Alexandra Gherghinaa7093142014-07-30 13:43:39 +01001756 @Override
1757 public Drawable loadDefaultIcon(PackageManager pm) {
Jeff Brown07330792010-03-30 19:57:08 -07001758 if ((flags & FLAG_EXTERNAL_STORAGE) != 0
1759 && isPackageUnavailable(pm)) {
1760 return Resources.getSystem().getDrawable(
1761 com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon);
1762 }
1763 return pm.getDefaultActivityIcon();
1764 }
1765
1766 private boolean isPackageUnavailable(PackageManager pm) {
1767 try {
1768 return pm.getPackageInfo(packageName, 0) == null;
1769 } catch (NameNotFoundException ex) {
1770 return true;
1771 }
1772 }
Jeff Sharkeyd7460572014-07-06 20:44:55 -07001773
Jeff Sharkeyf9fc6d62015-11-08 16:46:05 -08001774 /** @hide */
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001775 public boolean isDefaultToDeviceProtectedStorage() {
1776 return (privateFlags
1777 & ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0;
Jeff Sharkeye4697132016-02-06 19:46:15 -07001778 }
1779
1780 /** @hide */
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001781 public boolean isDirectBootAware() {
1782 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE) != 0;
Jeff Sharkeyf9fc6d62015-11-08 16:46:05 -08001783 }
1784
Jeff Sharkey8924e872015-11-30 12:52:10 -07001785 /** @hide */
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001786 public boolean isEncryptionAware() {
1787 return isDirectBootAware() || isPartiallyDirectBootAware();
1788 }
1789
1790 /** @hide */
1791 public boolean isExternal() {
1792 return (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0;
1793 }
1794
1795 /** @hide */
1796 public boolean isExternalAsec() {
1797 return TextUtils.isEmpty(volumeUuid) && isExternal();
1798 }
1799
1800 /** @hide */
1801 public boolean isForwardLocked() {
1802 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0;
1803 }
1804
Patrick Baumann159cd022018-01-11 13:25:05 -08001805 /**
1806 * True if the application is installed as an instant app.
1807 * @hide
1808 */
1809 @SystemApi
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001810 public boolean isInstantApp() {
1811 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
1812 }
1813
1814 /** @hide */
1815 public boolean isInternal() {
1816 return (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0;
1817 }
1818
1819 /** @hide */
1820 public boolean isOem() {
1821 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
1822 }
1823
1824 /** @hide */
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001825 public boolean isPartiallyDirectBootAware() {
1826 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE) != 0;
Jeff Sharkey8924e872015-11-30 12:52:10 -07001827 }
1828
Bryce Lee8558ec72017-08-17 15:37:26 -07001829 /** @hide */
Mathew Inwood9d895432018-04-04 16:08:21 +01001830 public boolean isSignedWithPlatformKey() {
1831 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY) != 0;
1832 }
1833
1834 /** @hide */
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001835 @TestApi
1836 public boolean isPrivilegedApp() {
1837 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
Bryce Lee8558ec72017-08-17 15:37:26 -07001838 }
1839
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001840 /** @hide */
Fyodor Kupolovbdbc9692015-12-14 13:11:13 -08001841 public boolean isRequiredForSystemUser() {
1842 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER) != 0;
1843 }
1844
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001845 /** @hide */
Svet Ganov67882122016-12-11 16:36:34 -08001846 public boolean isStaticSharedLibrary() {
1847 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY) != 0;
1848 }
1849
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001850 /** @hide */
1851 @TestApi
1852 public boolean isSystemApp() {
1853 return (flags & ApplicationInfo.FLAG_SYSTEM) != 0;
1854 }
1855
1856 /** @hide */
1857 public boolean isUpdatedSystemApp() {
1858 return (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
1859 }
1860
Jiyong Park002fdbd2017-02-13 20:50:31 +09001861 /** @hide */
1862 public boolean isVendor() {
1863 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
1864 }
1865
Jaekyun Seok1713d9e2018-01-12 21:47:26 +09001866 /** @hide */
1867 public boolean isProduct() {
1868 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
1869 }
1870
Svet Ganov67882122016-12-11 16:36:34 -08001871 /**
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07001872 * Returns whether or not this application was installed as a virtual preload.
1873 */
1874 public boolean isVirtualPreload() {
1875 return (privateFlags & PRIVATE_FLAG_VIRTUAL_PRELOAD) != 0;
1876 }
1877
1878 /**
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001879 * Returns true if the app has declared in its manifest that it wants its split APKs to be
1880 * loaded into isolated Contexts, with their own ClassLoaders and Resources objects.
Svet Ganov67882122016-12-11 16:36:34 -08001881 * @hide
1882 */
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001883 public boolean requestsIsolatedSplitLoading() {
1884 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING) != 0;
Svet Ganov087dce22017-09-07 15:42:16 -07001885 }
1886
1887 /**
1888 * @hide
1889 */
Jeff Brown07330792010-03-30 19:57:08 -07001890 @Override protected ApplicationInfo getApplicationInfo() {
1891 return this;
1892 }
Jeff Sharkeyd7460572014-07-06 20:44:55 -07001893
1894 /** {@hide} */ public void setCodePath(String codePath) { scanSourceDir = codePath; }
1895 /** {@hide} */ public void setBaseCodePath(String baseCodePath) { sourceDir = baseCodePath; }
1896 /** {@hide} */ public void setSplitCodePaths(String[] splitCodePaths) { splitSourceDirs = splitCodePaths; }
1897 /** {@hide} */ public void setResourcePath(String resourcePath) { scanPublicSourceDir = resourcePath; }
1898 /** {@hide} */ public void setBaseResourcePath(String baseResourcePath) { publicSourceDir = baseResourcePath; }
1899 /** {@hide} */ public void setSplitResourcePaths(String[] splitResourcePaths) { splitPublicSourceDirs = splitResourcePaths; }
1900
1901 /** {@hide} */ public String getCodePath() { return scanSourceDir; }
1902 /** {@hide} */ public String getBaseCodePath() { return sourceDir; }
1903 /** {@hide} */ public String[] getSplitCodePaths() { return splitSourceDirs; }
1904 /** {@hide} */ public String getResourcePath() { return scanPublicSourceDir; }
1905 /** {@hide} */ public String getBaseResourcePath() { return publicSourceDir; }
Jeff Sharkeya3a43b02016-11-15 17:54:23 -07001906 /** {@hide} */ public String[] getSplitResourcePaths() { return splitPublicSourceDirs; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001907}