blob: 5d6d1444eaf3273a9134838f1bcbd1d7d9f8264b [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;
Mathew Inwood5c0d3542018-08-14 13:54:31 +010025import android.annotation.UnsupportedAppUsage;
Jeff Sharkey8a372a02016-03-16 16:25:45 -060026import android.content.Context;
Jeff Brown07330792010-03-30 19:57:08 -070027import android.content.pm.PackageManager.NameNotFoundException;
28import android.content.res.Resources;
29import android.graphics.drawable.Drawable;
Mathew Inwood31755f92018-12-20 13:53:36 +000030import android.os.Build;
Jeff Sharkey15447792015-11-05 16:18:51 -080031import android.os.Environment;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080032import android.os.Parcel;
33import android.os.Parcelable;
Jeff Sharkey15447792015-11-05 16:18:51 -080034import android.os.UserHandle;
Jeff Sharkey789a8fc2017-04-16 13:18:35 -060035import android.os.storage.StorageManager;
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;
Nicolas Geoffray8d144eb2018-11-15 12:59:52 +000048import java.util.List;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -070049import java.util.Objects;
Jeff Sharkey789a8fc2017-04-16 13:18:35 -060050import java.util.UUID;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080051
52/**
53 * Information you can retrieve about a particular application. This
54 * corresponds to information collected from the AndroidManifest.xml's
55 * <application> tag.
56 */
57public class ApplicationInfo extends PackageItemInfo implements Parcelable {
58
59 /**
60 * Default task affinity of all activities in this application. See
61 * {@link ActivityInfo#taskAffinity} for more information. This comes
62 * from the "taskAffinity" attribute.
63 */
64 public String taskAffinity;
65
66 /**
67 * Optional name of a permission required to be able to access this
68 * application's components. From the "permission" attribute.
69 */
70 public String permission;
71
72 /**
73 * The name of the process this application should run in. From the
74 * "process" attribute or, if not set, the same as
75 * <var>packageName</var>.
76 */
77 public String processName;
78
79 /**
80 * Class implementing the Application object. From the "class"
81 * attribute.
82 */
83 public String className;
84
85 /**
86 * A style resource identifier (in the package's resources) of the
87 * description of an application. From the "description" attribute
88 * or, if not set, 0.
89 */
90 public int descriptionRes;
91
92 /**
93 * A style resource identifier (in the package's resources) of the
94 * default visual theme of the application. From the "theme" attribute
95 * or, if not set, 0.
96 */
97 public int theme;
98
99 /**
100 * Class implementing the Application's manage space
101 * functionality. From the "manageSpaceActivity"
102 * attribute. This is an optional attribute and will be null if
Christopher Tate181fafa2009-05-14 11:12:14 -0700103 * applications don't specify it in their manifest
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800104 */
105 public String manageSpaceActivityName;
106
107 /**
Christopher Tate181fafa2009-05-14 11:12:14 -0700108 * Class implementing the Application's backup functionality. From
109 * the "backupAgent" attribute. This is an optional attribute and
110 * will be null if the application does not specify it in its manifest.
111 *
112 * <p>If android:allowBackup is set to false, this attribute is ignored.
Christopher Tate181fafa2009-05-14 11:12:14 -0700113 */
114 public String backupAgentName;
Christopher Tate4a627c72011-04-01 14:43:32 -0700115
116 /**
Matthew Williams303650c2015-04-17 18:22:51 -0700117 * An optional attribute that indicates the app supports automatic backup of app data.
118 * <p>0 is the default and means the app's entire data folder + managed external storage will
119 * be backed up;
120 * Any negative value indicates the app does not support full-data backup, though it may still
121 * want to participate via the traditional key/value backup API;
122 * A positive number specifies an xml resource in which the application has defined its backup
123 * include/exclude criteria.
124 * <p>If android:allowBackup is set to false, this attribute is ignored.
125 *
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600126 * @see android.content.Context#getNoBackupFilesDir()
127 * @see #FLAG_ALLOW_BACKUP
Christopher Tate98fa6562015-05-14 13:20:10 -0700128 *
129 * @hide
Matthew Williams303650c2015-04-17 18:22:51 -0700130 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100131 @UnsupportedAppUsage
Matthew Williams303650c2015-04-17 18:22:51 -0700132 public int fullBackupContent = 0;
133
134 /**
Adam Powell269248d2011-08-02 10:26:54 -0700135 * The default extra UI options for activities in this application.
136 * Set from the {@link android.R.attr#uiOptions} attribute in the
137 * activity's manifest.
138 */
139 public int uiOptions = 0;
140
141 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800142 * Value for {@link #flags}: if set, this application is installed in the
143 * device's system image.
144 */
145 public static final int FLAG_SYSTEM = 1<<0;
146
147 /**
148 * Value for {@link #flags}: set to true if this application would like to
149 * allow debugging of its
150 * code, even when installed on a non-development system. Comes
151 * from {@link android.R.styleable#AndroidManifestApplication_debuggable
152 * android:debuggable} of the &lt;application&gt; tag.
153 */
154 public static final int FLAG_DEBUGGABLE = 1<<1;
155
156 /**
157 * Value for {@link #flags}: set to true if this application has code
158 * associated with it. Comes
159 * from {@link android.R.styleable#AndroidManifestApplication_hasCode
160 * android:hasCode} of the &lt;application&gt; tag.
161 */
162 public static final int FLAG_HAS_CODE = 1<<2;
163
164 /**
165 * Value for {@link #flags}: set to true if this application is persistent.
166 * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent
167 * android:persistent} of the &lt;application&gt; tag.
168 */
169 public static final int FLAG_PERSISTENT = 1<<3;
170
171 /**
Christopher Tate181fafa2009-05-14 11:12:14 -0700172 * Value for {@link #flags}: set to true if this application holds the
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800173 * {@link android.Manifest.permission#FACTORY_TEST} permission and the
174 * device is running in factory test mode.
175 */
176 public static final int FLAG_FACTORY_TEST = 1<<4;
177
178 /**
179 * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
180 * Comes from {@link android.R.styleable#AndroidManifestApplication_allowTaskReparenting
181 * android:allowTaskReparenting} of the &lt;application&gt; tag.
182 */
183 public static final int FLAG_ALLOW_TASK_REPARENTING = 1<<5;
184
185 /**
186 * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
187 * Comes from {@link android.R.styleable#AndroidManifestApplication_allowClearUserData
188 * android:allowClearUserData} of the &lt;application&gt; tag.
189 */
190 public static final int FLAG_ALLOW_CLEAR_USER_DATA = 1<<6;
191
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192 /**
Dianne Hackborn851a5412009-05-08 12:06:44 -0700193 * Value for {@link #flags}: this is set if this application has been
Kweku Adams8de29ca2016-01-22 12:30:26 -0800194 * installed as an update to a built-in system application.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800195 */
196 public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7;
Dianne Hackborn851a5412009-05-08 12:06:44 -0700197
198 /**
Svet Ganov354cd3c2015-12-17 11:35:04 -0800199 * Value for {@link #flags}: this is set if the application has specified
Dianne Hackborn7f205432009-07-28 00:13:47 -0700200 * {@link android.R.styleable#AndroidManifestApplication_testOnly
201 * android:testOnly} to be true.
Dianne Hackborn851a5412009-05-08 12:06:44 -0700202 */
Dianne Hackborna96cbb42009-05-13 15:06:13 -0700203 public static final int FLAG_TEST_ONLY = 1<<8;
Dianne Hackbornade3eca2009-05-11 18:54:45 -0700204
205 /**
Dianne Hackborn5c1e00b2009-06-18 17:10:57 -0700206 * Value for {@link #flags}: true when the application's window can be
Dianne Hackborn723738c2009-06-25 19:48:04 -0700207 * reduced in size for smaller screens. Corresponds to
208 * {@link android.R.styleable#AndroidManifestSupportsScreens_smallScreens
209 * android:smallScreens}.
Dianne Hackborn5c1e00b2009-06-18 17:10:57 -0700210 */
Dianne Hackborn723738c2009-06-25 19:48:04 -0700211 public static final int FLAG_SUPPORTS_SMALL_SCREENS = 1<<9;
212
213 /**
214 * Value for {@link #flags}: true when the application's window can be
215 * displayed on normal screens. Corresponds to
216 * {@link android.R.styleable#AndroidManifestSupportsScreens_normalScreens
217 * android:normalScreens}.
218 */
219 public static final int FLAG_SUPPORTS_NORMAL_SCREENS = 1<<10;
220
221 /**
222 * Value for {@link #flags}: true when the application's window can be
223 * increased in size for larger screens. Corresponds to
224 * {@link android.R.styleable#AndroidManifestSupportsScreens_largeScreens
Dianne Hackborn22ec9ab2010-04-29 17:56:03 -0700225 * android:largeScreens}.
Dianne Hackborn723738c2009-06-25 19:48:04 -0700226 */
227 public static final int FLAG_SUPPORTS_LARGE_SCREENS = 1<<11;
Dianne Hackborn5c1e00b2009-06-18 17:10:57 -0700228
229 /**
Dianne Hackbornc4db95c2009-07-21 17:46:02 -0700230 * Value for {@link #flags}: true when the application knows how to adjust
231 * its UI for different screen sizes. Corresponds to
232 * {@link android.R.styleable#AndroidManifestSupportsScreens_resizeable
233 * android:resizeable}.
234 */
235 public static final int FLAG_RESIZEABLE_FOR_SCREENS = 1<<12;
236
237 /**
Dianne Hackborn11b822d2009-07-21 20:03:02 -0700238 * Value for {@link #flags}: true when the application knows how to
kopriva219f7dc2018-10-09 13:42:28 -0700239 * accommodate different screen densities. Corresponds to
Dianne Hackborn11b822d2009-07-21 20:03:02 -0700240 * {@link android.R.styleable#AndroidManifestSupportsScreens_anyDensity
241 * android:anyDensity}.
242 */
243 public static final int FLAG_SUPPORTS_SCREEN_DENSITIES = 1<<13;
244
245 /**
Ben Cheng23085b72010-02-08 16:06:32 -0800246 * Value for {@link #flags}: set to true if this application would like to
247 * request the VM to operate under the safe mode. Comes from
Ben Chengef3f5dd2010-03-29 15:47:26 -0700248 * {@link android.R.styleable#AndroidManifestApplication_vmSafeMode
249 * android:vmSafeMode} of the &lt;application&gt; tag.
Ben Cheng23085b72010-02-08 16:06:32 -0800250 */
251 public static final int FLAG_VM_SAFE_MODE = 1<<14;
252
253 /**
Christopher Tate3de55bc2010-03-12 17:28:08 -0800254 * Value for {@link #flags}: set to <code>false</code> if the application does not wish
255 * to permit any OS-driven backups of its data; <code>true</code> otherwise.
Christopher Tate181fafa2009-05-14 11:12:14 -0700256 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800257 * <p>Comes from the
258 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
259 * attribute of the &lt;application&gt; tag.
Christopher Tate181fafa2009-05-14 11:12:14 -0700260 */
Ben Cheng23085b72010-02-08 16:06:32 -0800261 public static final int FLAG_ALLOW_BACKUP = 1<<15;
Christopher Tate5e1ab332009-09-01 20:32:49 -0700262
263 /**
Christopher Tate3de55bc2010-03-12 17:28:08 -0800264 * Value for {@link #flags}: set to <code>false</code> if the application must be kept
265 * in memory following a full-system restore operation; <code>true</code> otherwise.
266 * Ordinarily, during a full system restore operation each application is shut down
267 * following execution of its agent's onRestore() method. Setting this attribute to
268 * <code>false</code> prevents this. Most applications will not need to set this attribute.
Christopher Tate5e1ab332009-09-01 20:32:49 -0700269 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800270 * <p>If
271 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
272 * is set to <code>false</code> or no
273 * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent}
Christopher Tate5e1ab332009-09-01 20:32:49 -0700274 * is specified, this flag will be ignored.
275 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800276 * <p>Comes from the
277 * {@link android.R.styleable#AndroidManifestApplication_killAfterRestore android:killAfterRestore}
278 * attribute of the &lt;application&gt; tag.
Christopher Tate5e1ab332009-09-01 20:32:49 -0700279 */
Ben Cheng23085b72010-02-08 16:06:32 -0800280 public static final int FLAG_KILL_AFTER_RESTORE = 1<<16;
Christopher Tate5e1ab332009-09-01 20:32:49 -0700281
282 /**
Christopher Tate3de55bc2010-03-12 17:28:08 -0800283 * Value for {@link #flags}: Set to <code>true</code> if the application's backup
284 * agent claims to be able to handle restore data even "from the future,"
285 * i.e. from versions of the application with a versionCode greater than
286 * the one currently installed on the device. <i>Use with caution!</i> By default
287 * this attribute is <code>false</code> and the Backup Manager will ensure that data
288 * from "future" versions of the application are never supplied during a restore operation.
Christopher Tate5e1ab332009-09-01 20:32:49 -0700289 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800290 * <p>If
291 * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
292 * is set to <code>false</code> or no
293 * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent}
Christopher Tate5e1ab332009-09-01 20:32:49 -0700294 * is specified, this flag will be ignored.
295 *
Christopher Tate3de55bc2010-03-12 17:28:08 -0800296 * <p>Comes from the
297 * {@link android.R.styleable#AndroidManifestApplication_restoreAnyVersion android:restoreAnyVersion}
298 * attribute of the &lt;application&gt; tag.
Christopher Tate5e1ab332009-09-01 20:32:49 -0700299 */
Christopher Tate3de55bc2010-03-12 17:28:08 -0800300 public static final int FLAG_RESTORE_ANY_VERSION = 1<<17;
Christopher Tate5e1ab332009-09-01 20:32:49 -0700301
Christopher Tate181fafa2009-05-14 11:12:14 -0700302 /**
Dianne Hackborn3202d382010-04-26 17:51:34 -0700303 * Value for {@link #flags}: Set to true if the application is
304 * currently installed on external/removable/unprotected storage. Such
305 * applications may not be available if their storage is not currently
306 * mounted. When the storage it is on is not available, it will look like
307 * the application has been uninstalled (its .apk is no longer available)
308 * but its persistent data is not removed.
Suchi Amalapurapuaf8e9f42010-01-12 10:17:28 -0800309 */
Dianne Hackborn94c567e2010-04-26 18:13:10 -0700310 public static final int FLAG_EXTERNAL_STORAGE = 1<<18;
Suchi Amalapurapuaf8e9f42010-01-12 10:17:28 -0800311
312 /**
Dianne Hackborn14cee9f2010-04-23 17:51:26 -0700313 * Value for {@link #flags}: true when the application's window can be
314 * increased in size for extra large screens. Corresponds to
315 * {@link android.R.styleable#AndroidManifestSupportsScreens_xlargeScreens
Dianne Hackborn22ec9ab2010-04-29 17:56:03 -0700316 * android:xlargeScreens}.
Dianne Hackborn14cee9f2010-04-23 17:51:26 -0700317 */
318 public static final int FLAG_SUPPORTS_XLARGE_SCREENS = 1<<19;
319
320 /**
Dianne Hackborn3b81bc12011-01-15 11:50:52 -0800321 * Value for {@link #flags}: true when the application has requested a
322 * large heap for its processes. Corresponds to
323 * {@link android.R.styleable#AndroidManifestApplication_largeHeap
324 * android:largeHeap}.
Jason parksa3cdaa52011-01-13 14:15:43 -0600325 */
Dianne Hackborn3b81bc12011-01-15 11:50:52 -0800326 public static final int FLAG_LARGE_HEAP = 1<<20;
Jason parksa3cdaa52011-01-13 14:15:43 -0600327
328 /**
Dianne Hackborne7f97212011-02-24 14:40:20 -0800329 * Value for {@link #flags}: true if this application's package is in
330 * the stopped state.
331 */
332 public static final int FLAG_STOPPED = 1<<21;
333
334 /**
Fabrice Di Meglio59dfce82012-04-02 16:17:20 -0700335 * Value for {@link #flags}: true when the application is willing to support
336 * RTL (right to left). All activities will inherit this value.
337 *
338 * Set from the {@link android.R.attr#supportsRtl} attribute in the
339 * activity's manifest.
340 *
341 * Default value is false (no support for RTL).
342 */
343 public static final int FLAG_SUPPORTS_RTL = 1<<22;
344
345 /**
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700346 * Value for {@link #flags}: true if the application is currently
347 * installed for the calling user.
348 */
349 public static final int FLAG_INSTALLED = 1<<23;
350
351 /**
Dianne Hackborn5e03e2c2012-09-06 14:21:19 -0700352 * Value for {@link #flags}: true if the application only has its
353 * data installed; the application package itself does not currently
354 * exist on the device.
355 */
356 public static final int FLAG_IS_DATA_ONLY = 1<<24;
357
358 /**
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700359 * Value for {@link #flags}: true if the application was declared to be a
360 * game, or false if it is a non-game application.
361 *
362 * @deprecated use {@link #CATEGORY_GAME} instead.
Jose Lima12d0b4c2014-03-14 16:55:12 -0700363 */
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700364 @Deprecated
Jose Lima12d0b4c2014-03-14 16:55:12 -0700365 public static final int FLAG_IS_GAME = 1<<25;
366
367 /**
Christopher Tated1de2562014-06-17 17:12:35 -0700368 * Value for {@link #flags}: {@code true} if the application asks that only
369 * full-data streaming backups of its data be performed even though it defines
370 * a {@link android.app.backup.BackupAgent BackupAgent}, which normally
371 * indicates that the app will manage its backed-up data via incremental
372 * key/value updates.
373 */
374 public static final int FLAG_FULL_BACKUP_ONLY = 1<<26;
375
376 /**
Alex Klyubin01a959d2015-03-18 10:05:45 -0700377 * Value for {@link #flags}: {@code true} if the application may use cleartext network traffic
378 * (e.g., HTTP rather than HTTPS; WebSockets rather than WebSockets Secure; XMPP, IMAP, STMP
379 * without STARTTLS or TLS). If {@code false}, the app declares that it does not intend to use
380 * cleartext network traffic, in which case platform components (e.g., HTTP stacks,
Alex Klyubinfbf45992015-04-21 13:44:29 -0700381 * {@code DownloadManager}, {@code MediaPlayer}) will refuse app's requests to use cleartext
382 * traffic. Third-party libraries are encouraged to honor this flag as well.
383 *
Nate Fischer6a2a5412017-10-23 18:02:41 -0700384 * <p>NOTE: {@code WebView} honors this flag for applications targeting API level 26 and up.
Alex Klyubinfbf45992015-04-21 13:44:29 -0700385 *
Chad Brubaker2df5ba72016-04-11 13:31:24 -0700386 * <p>This flag is ignored on Android N and above if an Android Network Security Config is
387 * present.
388 *
Alex Klyubinfbf45992015-04-21 13:44:29 -0700389 * <p>This flag comes from
390 * {@link android.R.styleable#AndroidManifestApplication_usesCleartextTraffic
391 * android:usesCleartextTraffic} of the &lt;application&gt; tag.
Alex Klyubin01a959d2015-03-18 10:05:45 -0700392 */
393 public static final int FLAG_USES_CLEARTEXT_TRAFFIC = 1<<27;
394
395 /**
Dmitriy Ivanovff193d62014-09-30 15:10:48 -0700396 * When set installer extracts native libs from .apk files.
397 */
398 public static final int FLAG_EXTRACT_NATIVE_LIBS = 1<<28;
399
400 /**
Alan Viveretted70b9e72015-05-27 14:29:20 -0700401 * Value for {@link #flags}: {@code true} when the application's rendering
402 * should be hardware accelerated.
403 */
404 public static final int FLAG_HARDWARE_ACCELERATED = 1<<29;
405
406 /**
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000407 * Value for {@link #flags}: true if this application's package is in
408 * the suspended state.
409 */
410 public static final int FLAG_SUSPENDED = 1<<30;
411
412 /**
Narayan Kamath589a1bc2014-07-03 14:43:26 +0100413 * Value for {@link #flags}: true if code from this application will need to be
414 * loaded into other applications' processes. On devices that support multiple
415 * instruction sets, this implies the code might be loaded into a process that's
416 * using any of the devices supported instruction sets.
417 *
418 * <p> The system might treat such applications specially, for eg., by
419 * extracting the application's native libraries for all supported instruction
420 * sets or by compiling the application's dex code for all supported instruction
421 * sets.
422 */
423 public static final int FLAG_MULTIARCH = 1 << 31;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700424
425 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800426 * Flags associated with the application. Any combination of
427 * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
428 * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and
429 * {@link #FLAG_ALLOW_TASK_REPARENTING}
Dianne Hackborn851a5412009-05-08 12:06:44 -0700430 * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
Dianne Hackborn723738c2009-06-25 19:48:04 -0700431 * {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS},
432 * {@link #FLAG_SUPPORTS_NORMAL_SCREENS},
Dianne Hackborn14cee9f2010-04-23 17:51:26 -0700433 * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_SUPPORTS_XLARGE_SCREENS},
434 * {@link #FLAG_RESIZEABLE_FOR_SCREENS},
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700435 * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}, {@link #FLAG_VM_SAFE_MODE},
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800436 * {@link #FLAG_ALLOW_BACKUP}, {@link #FLAG_KILL_AFTER_RESTORE},
437 * {@link #FLAG_RESTORE_ANY_VERSION}, {@link #FLAG_EXTERNAL_STORAGE},
438 * {@link #FLAG_LARGE_HEAP}, {@link #FLAG_STOPPED},
439 * {@link #FLAG_SUPPORTS_RTL}, {@link #FLAG_INSTALLED},
440 * {@link #FLAG_IS_DATA_ONLY}, {@link #FLAG_IS_GAME},
Alex Klyubin7cb000f2015-03-26 11:00:04 -0700441 * {@link #FLAG_FULL_BACKUP_ONLY}, {@link #FLAG_USES_CLEARTEXT_TRAFFIC},
442 * {@link #FLAG_MULTIARCH}.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800443 */
444 public int flags = 0;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700445
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800446 /**
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800447 * Value for {@link #privateFlags}: true if the application is hidden via restrictions and for
448 * most purposes is considered as not installed.
449 * {@hide}
450 */
451 public static final int PRIVATE_FLAG_HIDDEN = 1<<0;
452
453 /**
454 * Value for {@link #privateFlags}: set to <code>true</code> if the application
455 * has reported that it is heavy-weight, and thus can not participate in
456 * the normal application lifecycle.
457 *
458 * <p>Comes from the
459 * android.R.styleable#AndroidManifestApplication_cantSaveState
460 * attribute of the &lt;application&gt; tag.
461 *
462 * {@hide}
463 */
464 public static final int PRIVATE_FLAG_CANT_SAVE_STATE = 1<<1;
465
466 /**
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800467 * Value for {@link #privateFlags}: set to {@code true} if the application
468 * is permitted to hold privileged permissions.
469 *
470 * {@hide}
471 */
Jeff Sharkeyc6091162018-06-29 17:15:40 -0600472 @TestApi
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800473 public static final int PRIVATE_FLAG_PRIVILEGED = 1<<3;
474
475 /**
Svet Ganov2acf0632015-11-24 19:10:59 -0800476 * Value for {@link #privateFlags}: {@code true} if the application has any IntentFiler
477 * with some data URI using HTTP or HTTPS with an associated VIEW action.
Fabrice Di Megliod3d8a322015-04-01 15:58:47 -0700478 *
479 * {@hide}
480 */
481 public static final int PRIVATE_FLAG_HAS_DOMAIN_URLS = 1<<4;
482
483 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600484 * When set, the default data storage directory for this app is pointed at
485 * the device-protected location.
Jeff Sharkey15447792015-11-05 16:18:51 -0800486 *
487 * @hide
488 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600489 public static final int PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1 << 5;
Jeff Sharkey15447792015-11-05 16:18:51 -0800490
491 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600492 * When set, assume that all components under the given app are direct boot
Jeff Sharkeyf9fc6d62015-11-08 16:46:05 -0800493 * aware, unless otherwise specified.
494 *
495 * @hide
496 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600497 public static final int PRIVATE_FLAG_DIRECT_BOOT_AWARE = 1 << 6;
Jeff Sharkeyf9fc6d62015-11-08 16:46:05 -0800498
499 /**
Todd Kennedybe0b8892017-02-15 14:13:52 -0800500 * Value for {@link #privateFlags}: {@code true} if the application is installed
501 * as instant app.
502 *
503 * @hide
Chad Brubaker4389c232016-11-04 14:50:50 -0700504 */
Todd Kennedybe0b8892017-02-15 14:13:52 -0800505 public static final int PRIVATE_FLAG_INSTANT = 1 << 7;
Chad Brubaker4389c232016-11-04 14:50:50 -0700506
507 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600508 * When set, at least one component inside this application is direct boot
509 * aware.
Jeff Sharkey8924e872015-11-30 12:52:10 -0700510 *
511 * @hide
512 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600513 public static final int PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE = 1 << 8;
Jeff Sharkey8924e872015-11-30 12:52:10 -0700514
Fyodor Kupolovf99104d2015-12-14 11:31:29 -0800515
516 /**
Fyodor Kupolovbdbc9692015-12-14 13:11:13 -0800517 * When set, signals that the application is required for the system user and should not be
518 * uninstalled.
519 *
520 * @hide
521 */
Chad Brubaker4389c232016-11-04 14:50:50 -0700522 public static final int PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER = 1 << 9;
Fyodor Kupolovbdbc9692015-12-14 13:11:13 -0800523
524 /**
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700525 * When set, the application explicitly requested that its activities be resizeable by default.
Wale Ogunwale6afdf912016-01-30 13:01:33 -0800526 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity
527 *
528 * @hide
529 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700530 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE = 1 << 10;
531
532 /**
533 * When set, the application explicitly requested that its activities *not* be resizeable by
534 * default.
535 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity
536 *
537 * @hide
538 */
539 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE = 1 << 11;
Wale Ogunwale72a73e32016-10-13 12:16:39 -0700540
541 /**
542 * The application isn't requesting explicitly requesting for its activities to be resizeable or
543 * non-resizeable by default. So, we are making it activities resizeable by default based on the
544 * target SDK version of the app.
545 * @see android.R.styleable#AndroidManifestActivity_resizeableActivity
546 *
547 * NOTE: This only affects apps with target SDK >= N where the resizeableActivity attribute was
548 * introduced. It shouldn't be confused with {@link ActivityInfo#RESIZE_MODE_FORCE_RESIZEABLE}
549 * where certain pre-N apps are forced to the resizeable.
550 *
551 * @hide
552 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700553 public static final int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION =
554 1 << 12;
Wale Ogunwale6afdf912016-01-30 13:01:33 -0800555
556 /**
Christopher Tate43fbc5f2016-02-17 18:00:48 -0800557 * Value for {@link #privateFlags}: {@code true} means the OS should go ahead and
558 * run full-data backup operations for the app even when it is in a
559 * foreground-equivalent run state. Defaults to {@code false} if unspecified.
560 * @hide
561 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700562 public static final int PRIVATE_FLAG_BACKUP_IN_FOREGROUND = 1 << 13;
Christopher Tate43fbc5f2016-02-17 18:00:48 -0800563
564 /**
Svet Ganov67882122016-12-11 16:36:34 -0800565 * Value for {@link #privateFlags}: {@code true} means this application
566 * contains a static shared library. Defaults to {@code false} if unspecified.
567 * @hide
568 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700569 public static final int PRIVATE_FLAG_STATIC_SHARED_LIBRARY = 1 << 14;
Svet Ganov67882122016-12-11 16:36:34 -0800570
571 /**
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700572 * Value for {@link #privateFlags}: When set, the application will only have its splits loaded
Adam Lesinski4e862812016-11-21 16:02:24 -0800573 * if they are required to load a component. Splits can be loaded on demand using the
574 * {@link Context#createContextForSplit(String)} API.
575 * @hide
576 */
Wale Ogunwalee633eb02017-03-30 12:57:29 -0700577 public static final int PRIVATE_FLAG_ISOLATED_SPLIT_LOADING = 1 << 15;
Adam Lesinski4e862812016-11-21 16:02:24 -0800578
579 /**
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700580 * Value for {@link #privateFlags}: When set, the application was installed as
581 * a virtual preload.
582 * @hide
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800583 */
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700584 public static final int PRIVATE_FLAG_VIRTUAL_PRELOAD = 1 << 16;
585
Svet Ganov087dce22017-09-07 15:42:16 -0700586 /**
Mathew Inwood9d895432018-04-04 16:08:21 +0100587 * Value for {@link #privateFlags}: whether this app is pre-installed on the
Svet Ganov087dce22017-09-07 15:42:16 -0700588 * OEM partition of the system image.
589 * @hide
590 */
591 public static final int PRIVATE_FLAG_OEM = 1 << 17;
592
Jiyong Park002fdbd2017-02-13 20:50:31 +0900593 /**
Mathew Inwood9d895432018-04-04 16:08:21 +0100594 * Value for {@link #privateFlags}: whether this app is pre-installed on the
Jiyong Park002fdbd2017-02-13 20:50:31 +0900595 * vendor partition of the system image.
596 * @hide
597 */
598 public static final int PRIVATE_FLAG_VENDOR = 1 << 18;
599
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900600 /**
Mathew Inwood9d895432018-04-04 16:08:21 +0100601 * Value for {@link #privateFlags}: whether this app is pre-installed on the
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900602 * product partition of the system image.
603 * @hide
604 */
605 public static final int PRIVATE_FLAG_PRODUCT = 1 << 19;
606
Mathew Inwood9d895432018-04-04 16:08:21 +0100607 /**
David Brazdila5b4df22018-09-06 09:49:14 +0100608 * Value for {@link #privateFlags}: whether this app is signed with the
609 * platform key.
610 * @hide
611 */
612 public static final int PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY = 1 << 20;
613
614 /**
Dario Freni2bef1762018-06-01 14:02:08 +0100615 * Value for {@link #privateFlags}: whether this app is pre-installed on the
616 * google partition of the system image.
617 * @hide
618 */
619 public static final int PRIVATE_FLAG_PRODUCT_SERVICES = 1 << 21;
620
621 /**
David Brazdila5b4df22018-09-06 09:49:14 +0100622 * Indicates whether this package requires access to non-SDK APIs.
623 * Only system apps and tests are allowed to use this property.
Mathew Inwood9d895432018-04-04 16:08:21 +0100624 * @hide
625 */
David Brazdila5b4df22018-09-06 09:49:14 +0100626 public static final int PRIVATE_FLAG_USES_NON_SDK_API = 1 << 22;
Mathew Inwood9d895432018-04-04 16:08:21 +0100627
Chris Craikce030282018-10-16 14:33:11 -0700628 /**
629 * Indicates whether this application can be profiled by the shell user,
630 * even when running on a device that is running in user mode.
631 * @hide
632 */
633 public static final int PRIVATE_FLAG_PROFILEABLE_BY_SHELL = 1 << 23;
634
Philip P. Moltmannae4a4b92018-12-12 11:28:57 -0800635 /**
636 * Indicates whether this package requires access to non-SDK APIs.
637 * Only system apps and tests are allowed to use this property.
638 * @hide
639 */
640 public static final int PRIVATE_FLAG_HAS_FRAGILE_USER_DATA = 1 << 24;
641
Victor Hsiehe7b5a8d2018-11-16 10:27:06 -0800642 /**
643 * Indicate whether this application prefers code integrity, that is, run only code that is
644 * signed. This requires android:extractNativeLibs to be "false", as well as .dex and .so (if
645 * any) stored uncompressed inside the APK, which is signed. At run time, the implications
646 * include:
647 *
648 * <ul>
649 * <li>ART will JIT the dex code directly from the APK. There may be performance characteristic
650 * changes depend on the actual workload.
651 * </ul>
652 *
653 * @hide
654 */
655 public static final int PRIVATE_FLAG_PREFER_CODE_INTEGRITY = 1 << 25;
656
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700657 /** @hide */
658 @IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = {
Svet Ganov087dce22017-09-07 15:42:16 -0700659 PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE,
660 PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION,
661 PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE,
662 PRIVATE_FLAG_BACKUP_IN_FOREGROUND,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700663 PRIVATE_FLAG_CANT_SAVE_STATE,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700664 PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE,
665 PRIVATE_FLAG_DIRECT_BOOT_AWARE,
Svet Ganov087dce22017-09-07 15:42:16 -0700666 PRIVATE_FLAG_HAS_DOMAIN_URLS,
667 PRIVATE_FLAG_HIDDEN,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700668 PRIVATE_FLAG_INSTANT,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700669 PRIVATE_FLAG_ISOLATED_SPLIT_LOADING,
Svet Ganov087dce22017-09-07 15:42:16 -0700670 PRIVATE_FLAG_OEM,
671 PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE,
Victor Hsiehe7b5a8d2018-11-16 10:27:06 -0800672 PRIVATE_FLAG_PREFER_CODE_INTEGRITY,
Svet Ganov087dce22017-09-07 15:42:16 -0700673 PRIVATE_FLAG_PRIVILEGED,
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900674 PRIVATE_FLAG_PRODUCT,
Dario Freni2bef1762018-06-01 14:02:08 +0100675 PRIVATE_FLAG_PRODUCT_SERVICES,
Chris Craikce030282018-10-16 14:33:11 -0700676 PRIVATE_FLAG_PROFILEABLE_BY_SHELL,
Svet Ganov087dce22017-09-07 15:42:16 -0700677 PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER,
Mathew Inwood9d895432018-04-04 16:08:21 +0100678 PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY,
Svet Ganov087dce22017-09-07 15:42:16 -0700679 PRIVATE_FLAG_STATIC_SHARED_LIBRARY,
Jiyong Park002fdbd2017-02-13 20:50:31 +0900680 PRIVATE_FLAG_VENDOR,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700681 PRIVATE_FLAG_VIRTUAL_PRELOAD,
Philip P. Moltmannae4a4b92018-12-12 11:28:57 -0800682 PRIVATE_FLAG_HAS_FRAGILE_USER_DATA,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700683 })
684 @Retention(RetentionPolicy.SOURCE)
685 public @interface ApplicationInfoPrivateFlags {}
686
687 /**
688 * Private/hidden flags. See {@code PRIVATE_FLAG_...} constants.
689 * @hide
690 */
Jeff Sharkeyc6091162018-06-29 17:15:40 -0600691 @TestApi
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700692 public @ApplicationInfoPrivateFlags int privateFlags;
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800693
694 /**
Clara Bayarri4b5a4d22017-01-27 20:15:45 +0000695 * @hide
696 */
697 public static final String METADATA_PRELOADED_FONTS = "preloaded_fonts";
698
699 /**
Dianne Hackborndf6e9802011-05-26 14:20:23 -0700700 * The required smallest screen width the application can run on. If 0,
701 * nothing has been specified. Comes from
702 * {@link android.R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp
703 * android:requiresSmallestWidthDp} attribute of the &lt;supports-screens&gt; tag.
704 */
705 public int requiresSmallestWidthDp = 0;
706
707 /**
708 * The maximum smallest screen width the application is designed for. If 0,
709 * nothing has been specified. Comes from
710 * {@link android.R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp
711 * android:compatibleWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
712 */
713 public int compatibleWidthLimitDp = 0;
714
715 /**
Dianne Hackborn2762ff32011-06-01 21:27:05 -0700716 * The maximum smallest screen width the application will work on. If 0,
717 * nothing has been specified. Comes from
718 * {@link android.R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp
719 * android:largestWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
720 */
721 public int largestWidthLimitDp = 0;
722
Jeff Sharkey61128602017-01-26 17:07:35 -0700723 /**
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700724 * Value indicating the maximum aspect ratio the application supports.
725 * <p>
726 * 0 means unset.
727 * @See {@link android.R.attr#maxAspectRatio}.
728 * @hide
729 */
730 public float maxAspectRatio;
731
Adrian Roos917791e2018-11-28 16:30:44 +0100732 /**
733 * Value indicating the minimum aspect ratio the application supports.
734 * <p>
735 * 0 means unset.
736 * @see {@link android.R.attr#minAspectRatio}.
737 * @hide
738 */
739 public float minAspectRatio;
740
Jeff Sharkey789a8fc2017-04-16 13:18:35 -0600741 /** @removed */
742 @Deprecated
743 public String volumeUuid;
744
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700745 /**
Jeff Sharkey61128602017-01-26 17:07:35 -0700746 * UUID of the storage volume on which this application is being hosted. For
747 * apps hosted on the default internal storage at
Jeff Sharkey789a8fc2017-04-16 13:18:35 -0600748 * {@link Environment#getDataDirectory()}, the UUID value is
749 * {@link StorageManager#UUID_DEFAULT}.
Jeff Sharkey61128602017-01-26 17:07:35 -0700750 */
Jeff Sharkey789a8fc2017-04-16 13:18:35 -0600751 public UUID storageUuid;
Jeff Sharkey61128602017-01-26 17:07:35 -0700752
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700753 /** {@hide} */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100754 @UnsupportedAppUsage
Jeff Sharkeyd7460572014-07-06 20:44:55 -0700755 public String scanSourceDir;
756 /** {@hide} */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100757 @UnsupportedAppUsage
Jeff Sharkeyd7460572014-07-06 20:44:55 -0700758 public String scanPublicSourceDir;
759
Dianne Hackborn2762ff32011-06-01 21:27:05 -0700760 /**
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700761 * Full path to the base APK for this application.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800762 */
763 public String sourceDir;
764
765 /**
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700766 * Full path to the publicly available parts of {@link #sourceDir},
767 * including resources and manifest. This may be different from
768 * {@link #sourceDir} if an application is forward locked.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800769 */
770 public String publicSourceDir;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700771
772 /**
Adam Lesinski4e862812016-11-21 16:02:24 -0800773 * The names of all installed split APKs, ordered lexicographically.
774 */
775 public String[] splitNames;
776
777 /**
778 * Full paths to zero or more split APKs, indexed by the same order as {@link #splitNames}.
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700779 */
780 public String[] splitSourceDirs;
781
782 /**
783 * Full path to the publicly available parts of {@link #splitSourceDirs},
784 * including resources and manifest. This may be different from
785 * {@link #splitSourceDirs} if an application is forward locked.
Adam Lesinski4e862812016-11-21 16:02:24 -0800786 *
787 * @see #splitSourceDirs
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700788 */
789 public String[] splitPublicSourceDirs;
790
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800791 /**
Adam Lesinski4e862812016-11-21 16:02:24 -0800792 * Maps the dependencies between split APKs. All splits implicitly depend on the base APK.
793 *
794 * Available since platform version O.
795 *
796 * Only populated if the application opts in to isolated split loading via the
797 * {@link android.R.attr.isolatedSplits} attribute in the &lt;manifest&gt; tag of the app's
798 * AndroidManifest.xml.
799 *
800 * The keys and values are all indices into the {@link #splitNames}, {@link #splitSourceDirs},
801 * and {@link #splitPublicSourceDirs} arrays.
Adam Lesinski1665d0f2017-03-10 14:46:57 -0800802 * Each key represents a split and its value is an array of splits. The first element of this
803 * array is the parent split, and the rest are configuration splits. These configuration splits
804 * have no dependencies themselves.
Adam Lesinski4e862812016-11-21 16:02:24 -0800805 * Cycles do not exist because they are illegal and screened for during installation.
806 *
807 * May be null if no splits are installed, or if no dependencies exist between them.
Calin Juravleda098152017-09-01 17:30:01 -0700808 *
809 * NOTE: Any change to the way split dependencies are stored must update the logic that
810 * creates the class loader context for dexopt (DexoptUtils#getClassLoaderContexts).
811 *
Adam Lesinski4e862812016-11-21 16:02:24 -0800812 * @hide
813 */
Adam Lesinski1665d0f2017-03-10 14:46:57 -0800814 public SparseArray<int[]> splitDependencies;
Adam Lesinski4e862812016-11-21 16:02:24 -0800815
816 /**
817 * Full paths to the locations of extra resource packages (runtime overlays)
818 * this application uses. This field is only used if there are extra resource
819 * packages, otherwise it is null.
820 *
Kenny Rootace5a3f2010-02-05 12:59:28 -0800821 * {@hide}
Kenny Rootd1ab0162010-01-21 17:27:14 -0800822 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100823 @UnsupportedAppUsage
Kenny Rootd1ab0162010-01-21 17:27:14 -0800824 public String[] resourceDirs;
825
826 /**
Jeff Vander Stoepcab36392018-03-06 15:52:22 -0800827 * String retrieved from the seinfo tag found in selinux policy. This value can be set through
828 * the mac_permissions.xml policy construct. This value is used for setting an SELinux security
829 * context on the process as well as its data directory.
Robert Craig0f40dc92013-03-25 06:33:03 -0400830 *
831 * {@hide}
832 */
Jeff Vander Stoepcab36392018-03-06 15:52:22 -0800833 public String seInfo;
Todd Kennedybe0b8892017-02-15 14:13:52 -0800834
835 /**
836 * The seinfo tag generated per-user. This value may change based upon the
837 * user's configuration. For example, when an instant app is installed for
838 * a user. It is an error if this field is ever {@code null} when trying to
839 * start a new process.
840 * <p>NOTE: We need to separate this out because we modify per-user values
841 * multiple times. This needs to be refactored since we're performing more
842 * work than necessary and these values should only be set once. When that
843 * happens, we can merge the per-user value with the seInfo state above.
844 *
845 * {@hide}
846 */
847 public String seInfoUser;
Robert Craig0f40dc92013-03-25 06:33:03 -0400848
849 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800850 * Paths to all shared libraries this application is linked against. This
851 * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES
852 * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving
853 * the structure.
854 */
855 public String[] sharedLibraryFiles;
Nicolas Geoffray8d144eb2018-11-15 12:59:52 +0000856
857 /**
858 * List of all shared libraries this application is linked against. This
859 * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES
860 * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving
861 * the structure.
862 *
863 * {@hide}
864 */
865 public List<SharedLibraryInfo> sharedLibraryInfos;
866
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800867 /**
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700868 * Full path to the default directory assigned to the package for its
869 * persistent data.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800870 */
871 public String dataDir;
Kenny Root85387d72010-08-26 10:13:11 -0700872
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700873 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600874 * Full path to the device-protected directory assigned to the package for
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700875 * its persistent data.
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600876 *
877 * @see Context#createDeviceProtectedStorageContext()
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700878 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600879 public String deviceProtectedDataDir;
880
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700881 /**
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600882 * Full path to the credential-protected directory assigned to the package
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700883 * for its persistent data.
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600884 *
885 * @hide
Jeff Sharkey7a30a302015-12-08 14:20:06 -0700886 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -0600887 @SystemApi
888 public String credentialProtectedDataDir;
889
Kenny Root85387d72010-08-26 10:13:11 -0700890 /**
891 * Full path to the directory where native JNI libraries are stored.
Kenny Root85387d72010-08-26 10:13:11 -0700892 */
893 public String nativeLibraryDir;
894
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800895 /**
Narayan Kamath7dba6eb2014-07-16 08:53:30 +0100896 * Full path where unpacked native libraries for {@link #secondaryCpuAbi}
897 * are stored, if present.
898 *
899 * The main reason this exists is for bundled multi-arch apps, where
900 * it's not trivial to calculate the location of libs for the secondary abi
901 * given the location of the primary.
902 *
903 * TODO: Change the layout of bundled installs so that we can use
904 * nativeLibraryRootDir & nativeLibraryRootRequiresIsa there as well.
905 * (e.g {@code [ "/system/app-lib/Foo/arm", "/system/app-lib/Foo/arm64" ]}
906 * instead of {@code [ "/system/lib/Foo", "/system/lib64/Foo" ]}.
907 *
908 * @hide
909 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100910 @UnsupportedAppUsage
Narayan Kamath7dba6eb2014-07-16 08:53:30 +0100911 public String secondaryNativeLibraryDir;
912
913 /**
Jeff Sharkey84f12942014-07-10 17:48:11 -0700914 * The root path where unpacked native libraries are stored.
915 * <p>
916 * When {@link #nativeLibraryRootRequiresIsa} is set, the libraries are
917 * placed in ISA-specific subdirectories under this path, otherwise the
918 * libraries are placed directly at this path.
Narayan Kamathff110bd2014-07-04 18:30:45 +0100919 *
Jeff Sharkey84f12942014-07-10 17:48:11 -0700920 * @hide
Narayan Kamathff110bd2014-07-04 18:30:45 +0100921 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100922 @UnsupportedAppUsage
Jeff Sharkey84f12942014-07-10 17:48:11 -0700923 public String nativeLibraryRootDir;
924
925 /**
926 * Flag indicating that ISA must be appended to
927 * {@link #nativeLibraryRootDir} to be useful.
928 *
929 * @hide
930 */
931 public boolean nativeLibraryRootRequiresIsa;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100932
933 /**
934 * The primary ABI that this application requires, This is inferred from the ABIs
Ramin Zaghiff0c4702014-04-01 15:02:29 +0100935 * of the native JNI libraries the application bundles. Will be {@code null}
936 * if this application does not require any particular ABI.
937 *
Narayan Kamathff110bd2014-07-04 18:30:45 +0100938 * If non-null, the application will always be launched with this ABI.
939 *
Ramin Zaghiff0c4702014-04-01 15:02:29 +0100940 * {@hide}
941 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100942 @UnsupportedAppUsage
Narayan Kamathff110bd2014-07-04 18:30:45 +0100943 public String primaryCpuAbi;
944
945 /**
946 * The secondary ABI for this application. Might be non-null for multi-arch
947 * installs. The application itself never uses this ABI, but other applications that
948 * use its code might.
949 *
950 * {@hide}
951 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100952 @UnsupportedAppUsage
Narayan Kamathff110bd2014-07-04 18:30:45 +0100953 public String secondaryCpuAbi;
954
955 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800956 * The kernel user-ID that has been assigned to this application;
957 * currently this is not a unique ID (multiple applications can have
958 * the same uid).
959 */
960 public int uid;
961
Mitsuru Oshima8d112672009-04-27 12:01:23 -0700962 /**
Todd Kennedy89d60182016-03-11 11:18:32 -0800963 * The minimum SDK version this application can run on. It will not run
964 * on earlier versions.
965 */
Todd Kennedy6e2e7f52016-05-02 14:56:45 -0700966 public int minSdkVersion;
Todd Kennedy89d60182016-03-11 11:18:32 -0800967
968 /**
Dianne Hackborn3b3e1452009-09-24 19:22:12 -0700969 * The minimum SDK version this application targets. It may run on earlier
Dianne Hackborna96cbb42009-05-13 15:06:13 -0700970 * versions, but it knows how to work with any new behavior added at this
971 * version. Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
972 * if this is a development build and the app is targeting that. You should
973 * compare that this number is >= the SDK version number at which your
974 * behavior was introduced.
975 */
976 public int targetSdkVersion;
Dianne Hackborn8472e612014-01-23 17:57:20 -0800977
978 /**
979 * The app's declared version code.
980 * @hide
981 */
Patrick Baumannc2def582018-04-04 12:14:15 -0700982 public long longVersionCode;
983
984 /**
985 * An integer representation of the app's declared version code. This is being left in place as
986 * some apps were using reflection to access it before the move to long in
987 * {@link android.os.Build.VERSION_CODES#P}
988 * @deprecated Use {@link #longVersionCode} instead.
989 * @hide
990 */
991 @Deprecated
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100992 @UnsupportedAppUsage
Patrick Baumannc2def582018-04-04 12:14:15 -0700993 public int versionCode;
Dianne Hackborn8472e612014-01-23 17:57:20 -0800994
Dianne Hackborna96cbb42009-05-13 15:06:13 -0700995 /**
Alan Viveretteb6a25732017-11-21 14:49:24 -0500996 * The user-visible SDK version (ex. 26) of the framework against which the application claims
997 * to have been compiled, or {@code 0} if not specified.
998 * <p>
999 * This property is the compile-time equivalent of
1000 * {@link android.os.Build.VERSION#CODENAME Build.VERSION.SDK_INT}.
1001 *
1002 * @hide For platform use only; we don't expect developers to need to read this value.
1003 */
1004 public int compileSdkVersion;
1005
1006 /**
1007 * The development codename (ex. "O", "REL") of the framework against which the application
1008 * claims to have been compiled, or {@code null} if not specified.
1009 * <p>
1010 * This property is the compile-time equivalent of
1011 * {@link android.os.Build.VERSION#CODENAME Build.VERSION.CODENAME}.
1012 *
1013 * @hide For platform use only; we don't expect developers to need to read this value.
1014 */
1015 @Nullable
1016 public String compileSdkVersionCodename;
1017
1018 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001019 * When false, indicates that all components within this application are
1020 * considered disabled, regardless of their individually set enabled status.
1021 */
1022 public boolean enabled = true;
1023
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001024 /**
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001025 * For convenient access to the current enabled setting of this app.
1026 * @hide
1027 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +01001028 @UnsupportedAppUsage
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001029 public int enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
1030
1031 /**
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001032 * For convenient access to package's install location.
1033 * @hide
1034 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +01001035 @UnsupportedAppUsage
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001036 public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
Jose Lima12d0b4c2014-03-14 16:55:12 -07001037
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001038 /**
1039 * Resource file providing the application's Network Security Config.
1040 * @hide
1041 */
1042 public int networkSecurityConfigRes;
1043
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001044 /**
Todd Kennedy11e45072017-01-25 13:24:21 -08001045 * Version of the sandbox the application wants to run in.
1046 * @hide
1047 */
Patrick Baumann159cd022018-01-11 13:25:05 -08001048 @SystemApi
Todd Kennedy11e45072017-01-25 13:24:21 -08001049 public int targetSandboxVersion;
1050
1051 /**
Jason Monka80bfb52017-11-16 17:15:37 -05001052 * The factory of this package, as specified by the &lt;manifest&gt;
1053 * tag's {@link android.R.styleable#AndroidManifestApplication_appComponentFactory}
1054 * attribute.
1055 */
1056 public String appComponentFactory;
1057
1058 /**
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001059 * The category of this app. Categories are used to cluster multiple apps
1060 * together into meaningful groups, such as when summarizing battery,
1061 * network, or disk usage. Apps should only define this value when they fit
1062 * well into one of the specific categories.
1063 * <p>
1064 * Set from the {@link android.R.attr#appCategory} attribute in the
1065 * manifest. If the manifest doesn't define a category, this value may have
1066 * been provided by the installer via
1067 * {@link PackageManager#setApplicationCategoryHint(String, int)}.
1068 */
1069 public @Category int category = CATEGORY_UNDEFINED;
1070
1071 /** {@hide} */
Jeff Sharkey4347f812017-04-21 12:08:39 -06001072 @IntDef(prefix = { "CATEGORY_" }, value = {
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001073 CATEGORY_UNDEFINED,
1074 CATEGORY_GAME,
1075 CATEGORY_AUDIO,
1076 CATEGORY_VIDEO,
1077 CATEGORY_IMAGE,
1078 CATEGORY_SOCIAL,
1079 CATEGORY_NEWS,
1080 CATEGORY_MAPS,
1081 CATEGORY_PRODUCTIVITY
1082 })
1083 @Retention(RetentionPolicy.SOURCE)
1084 public @interface Category {
1085 }
1086
1087 /**
1088 * Value when category is undefined.
1089 *
1090 * @see #category
1091 */
1092 public static final int CATEGORY_UNDEFINED = -1;
1093
1094 /**
1095 * Category for apps which are primarily games.
1096 *
1097 * @see #category
1098 */
1099 public static final int CATEGORY_GAME = 0;
1100
1101 /**
1102 * Category for apps which primarily work with audio or music, such as music
1103 * players.
1104 *
1105 * @see #category
1106 */
1107 public static final int CATEGORY_AUDIO = 1;
1108
1109 /**
1110 * Category for apps which primarily work with video or movies, such as
1111 * streaming video apps.
1112 *
1113 * @see #category
1114 */
1115 public static final int CATEGORY_VIDEO = 2;
1116
1117 /**
1118 * Category for apps which primarily work with images or photos, such as
1119 * camera or gallery apps.
1120 *
1121 * @see #category
1122 */
1123 public static final int CATEGORY_IMAGE = 3;
1124
1125 /**
1126 * Category for apps which are primarily social apps, such as messaging,
Jeff Sharkeyd2b69102017-03-21 19:40:38 -06001127 * communication, email, or social network apps.
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001128 *
1129 * @see #category
1130 */
1131 public static final int CATEGORY_SOCIAL = 4;
1132
1133 /**
1134 * Category for apps which are primarily news apps, such as newspapers,
1135 * magazines, or sports apps.
1136 *
1137 * @see #category
1138 */
1139 public static final int CATEGORY_NEWS = 5;
1140
1141 /**
1142 * Category for apps which are primarily maps apps, such as navigation apps.
1143 *
1144 * @see #category
1145 */
1146 public static final int CATEGORY_MAPS = 6;
1147
1148 /**
1149 * Category for apps which are primarily productivity apps, such as cloud
1150 * storage or workplace apps.
1151 *
1152 * @see #category
1153 */
1154 public static final int CATEGORY_PRODUCTIVITY = 7;
1155
1156 /**
1157 * Return a concise, localized title for the given
1158 * {@link ApplicationInfo#category} value, or {@code null} for unknown
1159 * values such as {@link #CATEGORY_UNDEFINED}.
1160 *
1161 * @see #category
1162 */
1163 public static CharSequence getCategoryTitle(Context context, @Category int category) {
1164 switch (category) {
1165 case ApplicationInfo.CATEGORY_GAME:
1166 return context.getText(com.android.internal.R.string.app_category_game);
1167 case ApplicationInfo.CATEGORY_AUDIO:
1168 return context.getText(com.android.internal.R.string.app_category_audio);
1169 case ApplicationInfo.CATEGORY_VIDEO:
1170 return context.getText(com.android.internal.R.string.app_category_video);
1171 case ApplicationInfo.CATEGORY_IMAGE:
1172 return context.getText(com.android.internal.R.string.app_category_image);
1173 case ApplicationInfo.CATEGORY_SOCIAL:
1174 return context.getText(com.android.internal.R.string.app_category_social);
1175 case ApplicationInfo.CATEGORY_NEWS:
1176 return context.getText(com.android.internal.R.string.app_category_news);
1177 case ApplicationInfo.CATEGORY_MAPS:
1178 return context.getText(com.android.internal.R.string.app_category_maps);
1179 case ApplicationInfo.CATEGORY_PRODUCTIVITY:
1180 return context.getText(com.android.internal.R.string.app_category_productivity);
1181 default:
1182 return null;
1183 }
1184 }
1185
Narayan Kamathf9419f02017-06-15 11:35:38 +01001186 /** @hide */
1187 public String classLoaderName;
1188
1189 /** @hide */
1190 public String[] splitClassLoaderNames;
1191
Rhed Jaocd47c262018-06-13 11:16:16 +08001192 /** @hide */
1193 public boolean hiddenUntilInstalled;
1194
Mathew Inwoode3299532018-02-22 13:19:53 +00001195 /**
1196 * Represents the default policy. The actual policy used will depend on other properties of
1197 * the application, e.g. the target SDK version.
1198 * @hide
1199 */
1200 public static final int HIDDEN_API_ENFORCEMENT_DEFAULT = -1;
1201 /**
1202 * No API enforcement; the app can access the entire internal private API. Only for use by
1203 * system apps.
1204 * @hide
1205 */
David Brazdil06ae4b82018-11-02 18:01:45 +00001206 public static final int HIDDEN_API_ENFORCEMENT_DISABLED = 0;
Mathew Inwoode3299532018-02-22 13:19:53 +00001207 /**
Mathew Inwooda6d02fb2018-04-05 15:44:20 +01001208 * No API enforcement, but enable the detection logic and warnings. Observed behaviour is the
David Brazdil06ae4b82018-11-02 18:01:45 +00001209 * same as {@link #HIDDEN_API_ENFORCEMENT_DISABLED} but you may see warnings in the log when
1210 * APIs are accessed.
Mathew Inwoode3299532018-02-22 13:19:53 +00001211 * @hide
1212 * */
Mathew Inwooda6d02fb2018-04-05 15:44:20 +01001213 public static final int HIDDEN_API_ENFORCEMENT_JUST_WARN = 1;
Mathew Inwoode3299532018-02-22 13:19:53 +00001214 /**
1215 * Dark grey list enforcement. Enforces the dark grey and black lists
1216 * @hide
1217 */
David Brazdil06ae4b82018-11-02 18:01:45 +00001218 public static final int HIDDEN_API_ENFORCEMENT_ENABLED = 2;
Mathew Inwoode3299532018-02-22 13:19:53 +00001219
David Brazdil06ae4b82018-11-02 18:01:45 +00001220 private static final int HIDDEN_API_ENFORCEMENT_MIN = HIDDEN_API_ENFORCEMENT_DEFAULT;
1221 private static final int HIDDEN_API_ENFORCEMENT_MAX = HIDDEN_API_ENFORCEMENT_ENABLED;
Mathew Inwoode3299532018-02-22 13:19:53 +00001222
1223 /**
1224 * Values in this IntDef MUST be kept in sync with enum hiddenapi::EnforcementPolicy in
1225 * art/runtime/hidden_api.h
1226 * @hide
1227 */
1228 @IntDef(prefix = { "HIDDEN_API_ENFORCEMENT_" }, value = {
1229 HIDDEN_API_ENFORCEMENT_DEFAULT,
David Brazdil06ae4b82018-11-02 18:01:45 +00001230 HIDDEN_API_ENFORCEMENT_DISABLED,
Mathew Inwooda6d02fb2018-04-05 15:44:20 +01001231 HIDDEN_API_ENFORCEMENT_JUST_WARN,
David Brazdil06ae4b82018-11-02 18:01:45 +00001232 HIDDEN_API_ENFORCEMENT_ENABLED,
Mathew Inwoode3299532018-02-22 13:19:53 +00001233 })
1234 @Retention(RetentionPolicy.SOURCE)
1235 public @interface HiddenApiEnforcementPolicy {}
1236
Mathew Inwood1ab30252018-04-03 14:47:26 +01001237 /** @hide */
1238 public static boolean isValidHiddenApiEnforcementPolicy(int policy) {
David Brazdil06ae4b82018-11-02 18:01:45 +00001239 return policy >= HIDDEN_API_ENFORCEMENT_MIN && policy <= HIDDEN_API_ENFORCEMENT_MAX;
Mathew Inwoode3299532018-02-22 13:19:53 +00001240 }
1241
1242 private int mHiddenApiPolicy = HIDDEN_API_ENFORCEMENT_DEFAULT;
1243
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001244 public void dump(Printer pw, String prefix) {
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001245 dump(pw, prefix, DUMP_FLAG_ALL);
1246 }
1247
1248 /** @hide */
Yohei Yukawa8f272172017-08-31 00:26:01 -07001249 public void dump(Printer pw, String prefix, int dumpFlags) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001250 super.dumpFront(pw, prefix);
Yohei Yukawa8f272172017-08-31 00:26:01 -07001251 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0 && className != null) {
Dianne Hackborn12527f92009-11-11 17:39:50 -08001252 pw.println(prefix + "className=" + className);
1253 }
1254 if (permission != null) {
1255 pw.println(prefix + "permission=" + permission);
1256 }
Dianne Hackborn39792d22010-08-19 18:01:52 -07001257 pw.println(prefix + "processName=" + processName);
Yohei Yukawa8f272172017-08-31 00:26:01 -07001258 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001259 pw.println(prefix + "taskAffinity=" + taskAffinity);
1260 }
Dianne Hackborn39792d22010-08-19 18:01:52 -07001261 pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags)
Alex Klyubinb9f8a522015-02-03 11:12:59 -08001262 + " privateFlags=0x" + Integer.toHexString(privateFlags)
Dianne Hackborn39792d22010-08-19 18:01:52 -07001263 + " theme=0x" + Integer.toHexString(theme));
Yohei Yukawa8f272172017-08-31 00:26:01 -07001264 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001265 pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp
1266 + " compatibleWidthLimitDp=" + compatibleWidthLimitDp
1267 + " largestWidthLimitDp=" + largestWidthLimitDp);
1268 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001269 pw.println(prefix + "sourceDir=" + sourceDir);
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001270 if (!Objects.equals(sourceDir, publicSourceDir)) {
Dianne Hackborn39792d22010-08-19 18:01:52 -07001271 pw.println(prefix + "publicSourceDir=" + publicSourceDir);
1272 }
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001273 if (!ArrayUtils.isEmpty(splitSourceDirs)) {
1274 pw.println(prefix + "splitSourceDirs=" + Arrays.toString(splitSourceDirs));
1275 }
1276 if (!ArrayUtils.isEmpty(splitPublicSourceDirs)
1277 && !Arrays.equals(splitSourceDirs, splitPublicSourceDirs)) {
1278 pw.println(prefix + "splitPublicSourceDirs=" + Arrays.toString(splitPublicSourceDirs));
1279 }
Dianne Hackborn39792d22010-08-19 18:01:52 -07001280 if (resourceDirs != null) {
Andreas Gampee6748ce2015-12-11 18:00:38 -08001281 pw.println(prefix + "resourceDirs=" + Arrays.toString(resourceDirs));
Dianne Hackborn39792d22010-08-19 18:01:52 -07001282 }
Yohei Yukawa8f272172017-08-31 00:26:01 -07001283 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0 && seInfo != null) {
Todd Kennedybe0b8892017-02-15 14:13:52 -08001284 pw.println(prefix + "seinfo=" + seInfo);
1285 pw.println(prefix + "seinfoUser=" + seInfoUser);
Robert Craig0f40dc92013-03-25 06:33:03 -04001286 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001287 pw.println(prefix + "dataDir=" + dataDir);
Yohei Yukawa8f272172017-08-31 00:26:01 -07001288 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001289 pw.println(prefix + "deviceProtectedDataDir=" + deviceProtectedDataDir);
1290 pw.println(prefix + "credentialProtectedDataDir=" + credentialProtectedDataDir);
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001291 if (sharedLibraryFiles != null) {
1292 pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles));
1293 }
Dianne Hackborn12527f92009-11-11 17:39:50 -08001294 }
Narayan Kamathf9419f02017-06-15 11:35:38 +01001295 if (classLoaderName != null) {
1296 pw.println(prefix + "classLoaderName=" + classLoaderName);
1297 }
1298 if (!ArrayUtils.isEmpty(splitClassLoaderNames)) {
1299 pw.println(prefix + "splitClassLoaderNames=" + Arrays.toString(splitClassLoaderNames));
1300 }
1301
Todd Kennedy89d60182016-03-11 11:18:32 -08001302 pw.println(prefix + "enabled=" + enabled
1303 + " minSdkVersion=" + minSdkVersion
1304 + " targetSdkVersion=" + targetSdkVersion
Patrick Baumannc2def582018-04-04 12:14:15 -07001305 + " versionCode=" + longVersionCode
Todd Kennedy11e45072017-01-25 13:24:21 -08001306 + " targetSandboxVersion=" + targetSandboxVersion);
Yohei Yukawa8f272172017-08-31 00:26:01 -07001307 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
Dianne Hackborn6ac42ae2015-12-08 17:22:10 -08001308 if (manageSpaceActivityName != null) {
1309 pw.println(prefix + "manageSpaceActivityName=" + manageSpaceActivityName);
1310 }
1311 if (descriptionRes != 0) {
1312 pw.println(prefix + "description=0x" + Integer.toHexString(descriptionRes));
1313 }
1314 if (uiOptions != 0) {
1315 pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions));
1316 }
1317 pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false"));
1318 if (fullBackupContent > 0) {
1319 pw.println(prefix + "fullBackupContent=@xml/" + fullBackupContent);
1320 } else {
1321 pw.println(prefix + "fullBackupContent="
1322 + (fullBackupContent < 0 ? "false" : "true"));
1323 }
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001324 if (networkSecurityConfigRes != 0) {
1325 pw.println(prefix + "networkSecurityConfigRes=0x"
1326 + Integer.toHexString(networkSecurityConfigRes));
1327 }
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001328 if (category != CATEGORY_UNDEFINED) {
1329 pw.println(prefix + "category=" + category);
1330 }
Mathew Inwoode3299532018-02-22 13:19:53 +00001331 pw.println(prefix + "HiddenApiEnforcementPolicy=" + getHiddenApiEnforcementPolicy());
David Brazdila5b4df22018-09-06 09:49:14 +01001332 pw.println(prefix + "usesNonSdkApi=" + usesNonSdkApi());
Matthew Williams303650c2015-04-17 18:22:51 -07001333 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001334 super.dumpBack(pw, prefix);
1335 }
Fabrice Di Meglio59dfce82012-04-02 16:17:20 -07001336
Yi Jin148d7f42017-11-28 14:23:56 -08001337 /** {@hide} */
1338 public void writeToProto(ProtoOutputStream proto, long fieldId, int dumpFlags) {
1339 long token = proto.start(fieldId);
Dianne Hackborn2f55e5a2018-11-30 16:31:31 -08001340 super.writeToProto(proto, ApplicationInfoProto.PACKAGE, dumpFlags);
Yi Jin148d7f42017-11-28 14:23:56 -08001341 proto.write(ApplicationInfoProto.PERMISSION, permission);
1342 proto.write(ApplicationInfoProto.PROCESS_NAME, processName);
1343 proto.write(ApplicationInfoProto.UID, uid);
1344 proto.write(ApplicationInfoProto.FLAGS, flags);
1345 proto.write(ApplicationInfoProto.PRIVATE_FLAGS, privateFlags);
1346 proto.write(ApplicationInfoProto.THEME, theme);
1347 proto.write(ApplicationInfoProto.SOURCE_DIR, sourceDir);
1348 if (!Objects.equals(sourceDir, publicSourceDir)) {
1349 proto.write(ApplicationInfoProto.PUBLIC_SOURCE_DIR, publicSourceDir);
1350 }
1351 if (!ArrayUtils.isEmpty(splitSourceDirs)) {
1352 for (String dir : splitSourceDirs) {
1353 proto.write(ApplicationInfoProto.SPLIT_SOURCE_DIRS, dir);
1354 }
1355 }
1356 if (!ArrayUtils.isEmpty(splitPublicSourceDirs)
1357 && !Arrays.equals(splitSourceDirs, splitPublicSourceDirs)) {
1358 for (String dir : splitPublicSourceDirs) {
1359 proto.write(ApplicationInfoProto.SPLIT_PUBLIC_SOURCE_DIRS, dir);
1360 }
1361 }
1362 if (resourceDirs != null) {
1363 for (String dir : resourceDirs) {
1364 proto.write(ApplicationInfoProto.RESOURCE_DIRS, dir);
1365 }
1366 }
1367 proto.write(ApplicationInfoProto.DATA_DIR, dataDir);
1368 proto.write(ApplicationInfoProto.CLASS_LOADER_NAME, classLoaderName);
1369 if (!ArrayUtils.isEmpty(splitClassLoaderNames)) {
1370 for (String name : splitClassLoaderNames) {
1371 proto.write(ApplicationInfoProto.SPLIT_CLASS_LOADER_NAMES, name);
1372 }
1373 }
1374
1375 long versionToken = proto.start(ApplicationInfoProto.VERSION);
1376 proto.write(ApplicationInfoProto.Version.ENABLED, enabled);
1377 proto.write(ApplicationInfoProto.Version.MIN_SDK_VERSION, minSdkVersion);
1378 proto.write(ApplicationInfoProto.Version.TARGET_SDK_VERSION, targetSdkVersion);
Patrick Baumannc2def582018-04-04 12:14:15 -07001379 proto.write(ApplicationInfoProto.Version.VERSION_CODE, longVersionCode);
Yi Jin148d7f42017-11-28 14:23:56 -08001380 proto.write(ApplicationInfoProto.Version.TARGET_SANDBOX_VERSION, targetSandboxVersion);
1381 proto.end(versionToken);
1382
1383 if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
1384 long detailToken = proto.start(ApplicationInfoProto.DETAIL);
1385 if (className != null) {
1386 proto.write(ApplicationInfoProto.Detail.CLASS_NAME, className);
1387 }
1388 proto.write(ApplicationInfoProto.Detail.TASK_AFFINITY, taskAffinity);
1389 proto.write(ApplicationInfoProto.Detail.REQUIRES_SMALLEST_WIDTH_DP,
1390 requiresSmallestWidthDp);
1391 proto.write(ApplicationInfoProto.Detail.COMPATIBLE_WIDTH_LIMIT_DP,
1392 compatibleWidthLimitDp);
1393 proto.write(ApplicationInfoProto.Detail.LARGEST_WIDTH_LIMIT_DP,
1394 largestWidthLimitDp);
1395 if (seInfo != null) {
1396 proto.write(ApplicationInfoProto.Detail.SEINFO, seInfo);
1397 proto.write(ApplicationInfoProto.Detail.SEINFO_USER, seInfoUser);
1398 }
1399 proto.write(ApplicationInfoProto.Detail.DEVICE_PROTECTED_DATA_DIR,
1400 deviceProtectedDataDir);
1401 proto.write(ApplicationInfoProto.Detail.CREDENTIAL_PROTECTED_DATA_DIR,
1402 credentialProtectedDataDir);
1403 if (sharedLibraryFiles != null) {
1404 for (String f : sharedLibraryFiles) {
1405 proto.write(ApplicationInfoProto.Detail.SHARED_LIBRARY_FILES, f);
1406 }
1407 }
1408 if (manageSpaceActivityName != null) {
1409 proto.write(ApplicationInfoProto.Detail.MANAGE_SPACE_ACTIVITY_NAME,
1410 manageSpaceActivityName);
1411 }
1412 if (descriptionRes != 0) {
1413 proto.write(ApplicationInfoProto.Detail.DESCRIPTION_RES, descriptionRes);
1414 }
1415 if (uiOptions != 0) {
1416 proto.write(ApplicationInfoProto.Detail.UI_OPTIONS, uiOptions);
1417 }
1418 proto.write(ApplicationInfoProto.Detail.SUPPORTS_RTL, hasRtlSupport());
1419 if (fullBackupContent > 0) {
1420 proto.write(ApplicationInfoProto.Detail.CONTENT, "@xml/" + fullBackupContent);
1421 } else {
1422 proto.write(ApplicationInfoProto.Detail.IS_FULL_BACKUP, fullBackupContent == 0);
1423 }
1424 if (networkSecurityConfigRes != 0) {
1425 proto.write(ApplicationInfoProto.Detail.NETWORK_SECURITY_CONFIG_RES,
1426 networkSecurityConfigRes);
1427 }
1428 if (category != CATEGORY_UNDEFINED) {
1429 proto.write(ApplicationInfoProto.Detail.CATEGORY, category);
1430 }
1431 proto.end(detailToken);
1432 }
1433 proto.end(token);
1434 }
1435
Fabrice Di Meglio59dfce82012-04-02 16:17:20 -07001436 /**
1437 * @return true if "supportsRtl" has been set to true in the AndroidManifest
1438 * @hide
1439 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +01001440 @UnsupportedAppUsage
Fabrice Di Meglio59dfce82012-04-02 16:17:20 -07001441 public boolean hasRtlSupport() {
1442 return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL;
1443 }
Jeff Sharkeyba75a9b2016-01-07 11:51:33 -07001444
1445 /** {@hide} */
1446 public boolean hasCode() {
1447 return (flags & FLAG_HAS_CODE) != 0;
1448 }
1449
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001450 public static class DisplayNameComparator
1451 implements Comparator<ApplicationInfo> {
1452 public DisplayNameComparator(PackageManager pm) {
1453 mPM = pm;
1454 }
1455
1456 public final int compare(ApplicationInfo aa, ApplicationInfo ab) {
1457 CharSequence sa = mPM.getApplicationLabel(aa);
1458 if (sa == null) {
1459 sa = aa.packageName;
1460 }
1461 CharSequence sb = mPM.getApplicationLabel(ab);
1462 if (sb == null) {
1463 sb = ab.packageName;
1464 }
1465
1466 return sCollator.compare(sa.toString(), sb.toString());
1467 }
1468
Mathew Inwood31755f92018-12-20 13:53:36 +00001469 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001470 private final Collator sCollator = Collator.getInstance();
Mathew Inwood31755f92018-12-20 13:53:36 +00001471 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001472 private PackageManager mPM;
1473 }
1474
1475 public ApplicationInfo() {
1476 }
1477
1478 public ApplicationInfo(ApplicationInfo orig) {
1479 super(orig);
1480 taskAffinity = orig.taskAffinity;
1481 permission = orig.permission;
1482 processName = orig.processName;
1483 className = orig.className;
1484 theme = orig.theme;
1485 flags = orig.flags;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08001486 privateFlags = orig.privateFlags;
Dianne Hackborndf6e9802011-05-26 14:20:23 -07001487 requiresSmallestWidthDp = orig.requiresSmallestWidthDp;
1488 compatibleWidthLimitDp = orig.compatibleWidthLimitDp;
Dianne Hackborn2762ff32011-06-01 21:27:05 -07001489 largestWidthLimitDp = orig.largestWidthLimitDp;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07001490 volumeUuid = orig.volumeUuid;
Jeff Sharkey789a8fc2017-04-16 13:18:35 -06001491 storageUuid = orig.storageUuid;
Jeff Sharkey7f1a57a2014-10-08 10:14:53 -07001492 scanSourceDir = orig.scanSourceDir;
1493 scanPublicSourceDir = orig.scanPublicSourceDir;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001494 sourceDir = orig.sourceDir;
1495 publicSourceDir = orig.publicSourceDir;
Adam Lesinski4e862812016-11-21 16:02:24 -08001496 splitNames = orig.splitNames;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001497 splitSourceDirs = orig.splitSourceDirs;
1498 splitPublicSourceDirs = orig.splitPublicSourceDirs;
Adam Lesinski4e862812016-11-21 16:02:24 -08001499 splitDependencies = orig.splitDependencies;
Kenny Root85387d72010-08-26 10:13:11 -07001500 nativeLibraryDir = orig.nativeLibraryDir;
Narayan Kamath7dba6eb2014-07-16 08:53:30 +01001501 secondaryNativeLibraryDir = orig.secondaryNativeLibraryDir;
Jeff Sharkey84f12942014-07-10 17:48:11 -07001502 nativeLibraryRootDir = orig.nativeLibraryRootDir;
1503 nativeLibraryRootRequiresIsa = orig.nativeLibraryRootRequiresIsa;
Narayan Kamathff110bd2014-07-04 18:30:45 +01001504 primaryCpuAbi = orig.primaryCpuAbi;
1505 secondaryCpuAbi = orig.secondaryCpuAbi;
Kenny Rootd1ab0162010-01-21 17:27:14 -08001506 resourceDirs = orig.resourceDirs;
Todd Kennedybe0b8892017-02-15 14:13:52 -08001507 seInfo = orig.seInfo;
1508 seInfoUser = orig.seInfoUser;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001509 sharedLibraryFiles = orig.sharedLibraryFiles;
Nicolas Geoffray8d144eb2018-11-15 12:59:52 +00001510 sharedLibraryInfos = orig.sharedLibraryInfos;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001511 dataDir = orig.dataDir;
Jeff Sharkeydd9bda82017-02-23 17:38:31 -07001512 deviceProtectedDataDir = orig.deviceProtectedDataDir;
1513 credentialProtectedDataDir = orig.credentialProtectedDataDir;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001514 uid = orig.uid;
Todd Kennedy89d60182016-03-11 11:18:32 -08001515 minSdkVersion = orig.minSdkVersion;
Dianne Hackborna96cbb42009-05-13 15:06:13 -07001516 targetSdkVersion = orig.targetSdkVersion;
Patrick Baumannc2def582018-04-04 12:14:15 -07001517 setVersionCode(orig.longVersionCode);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001518 enabled = orig.enabled;
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001519 enabledSetting = orig.enabledSetting;
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001520 installLocation = orig.installLocation;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001521 manageSpaceActivityName = orig.manageSpaceActivityName;
1522 descriptionRes = orig.descriptionRes;
Adam Powell269248d2011-08-02 10:26:54 -07001523 uiOptions = orig.uiOptions;
Christopher Tatebcb02552012-10-16 17:14:34 -07001524 backupAgentName = orig.backupAgentName;
Matthew Williams303650c2015-04-17 18:22:51 -07001525 fullBackupContent = orig.fullBackupContent;
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001526 networkSecurityConfigRes = orig.networkSecurityConfigRes;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001527 category = orig.category;
Todd Kennedy11e45072017-01-25 13:24:21 -08001528 targetSandboxVersion = orig.targetSandboxVersion;
Narayan Kamathf9419f02017-06-15 11:35:38 +01001529 classLoaderName = orig.classLoaderName;
1530 splitClassLoaderNames = orig.splitClassLoaderNames;
Jason Monka80bfb52017-11-16 17:15:37 -05001531 appComponentFactory = orig.appComponentFactory;
Adam Lesinskid3ea00992018-02-20 16:51:13 -08001532 compileSdkVersion = orig.compileSdkVersion;
1533 compileSdkVersionCodename = orig.compileSdkVersionCodename;
Mathew Inwoode3299532018-02-22 13:19:53 +00001534 mHiddenApiPolicy = orig.mHiddenApiPolicy;
Rhed Jaocd47c262018-06-13 11:16:16 +08001535 hiddenUntilInstalled = orig.hiddenUntilInstalled;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001536 }
1537
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001538 public String toString() {
1539 return "ApplicationInfo{"
1540 + Integer.toHexString(System.identityHashCode(this))
1541 + " " + packageName + "}";
1542 }
1543
1544 public int describeContents() {
1545 return 0;
1546 }
1547
Adam Lesinski4e862812016-11-21 16:02:24 -08001548 @SuppressWarnings("unchecked")
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001549 public void writeToParcel(Parcel dest, int parcelableFlags) {
1550 super.writeToParcel(dest, parcelableFlags);
1551 dest.writeString(taskAffinity);
1552 dest.writeString(permission);
1553 dest.writeString(processName);
1554 dest.writeString(className);
1555 dest.writeInt(theme);
1556 dest.writeInt(flags);
Alex Klyubinb9f8a522015-02-03 11:12:59 -08001557 dest.writeInt(privateFlags);
Dianne Hackborndf6e9802011-05-26 14:20:23 -07001558 dest.writeInt(requiresSmallestWidthDp);
1559 dest.writeInt(compatibleWidthLimitDp);
Dianne Hackborn2762ff32011-06-01 21:27:05 -07001560 dest.writeInt(largestWidthLimitDp);
Jeff Sharkey67c8c1e2017-04-19 11:22:02 -06001561 if (storageUuid != null) {
1562 dest.writeInt(1);
Jeff Sharkeya4d34d92017-04-27 11:21:41 -06001563 dest.writeLong(storageUuid.getMostSignificantBits());
1564 dest.writeLong(storageUuid.getLeastSignificantBits());
Jeff Sharkey67c8c1e2017-04-19 11:22:02 -06001565 } else {
1566 dest.writeInt(0);
1567 }
Jeff Sharkey7f1a57a2014-10-08 10:14:53 -07001568 dest.writeString(scanSourceDir);
1569 dest.writeString(scanPublicSourceDir);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001570 dest.writeString(sourceDir);
1571 dest.writeString(publicSourceDir);
Adam Lesinski4e862812016-11-21 16:02:24 -08001572 dest.writeStringArray(splitNames);
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001573 dest.writeStringArray(splitSourceDirs);
1574 dest.writeStringArray(splitPublicSourceDirs);
Adam Lesinski1665d0f2017-03-10 14:46:57 -08001575 dest.writeSparseArray((SparseArray) splitDependencies);
Kenny Root85387d72010-08-26 10:13:11 -07001576 dest.writeString(nativeLibraryDir);
Narayan Kamath7dba6eb2014-07-16 08:53:30 +01001577 dest.writeString(secondaryNativeLibraryDir);
Jeff Sharkey84f12942014-07-10 17:48:11 -07001578 dest.writeString(nativeLibraryRootDir);
1579 dest.writeInt(nativeLibraryRootRequiresIsa ? 1 : 0);
Narayan Kamathff110bd2014-07-04 18:30:45 +01001580 dest.writeString(primaryCpuAbi);
1581 dest.writeString(secondaryCpuAbi);
Kenny Rootd1ab0162010-01-21 17:27:14 -08001582 dest.writeStringArray(resourceDirs);
Todd Kennedybe0b8892017-02-15 14:13:52 -08001583 dest.writeString(seInfo);
1584 dest.writeString(seInfoUser);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001585 dest.writeStringArray(sharedLibraryFiles);
Nicolas Geoffray8d144eb2018-11-15 12:59:52 +00001586 dest.writeTypedList(sharedLibraryInfos);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001587 dest.writeString(dataDir);
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001588 dest.writeString(deviceProtectedDataDir);
1589 dest.writeString(credentialProtectedDataDir);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001590 dest.writeInt(uid);
Todd Kennedy6e2e7f52016-05-02 14:56:45 -07001591 dest.writeInt(minSdkVersion);
Dianne Hackborna96cbb42009-05-13 15:06:13 -07001592 dest.writeInt(targetSdkVersion);
Patrick Baumannc2def582018-04-04 12:14:15 -07001593 dest.writeLong(longVersionCode);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001594 dest.writeInt(enabled ? 1 : 0);
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001595 dest.writeInt(enabledSetting);
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001596 dest.writeInt(installLocation);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001597 dest.writeString(manageSpaceActivityName);
Christopher Tate181fafa2009-05-14 11:12:14 -07001598 dest.writeString(backupAgentName);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001599 dest.writeInt(descriptionRes);
Adam Powell269248d2011-08-02 10:26:54 -07001600 dest.writeInt(uiOptions);
Matthew Williams303650c2015-04-17 18:22:51 -07001601 dest.writeInt(fullBackupContent);
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001602 dest.writeInt(networkSecurityConfigRes);
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001603 dest.writeInt(category);
Todd Kennedy11e45072017-01-25 13:24:21 -08001604 dest.writeInt(targetSandboxVersion);
Narayan Kamathf9419f02017-06-15 11:35:38 +01001605 dest.writeString(classLoaderName);
1606 dest.writeStringArray(splitClassLoaderNames);
Alan Viveretteb6a25732017-11-21 14:49:24 -05001607 dest.writeInt(compileSdkVersion);
1608 dest.writeString(compileSdkVersionCodename);
Jason Monka80bfb52017-11-16 17:15:37 -05001609 dest.writeString(appComponentFactory);
Mathew Inwoode3299532018-02-22 13:19:53 +00001610 dest.writeInt(mHiddenApiPolicy);
Rhed Jaocd47c262018-06-13 11:16:16 +08001611 dest.writeInt(hiddenUntilInstalled ? 1 : 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001612 }
1613
1614 public static final Parcelable.Creator<ApplicationInfo> CREATOR
1615 = new Parcelable.Creator<ApplicationInfo>() {
1616 public ApplicationInfo createFromParcel(Parcel source) {
1617 return new ApplicationInfo(source);
1618 }
1619 public ApplicationInfo[] newArray(int size) {
1620 return new ApplicationInfo[size];
1621 }
1622 };
1623
Adam Lesinski4e862812016-11-21 16:02:24 -08001624 @SuppressWarnings("unchecked")
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001625 private ApplicationInfo(Parcel source) {
1626 super(source);
1627 taskAffinity = source.readString();
1628 permission = source.readString();
1629 processName = source.readString();
1630 className = source.readString();
1631 theme = source.readInt();
1632 flags = source.readInt();
Alex Klyubinb9f8a522015-02-03 11:12:59 -08001633 privateFlags = source.readInt();
Dianne Hackborndf6e9802011-05-26 14:20:23 -07001634 requiresSmallestWidthDp = source.readInt();
1635 compatibleWidthLimitDp = source.readInt();
Dianne Hackborn2762ff32011-06-01 21:27:05 -07001636 largestWidthLimitDp = source.readInt();
Jeff Sharkey67c8c1e2017-04-19 11:22:02 -06001637 if (source.readInt() != 0) {
Jeff Sharkeya4d34d92017-04-27 11:21:41 -06001638 storageUuid = new UUID(source.readLong(), source.readLong());
Jeff Sharkey67c8c1e2017-04-19 11:22:02 -06001639 volumeUuid = StorageManager.convert(storageUuid);
1640 }
Jeff Sharkey7f1a57a2014-10-08 10:14:53 -07001641 scanSourceDir = source.readString();
1642 scanPublicSourceDir = source.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001643 sourceDir = source.readString();
1644 publicSourceDir = source.readString();
Adam Lesinski4e862812016-11-21 16:02:24 -08001645 splitNames = source.readStringArray();
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001646 splitSourceDirs = source.readStringArray();
1647 splitPublicSourceDirs = source.readStringArray();
Adam Lesinski1665d0f2017-03-10 14:46:57 -08001648 splitDependencies = source.readSparseArray(null);
Kenny Root85387d72010-08-26 10:13:11 -07001649 nativeLibraryDir = source.readString();
Narayan Kamath7dba6eb2014-07-16 08:53:30 +01001650 secondaryNativeLibraryDir = source.readString();
Jeff Sharkey84f12942014-07-10 17:48:11 -07001651 nativeLibraryRootDir = source.readString();
1652 nativeLibraryRootRequiresIsa = source.readInt() != 0;
Narayan Kamathff110bd2014-07-04 18:30:45 +01001653 primaryCpuAbi = source.readString();
1654 secondaryCpuAbi = source.readString();
Kenny Rootd1ab0162010-01-21 17:27:14 -08001655 resourceDirs = source.readStringArray();
Todd Kennedybe0b8892017-02-15 14:13:52 -08001656 seInfo = source.readString();
1657 seInfoUser = source.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001658 sharedLibraryFiles = source.readStringArray();
Nicolas Geoffray8d144eb2018-11-15 12:59:52 +00001659 sharedLibraryInfos = source.createTypedArrayList(SharedLibraryInfo.CREATOR);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001660 dataDir = source.readString();
Jeff Sharkeydd9bda82017-02-23 17:38:31 -07001661 deviceProtectedDataDir = source.readString();
1662 credentialProtectedDataDir = source.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001663 uid = source.readInt();
Todd Kennedy6e2e7f52016-05-02 14:56:45 -07001664 minSdkVersion = source.readInt();
Dianne Hackborna96cbb42009-05-13 15:06:13 -07001665 targetSdkVersion = source.readInt();
Patrick Baumannc2def582018-04-04 12:14:15 -07001666 setVersionCode(source.readLong());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001667 enabled = source.readInt() != 0;
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001668 enabledSetting = source.readInt();
Dianne Hackborn54e570f2010-10-04 18:32:32 -07001669 installLocation = source.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001670 manageSpaceActivityName = source.readString();
Christopher Tate181fafa2009-05-14 11:12:14 -07001671 backupAgentName = source.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001672 descriptionRes = source.readInt();
Adam Powell269248d2011-08-02 10:26:54 -07001673 uiOptions = source.readInt();
Matthew Williams303650c2015-04-17 18:22:51 -07001674 fullBackupContent = source.readInt();
Chad Brubakerc845b2a2016-05-13 14:09:27 -07001675 networkSecurityConfigRes = source.readInt();
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07001676 category = source.readInt();
Todd Kennedy11e45072017-01-25 13:24:21 -08001677 targetSandboxVersion = source.readInt();
Narayan Kamathf9419f02017-06-15 11:35:38 +01001678 classLoaderName = source.readString();
1679 splitClassLoaderNames = source.readStringArray();
Alan Viveretteb6a25732017-11-21 14:49:24 -05001680 compileSdkVersion = source.readInt();
1681 compileSdkVersionCodename = source.readString();
Jason Monka80bfb52017-11-16 17:15:37 -05001682 appComponentFactory = source.readString();
Mathew Inwoode3299532018-02-22 13:19:53 +00001683 mHiddenApiPolicy = source.readInt();
Rhed Jaocd47c262018-06-13 11:16:16 +08001684 hiddenUntilInstalled = source.readInt() != 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001685 }
Mitsuru Oshima8d112672009-04-27 12:01:23 -07001686
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001687 /**
1688 * Retrieve the textual description of the application. This
1689 * will call back on the given PackageManager to load the description from
1690 * the application.
1691 *
1692 * @param pm A PackageManager from which the label can be loaded; usually
1693 * the PackageManager from which you originally retrieved this item.
1694 *
1695 * @return Returns a CharSequence containing the application's description.
1696 * If there is no description, null is returned.
1697 */
1698 public CharSequence loadDescription(PackageManager pm) {
1699 if (descriptionRes != 0) {
Jeff Brown07330792010-03-30 19:57:08 -07001700 CharSequence label = pm.getText(packageName, descriptionRes, this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001701 if (label != null) {
1702 return label;
1703 }
1704 }
1705 return null;
1706 }
Mitsuru Oshimae5fb3282009-06-09 21:16:08 -07001707
1708 /**
1709 * Disable compatibility mode
1710 *
1711 * @hide
1712 */
Mathew Inwood31755f92018-12-20 13:53:36 +00001713 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Mitsuru Oshimae5fb3282009-06-09 21:16:08 -07001714 public void disableCompatibilityMode() {
Mitsuru Oshima69fff4a2009-07-21 09:51:05 -07001715 flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
Dianne Hackborn11b822d2009-07-21 20:03:02 -07001716 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
Dianne Hackborn14cee9f2010-04-23 17:51:26 -07001717 FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS);
Mitsuru Oshimae5fb3282009-06-09 21:16:08 -07001718 }
Jeff Sharkey15447792015-11-05 16:18:51 -08001719
skuhne@google.com7e85eb02017-01-04 13:49:54 -08001720 /**
1721 * Is using compatibility mode for non densty aware legacy applications.
1722 *
1723 * @hide
1724 */
1725 public boolean usesCompatibilityMode() {
1726 return targetSdkVersion < DONUT ||
1727 (flags & (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
1728 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
1729 FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS)) == 0;
1730 }
1731
Jeff Sharkey15447792015-11-05 16:18:51 -08001732 /** {@hide} */
1733 public void initForUser(int userId) {
1734 uid = UserHandle.getUid(userId, UserHandle.getAppId(uid));
1735
1736 if ("android".equals(packageName)) {
1737 dataDir = Environment.getDataSystemDirectory().getAbsolutePath();
1738 return;
1739 }
1740
Jeff Sharkeydd9bda82017-02-23 17:38:31 -07001741 deviceProtectedDataDir = Environment
Jeff Sharkey8212ae02016-02-10 14:46:43 -07001742 .getDataUserDePackageDirectory(volumeUuid, userId, packageName)
Jeff Sharkey15447792015-11-05 16:18:51 -08001743 .getAbsolutePath();
Jeff Sharkeydd9bda82017-02-23 17:38:31 -07001744 credentialProtectedDataDir = Environment
Jeff Sharkey8212ae02016-02-10 14:46:43 -07001745 .getDataUserCePackageDirectory(volumeUuid, userId, packageName)
Jeff Sharkey15447792015-11-05 16:18:51 -08001746 .getAbsolutePath();
1747
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001748 if ((privateFlags & PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0
1749 && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) {
1750 dataDir = deviceProtectedDataDir;
Jeff Sharkey15447792015-11-05 16:18:51 -08001751 } else {
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001752 dataDir = credentialProtectedDataDir;
Jeff Sharkey15447792015-11-05 16:18:51 -08001753 }
1754 }
1755
Mathew Inwoode3299532018-02-22 13:19:53 +00001756 private boolean isPackageWhitelistedForHiddenApis() {
1757 return SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
1758 }
1759
David Brazdila5b4df22018-09-06 09:49:14 +01001760 /**
1761 * @hide
1762 */
1763 public boolean usesNonSdkApi() {
1764 return (privateFlags & PRIVATE_FLAG_USES_NON_SDK_API) != 0;
1765 }
1766
Philip P. Moltmannae4a4b92018-12-12 11:28:57 -08001767 /**
1768 * Whether an app needs to keep the app data on uninstall.
1769 *
1770 * @return {@code true} if the app indicates that it needs to keep the app data
1771 *
1772 * @hide
1773 */
1774 public boolean hasFragileUserData() {
1775 return (privateFlags & PRIVATE_FLAG_HAS_FRAGILE_USER_DATA) != 0;
1776 }
1777
Mathew Inwood9d895432018-04-04 16:08:21 +01001778 private boolean isAllowedToUseHiddenApis() {
David Brazdil787b6f22a2018-08-28 12:55:56 +01001779 if (isSignedWithPlatformKey()) {
1780 return true;
1781 } else if (isSystemApp() || isUpdatedSystemApp()) {
David Brazdila5b4df22018-09-06 09:49:14 +01001782 return usesNonSdkApi() || isPackageWhitelistedForHiddenApis();
David Brazdil787b6f22a2018-08-28 12:55:56 +01001783 } else {
1784 return false;
1785 }
Mathew Inwood9d895432018-04-04 16:08:21 +01001786 }
1787
Jeff Brown07330792010-03-30 19:57:08 -07001788 /**
1789 * @hide
1790 */
Mathew Inwoode3299532018-02-22 13:19:53 +00001791 public @HiddenApiEnforcementPolicy int getHiddenApiEnforcementPolicy() {
Mathew Inwood9d895432018-04-04 16:08:21 +01001792 if (isAllowedToUseHiddenApis()) {
David Brazdil06ae4b82018-11-02 18:01:45 +00001793 return HIDDEN_API_ENFORCEMENT_DISABLED;
Mathew Inwoode3299532018-02-22 13:19:53 +00001794 }
Mathew Inwood1ab30252018-04-03 14:47:26 +01001795 if (mHiddenApiPolicy != HIDDEN_API_ENFORCEMENT_DEFAULT) {
1796 return mHiddenApiPolicy;
1797 }
David Brazdil06ae4b82018-11-02 18:01:45 +00001798 return HIDDEN_API_ENFORCEMENT_ENABLED;
Mathew Inwoode3299532018-02-22 13:19:53 +00001799 }
1800
1801 /**
1802 * @hide
1803 */
1804 public void setHiddenApiEnforcementPolicy(@HiddenApiEnforcementPolicy int policy) {
1805 if (!isValidHiddenApiEnforcementPolicy(policy)) {
1806 throw new IllegalArgumentException("Invalid API enforcement policy: " + policy);
1807 }
1808 mHiddenApiPolicy = policy;
David Brazdil464ed3d2018-01-18 15:25:18 +00001809 }
1810
1811 /**
Mathew Inwood1ab30252018-04-03 14:47:26 +01001812 * Updates the hidden API enforcement policy for this app from the given values, if appropriate.
1813 *
1814 * This will have no effect if this app is not subject to hidden API enforcement, i.e. if it
1815 * is on the package whitelist.
1816 *
David Brazdil06ae4b82018-11-02 18:01:45 +00001817 * @param policy configured policy for this app, or {@link #HIDDEN_API_ENFORCEMENT_DEFAULT}
David Brazdil5cd148f2018-11-01 09:54:25 +00001818 * if nothing configured.
Mathew Inwood1ab30252018-04-03 14:47:26 +01001819 * @hide
1820 */
David Brazdil06ae4b82018-11-02 18:01:45 +00001821 public void maybeUpdateHiddenApiEnforcementPolicy(@HiddenApiEnforcementPolicy int policy) {
Mathew Inwood1ab30252018-04-03 14:47:26 +01001822 if (isPackageWhitelistedForHiddenApis()) {
1823 return;
1824 }
David Brazdil06ae4b82018-11-02 18:01:45 +00001825 setHiddenApiEnforcementPolicy(policy);
Mathew Inwood1ab30252018-04-03 14:47:26 +01001826 }
1827
1828 /**
David Brazdil464ed3d2018-01-18 15:25:18 +00001829 * @hide
1830 */
Patrick Baumannc2def582018-04-04 12:14:15 -07001831 public void setVersionCode(long newVersionCode) {
1832 longVersionCode = newVersionCode;
1833 versionCode = (int) newVersionCode;
1834 }
1835
1836 /**
1837 * @hide
1838 */
Alexandra Gherghinaa7093142014-07-30 13:43:39 +01001839 @Override
1840 public Drawable loadDefaultIcon(PackageManager pm) {
Jeff Brown07330792010-03-30 19:57:08 -07001841 if ((flags & FLAG_EXTERNAL_STORAGE) != 0
1842 && isPackageUnavailable(pm)) {
1843 return Resources.getSystem().getDrawable(
1844 com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon);
1845 }
1846 return pm.getDefaultActivityIcon();
1847 }
1848
Mathew Inwood31755f92018-12-20 13:53:36 +00001849 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Jeff Brown07330792010-03-30 19:57:08 -07001850 private boolean isPackageUnavailable(PackageManager pm) {
1851 try {
1852 return pm.getPackageInfo(packageName, 0) == null;
1853 } catch (NameNotFoundException ex) {
1854 return true;
1855 }
1856 }
Jeff Sharkeyd7460572014-07-06 20:44:55 -07001857
Jeff Sharkeyf9fc6d62015-11-08 16:46:05 -08001858 /** @hide */
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001859 public boolean isDefaultToDeviceProtectedStorage() {
1860 return (privateFlags
1861 & ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0;
Jeff Sharkeye4697132016-02-06 19:46:15 -07001862 }
1863
1864 /** @hide */
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001865 public boolean isDirectBootAware() {
1866 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE) != 0;
Jeff Sharkeyf9fc6d62015-11-08 16:46:05 -08001867 }
1868
Hai Zhang14ea9ef2019-01-10 14:56:06 -08001869 /**
1870 * Check whether the application is encryption aware.
1871 *
1872 * @see #isDirectBootAware()
1873 * @see #isPartiallyDirectBootAware()
1874 *
1875 * @hide
1876 */
1877 @SystemApi
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001878 public boolean isEncryptionAware() {
1879 return isDirectBootAware() || isPartiallyDirectBootAware();
1880 }
1881
1882 /** @hide */
1883 public boolean isExternal() {
1884 return (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0;
1885 }
1886
Patrick Baumann159cd022018-01-11 13:25:05 -08001887 /**
1888 * True if the application is installed as an instant app.
1889 * @hide
1890 */
1891 @SystemApi
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001892 public boolean isInstantApp() {
1893 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
1894 }
1895
1896 /** @hide */
1897 public boolean isInternal() {
1898 return (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0;
1899 }
1900
1901 /** @hide */
1902 public boolean isOem() {
1903 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
1904 }
1905
1906 /** @hide */
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001907 public boolean isPartiallyDirectBootAware() {
1908 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE) != 0;
Jeff Sharkey8924e872015-11-30 12:52:10 -07001909 }
1910
Bryce Lee8558ec72017-08-17 15:37:26 -07001911 /** @hide */
Mathew Inwood9d895432018-04-04 16:08:21 +01001912 public boolean isSignedWithPlatformKey() {
1913 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY) != 0;
1914 }
1915
1916 /** @hide */
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001917 @TestApi
1918 public boolean isPrivilegedApp() {
1919 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
Bryce Lee8558ec72017-08-17 15:37:26 -07001920 }
1921
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001922 /** @hide */
Fyodor Kupolovbdbc9692015-12-14 13:11:13 -08001923 public boolean isRequiredForSystemUser() {
1924 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER) != 0;
1925 }
1926
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001927 /** @hide */
Svet Ganov67882122016-12-11 16:36:34 -08001928 public boolean isStaticSharedLibrary() {
1929 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY) != 0;
1930 }
1931
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001932 /** @hide */
1933 @TestApi
1934 public boolean isSystemApp() {
1935 return (flags & ApplicationInfo.FLAG_SYSTEM) != 0;
1936 }
1937
1938 /** @hide */
1939 public boolean isUpdatedSystemApp() {
1940 return (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
1941 }
1942
Jiyong Park002fdbd2017-02-13 20:50:31 +09001943 /** @hide */
1944 public boolean isVendor() {
1945 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
1946 }
1947
Jaekyun Seok1713d9e2018-01-12 21:47:26 +09001948 /** @hide */
1949 public boolean isProduct() {
1950 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
1951 }
1952
Dario Freni2bef1762018-06-01 14:02:08 +01001953 /** @hide */
1954 public boolean isProductServices() {
1955 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT_SERVICES) != 0;
1956 }
1957
Victor Hsiehf12af2f2019-01-03 10:11:03 -08001958 /** @hide */
1959 public boolean isCodeIntegrityPreferred() {
1960 return (privateFlags & PRIVATE_FLAG_PREFER_CODE_INTEGRITY) != 0;
1961 }
1962
Svet Ganov67882122016-12-11 16:36:34 -08001963 /**
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07001964 * Returns whether or not this application was installed as a virtual preload.
1965 */
1966 public boolean isVirtualPreload() {
1967 return (privateFlags & PRIVATE_FLAG_VIRTUAL_PRELOAD) != 0;
1968 }
1969
1970 /**
Chris Craikce030282018-10-16 14:33:11 -07001971 * Returns whether or not this application can be profiled by the shell user,
1972 * even when running on a device that is running in user mode.
1973 */
1974 public boolean isProfileableByShell() {
1975 return (privateFlags & PRIVATE_FLAG_PROFILEABLE_BY_SHELL) != 0;
1976 }
1977
1978 /**
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001979 * Returns true if the app has declared in its manifest that it wants its split APKs to be
1980 * loaded into isolated Contexts, with their own ClassLoaders and Resources objects.
Svet Ganov67882122016-12-11 16:36:34 -08001981 * @hide
1982 */
Todd Kennedyc29b11a2017-10-23 15:55:59 -07001983 public boolean requestsIsolatedSplitLoading() {
1984 return (privateFlags & ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING) != 0;
Svet Ganov087dce22017-09-07 15:42:16 -07001985 }
1986
1987 /**
1988 * @hide
1989 */
Jeff Brown07330792010-03-30 19:57:08 -07001990 @Override protected ApplicationInfo getApplicationInfo() {
1991 return this;
1992 }
Jeff Sharkeyd7460572014-07-06 20:44:55 -07001993
1994 /** {@hide} */ public void setCodePath(String codePath) { scanSourceDir = codePath; }
1995 /** {@hide} */ public void setBaseCodePath(String baseCodePath) { sourceDir = baseCodePath; }
1996 /** {@hide} */ public void setSplitCodePaths(String[] splitCodePaths) { splitSourceDirs = splitCodePaths; }
1997 /** {@hide} */ public void setResourcePath(String resourcePath) { scanPublicSourceDir = resourcePath; }
1998 /** {@hide} */ public void setBaseResourcePath(String baseResourcePath) { publicSourceDir = baseResourcePath; }
1999 /** {@hide} */ public void setSplitResourcePaths(String[] splitResourcePaths) { splitPublicSourceDirs = splitResourcePaths; }
2000
Mathew Inwood5c0d3542018-08-14 13:54:31 +01002001 /** {@hide} */
2002 @UnsupportedAppUsage
2003 public String getCodePath() { return scanSourceDir; }
Jeff Sharkeyd7460572014-07-06 20:44:55 -07002004 /** {@hide} */ public String getBaseCodePath() { return sourceDir; }
2005 /** {@hide} */ public String[] getSplitCodePaths() { return splitSourceDirs; }
2006 /** {@hide} */ public String getResourcePath() { return scanPublicSourceDir; }
Mathew Inwood5c0d3542018-08-14 13:54:31 +01002007 /** {@hide} */
2008 @UnsupportedAppUsage
2009 public String getBaseResourcePath() { return publicSourceDir; }
Jeff Sharkeya3a43b02016-11-15 17:54:23 -07002010 /** {@hide} */ public String[] getSplitResourcePaths() { return splitPublicSourceDirs; }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002011}