blob: 27a5b392855eefc9bec443551b6a29fb43ae1a74 [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
Alan Viveretteb6a25732017-11-21 14:49:24 -050019import android.annotation.Nullable;
Mathew Inwood5c0d3542018-08-14 13:54:31 +010020import android.annotation.UnsupportedAppUsage;
Mathew Inwood31755f92018-12-20 13:53:36 +000021import android.os.Build;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080022import android.os.Parcel;
23import android.os.Parcelable;
24
25/**
26 * Overall information about the contents of a package. This corresponds
27 * to all of the information collected from AndroidManifest.xml.
28 */
29public class PackageInfo implements Parcelable {
30 /**
31 * The name of this package. From the <manifest> tag's "name"
32 * attribute.
33 */
34 public String packageName;
35
36 /**
Jeff Sharkey6c833e02014-07-14 22:44:30 -070037 * The names of any installed split APKs for this package.
38 */
39 public String[] splitNames;
40
41 /**
Dianne Hackborn3accca02013-09-20 09:32:11 -070042 * @deprecated Use {@link #getLongVersionCode()} instead, which includes both
43 * this and the additional
44 * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} attribute.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045 * The version number of this package, as specified by the <manifest>
46 * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCode}
47 * attribute.
Dianne Hackborn3accca02013-09-20 09:32:11 -070048 * @see #getLongVersionCode()
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080049 */
Dianne Hackborn3accca02013-09-20 09:32:11 -070050 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080051 public int versionCode;
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -080052
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080053 /**
Dianne Hackborn3accca02013-09-20 09:32:11 -070054 * @hide
55 * The major version number of this package, as specified by the <manifest>
56 * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCodeMajor}
57 * attribute.
58 * @see #getLongVersionCode()
59 */
60 public int versionCodeMajor;
61
62 /**
63 * Return {@link android.R.styleable#AndroidManifest_versionCode versionCode} and
64 * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} combined
65 * together as a single long value. The
66 * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} is placed in
67 * the upper 32 bits.
68 */
69 public long getLongVersionCode() {
70 return composeLongVersionCode(versionCodeMajor, versionCode);
71 }
72
73 /**
74 * Set the full version code in this PackageInfo, updating {@link #versionCode}
75 * with the lower bits.
76 * @see #getLongVersionCode()
77 */
78 public void setLongVersionCode(long longVersionCode) {
79 versionCodeMajor = (int) (longVersionCode>>32);
80 versionCode = (int) longVersionCode;
81 }
82
83 /**
84 * @hide Internal implementation for composing a minor and major version code in to
85 * a single long version code.
86 */
87 public static long composeLongVersionCode(int major, int minor) {
88 return (((long) major) << 32) | (((long) minor) & 0xffffffffL);
89 }
90
91 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080092 * The version name of this package, as specified by the &lt;manifest&gt;
93 * tag's {@link android.R.styleable#AndroidManifest_versionName versionName}
94 * attribute.
95 */
96 public String versionName;
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -080097
98 /**
99 * The revision number of the base APK for this package, as specified by the
100 * &lt;manifest&gt; tag's
101 * {@link android.R.styleable#AndroidManifest_revisionCode revisionCode}
102 * attribute.
103 */
104 public int baseRevisionCode;
105
106 /**
107 * The revision number of any split APKs for this package, as specified by
108 * the &lt;manifest&gt; tag's
109 * {@link android.R.styleable#AndroidManifest_revisionCode revisionCode}
110 * attribute. Indexes are a 1:1 mapping against {@link #splitNames}.
111 */
112 public int[] splitRevisionCodes;
113
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800114 /**
115 * The shared user ID name of this package, as specified by the &lt;manifest&gt;
116 * tag's {@link android.R.styleable#AndroidManifest_sharedUserId sharedUserId}
117 * attribute.
118 */
119 public String sharedUserId;
120
121 /**
122 * The shared user ID label of this package, as specified by the &lt;manifest&gt;
123 * tag's {@link android.R.styleable#AndroidManifest_sharedUserLabel sharedUserLabel}
124 * attribute.
125 */
126 public int sharedUserLabel;
127
128 /**
129 * Information collected from the &lt;application&gt; tag, or null if
130 * there was none.
131 */
132 public ApplicationInfo applicationInfo;
133
134 /**
Dianne Hackborn78d6883692010-10-07 01:12:46 -0700135 * The time at which the app was first installed. Units are as
136 * per {@link System#currentTimeMillis()}.
137 */
138 public long firstInstallTime;
139
140 /**
141 * The time at which the app was last updated. Units are as
142 * per {@link System#currentTimeMillis()}.
143 */
144 public long lastUpdateTime;
145
146 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800147 * All kernel group-IDs that have been assigned to this package.
148 * This is only filled in if the flag {@link PackageManager#GET_GIDS} was set.
149 */
150 public int[] gids;
151
152 /**
153 * Array of all {@link android.R.styleable#AndroidManifestActivity
154 * &lt;activity&gt;} tags included under &lt;application&gt;,
155 * or null if there were none. This is only filled in if the flag
156 * {@link PackageManager#GET_ACTIVITIES} was set.
157 */
158 public ActivityInfo[] activities;
159
160 /**
161 * Array of all {@link android.R.styleable#AndroidManifestReceiver
162 * &lt;receiver&gt;} tags included under &lt;application&gt;,
163 * or null if there were none. This is only filled in if the flag
164 * {@link PackageManager#GET_RECEIVERS} was set.
165 */
166 public ActivityInfo[] receivers;
167
168 /**
169 * Array of all {@link android.R.styleable#AndroidManifestService
170 * &lt;service&gt;} tags included under &lt;application&gt;,
171 * or null if there were none. This is only filled in if the flag
172 * {@link PackageManager#GET_SERVICES} was set.
173 */
174 public ServiceInfo[] services;
175
176 /**
177 * Array of all {@link android.R.styleable#AndroidManifestProvider
178 * &lt;provider&gt;} tags included under &lt;application&gt;,
179 * or null if there were none. This is only filled in if the flag
180 * {@link PackageManager#GET_PROVIDERS} was set.
181 */
182 public ProviderInfo[] providers;
183
184 /**
185 * Array of all {@link android.R.styleable#AndroidManifestInstrumentation
186 * &lt;instrumentation&gt;} tags included under &lt;manifest&gt;,
187 * or null if there were none. This is only filled in if the flag
188 * {@link PackageManager#GET_INSTRUMENTATION} was set.
189 */
190 public InstrumentationInfo[] instrumentation;
Svet Ganov67882122016-12-11 16:36:34 -0800191
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192 /**
193 * Array of all {@link android.R.styleable#AndroidManifestPermission
194 * &lt;permission&gt;} tags included under &lt;manifest&gt;,
195 * or null if there were none. This is only filled in if the flag
196 * {@link PackageManager#GET_PERMISSIONS} was set.
197 */
198 public PermissionInfo[] permissions;
Svet Ganov67882122016-12-11 16:36:34 -0800199
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800200 /**
201 * Array of all {@link android.R.styleable#AndroidManifestUsesPermission
202 * &lt;uses-permission&gt;} tags included under &lt;manifest&gt;,
203 * or null if there were none. This is only filled in if the flag
204 * {@link PackageManager#GET_PERMISSIONS} was set. This list includes
205 * all permissions requested, even those that were not granted or known
206 * by the system at install time.
207 */
208 public String[] requestedPermissions;
Svet Ganov67882122016-12-11 16:36:34 -0800209
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800210 /**
Dianne Hackborne639da72012-02-21 15:11:13 -0800211 * Array of flags of all {@link android.R.styleable#AndroidManifestUsesPermission
212 * &lt;uses-permission&gt;} tags included under &lt;manifest&gt;,
213 * or null if there were none. This is only filled in if the flag
214 * {@link PackageManager#GET_PERMISSIONS} was set. Each value matches
215 * the corresponding entry in {@link #requestedPermissions}, and will have
Svetoslavc6d1c342015-02-26 14:44:43 -0800216 * the flag {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate.
Dianne Hackborne639da72012-02-21 15:11:13 -0800217 */
218 public int[] requestedPermissionsFlags;
219
220 /**
221 * Flag for {@link #requestedPermissionsFlags}: the requested permission
222 * is required for the application to run; the user can not optionally
Nick Kralevich32eb5b182013-04-11 10:20:09 -0700223 * disable it. Currently all permissions are required.
Svetoslavc6d1c342015-02-26 14:44:43 -0800224 *
225 * @removed We do not support required permissions.
Dianne Hackborne639da72012-02-21 15:11:13 -0800226 */
227 public static final int REQUESTED_PERMISSION_REQUIRED = 1<<0;
228
229 /**
230 * Flag for {@link #requestedPermissionsFlags}: the requested permission
231 * is currently granted to the application.
232 */
233 public static final int REQUESTED_PERMISSION_GRANTED = 1<<1;
234
235 /**
Svetoslav Ganovcdd685c2017-08-22 14:35:04 -0700236 * Array of all signatures read from the package file. This is only filled
237 * in if the flag {@link PackageManager#GET_SIGNATURES} was set. A package
Xin Wei Chow6ab8afb2018-09-01 09:12:58 +1000238 * must be signed with at least one certificate which is at position zero.
Svetoslav Ganovcdd685c2017-08-22 14:35:04 -0700239 * The package can be signed with additional certificates which appear as
240 * subsequent entries.
241 *
242 * <strong>Note:</strong> Signature ordering is not guaranteed to be
243 * stable which means that a package signed with certificates A and B is
244 * equivalent to being signed with certificates B and A. This means that
245 * in case multiple signatures are reported you cannot assume the one at
246 * the first position to be the same across updates.
Daniel Cashman5cdda342018-01-19 07:22:52 -0800247 *
248 * <strong>Deprecated</strong> This has been replaced by the
Dan Cashman5c9f527e2018-04-03 16:42:23 -0700249 * {@link PackageInfo#signingInfo} field, which takes into
Daniel Cashman5cdda342018-01-19 07:22:52 -0800250 * account signing certificate rotation. For backwards compatibility in
251 * the event of signing certificate rotation, this will return the oldest
252 * reported signing certificate, so that an application will appear to
253 * callers as though no rotation occurred.
254 *
Dan Cashmane942b912018-04-16 14:41:24 -0700255 * @deprecated use {@code signingInfo} instead
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800256 */
Daniel Cashman5cdda342018-01-19 07:22:52 -0800257 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800258 public Signature[] signatures;
Daniel Cashman5cdda342018-01-19 07:22:52 -0800259
260 /**
Dan Cashman5c9f527e2018-04-03 16:42:23 -0700261 * Signing information read from the package file, potentially
Daniel Cashman5cdda342018-01-19 07:22:52 -0800262 * including past signing certificates no longer used after signing
Dan Cashman5c9f527e2018-04-03 16:42:23 -0700263 * certificate rotation. This is only filled in if
Daniel Cashman5cdda342018-01-19 07:22:52 -0800264 * the flag {@link PackageManager#GET_SIGNING_CERTIFICATES} was set.
265 *
Dan Cashman5c9f527e2018-04-03 16:42:23 -0700266 * Use this field instead of the deprecated {@code signatures} field.
267 * See {@link SigningInfo} for more information on its contents.
Daniel Cashman5cdda342018-01-19 07:22:52 -0800268 */
Dan Cashman5c9f527e2018-04-03 16:42:23 -0700269 public SigningInfo signingInfo;
Daniel Cashman5cdda342018-01-19 07:22:52 -0800270
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800271 /**
272 * Application specified preferred configuration
273 * {@link android.R.styleable#AndroidManifestUsesConfiguration
274 * &lt;uses-configuration&gt;} tags included under &lt;manifest&gt;,
275 * or null if there were none. This is only filled in if the flag
Adam Lesinskid3edfde2014-08-08 17:32:44 -0700276 * {@link PackageManager#GET_CONFIGURATIONS} was set.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800277 */
278 public ConfigurationInfo[] configPreferences;
279
Dianne Hackborn49237342009-08-27 20:08:01 -0700280 /**
Jeff Sharkeyda96e132014-07-15 14:54:09 -0700281 * Features that this application has requested.
282 *
283 * @see FeatureInfo#FLAG_REQUIRED
Dianne Hackborn49237342009-08-27 20:08:01 -0700284 */
285 public FeatureInfo[] reqFeatures;
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800286
287 /**
Adam Lesinskid3edfde2014-08-08 17:32:44 -0700288 * Groups of features that this application has requested.
289 * Each group contains a set of features that are required.
290 * A device must match the features listed in {@link #reqFeatures} and one
291 * or more FeatureGroups in order to have satisfied the feature requirement.
292 *
293 * @see FeatureInfo#FLAG_REQUIRED
294 */
295 public FeatureGroupInfo[] featureGroups;
296
297 /**
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800298 * Constant corresponding to <code>auto</code> in
299 * the {@link android.R.attr#installLocation} attribute.
300 * @hide
301 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100302 @UnsupportedAppUsage
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -0700303 public static final int INSTALL_LOCATION_UNSPECIFIED = -1;
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700304
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -0700305 /**
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700306 * Constant corresponding to <code>auto</code> in the
307 * {@link android.R.attr#installLocation} attribute.
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -0700308 */
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800309 public static final int INSTALL_LOCATION_AUTO = 0;
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700310
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800311 /**
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700312 * Constant corresponding to <code>internalOnly</code> in the
313 * {@link android.R.attr#installLocation} attribute.
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800314 */
315 public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1;
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700316
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800317 /**
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700318 * Constant corresponding to <code>preferExternal</code> in the
319 * {@link android.R.attr#installLocation} attribute.
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800320 */
321 public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2;
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700322
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800323 /**
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700324 * The install location requested by the package. From the
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800325 * {@link android.R.attr#installLocation} attribute, one of
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700326 * {@link #INSTALL_LOCATION_AUTO}, {@link #INSTALL_LOCATION_INTERNAL_ONLY},
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800327 * {@link #INSTALL_LOCATION_PREFER_EXTERNAL}
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800328 */
329 public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800330
331 /** @hide */
Todd Kennedy7c8addf2017-06-27 14:13:55 -0700332 public boolean isStub;
333
334 /** @hide */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100335 @UnsupportedAppUsage
Jeff Hao272bf3a2014-10-08 13:34:43 -0700336 public boolean coreApp;
337
338 /** @hide */
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800339 public boolean requiredForAllUsers;
340
Amith Yamasani0ac1fc92013-03-27 18:56:08 -0700341 /** @hide */
342 public String restrictedAccountType;
343
Amith Yamasaniccbe3892013-04-12 17:52:42 -0700344 /** @hide */
345 public String requiredAccountType;
346
MÃ¥rten Kongstad48d22322014-01-31 14:43:27 +0100347 /**
348 * What package, if any, this package will overlay.
349 *
350 * Package name of target package, or null.
351 * @hide
352 */
Mathew Inwood5c0d3542018-08-14 13:54:31 +0100353 @UnsupportedAppUsage
MÃ¥rten Kongstad48d22322014-01-31 14:43:27 +0100354 public String overlayTarget;
355
Adrian Roosc84df772018-01-19 21:20:22 +0100356 /**
Ryan Mitchella3628462019-01-14 12:19:40 -0800357 * What overlayable set of elements package, if any, this package will overlay.
358 *
359 * Overlayable name defined within the target package, or null.
360 * @hide
361 */
362 public String overlayTargetName;
363
364 /**
Adrian Roosc84df772018-01-19 21:20:22 +0100365 * The overlay category, if any, of this package
366 *
367 * @hide
368 */
369 public String overlayCategory;
370
Jaekyun Seok04342892017-03-02 15:24:19 +0900371 /** @hide */
Jaekyun Seok42d53f62017-04-10 13:48:58 +0900372 public int overlayPriority;
373
Adam Lesinskiab56b9d2017-11-14 00:50:18 -0800374 /**
Adam Lesinskie7334972018-01-17 16:13:52 -0800375 * Whether the overlay is static, meaning it cannot be enabled/disabled at runtime.
Adam Lesinskiab56b9d2017-11-14 00:50:18 -0800376 */
Adam Lesinskie7334972018-01-17 16:13:52 -0800377 boolean mOverlayIsStatic;
Jaekyun Seok04342892017-03-02 15:24:19 +0900378
Alan Viveretteb6a25732017-11-21 14:49:24 -0500379 /**
380 * The user-visible SDK version (ex. 26) of the framework against which the application claims
381 * to have been compiled, or {@code 0} if not specified.
382 * <p>
383 * This property is the compile-time equivalent of
384 * {@link android.os.Build.VERSION#SDK_INT Build.VERSION.SDK_INT}.
385 *
386 * @hide For platform use only; we don't expect developers to need to read this value.
387 */
388 public int compileSdkVersion;
389
390 /**
391 * The development codename (ex. "O", "REL") of the framework against which the application
392 * claims to have been compiled, or {@code null} if not specified.
393 * <p>
394 * This property is the compile-time equivalent of
395 * {@link android.os.Build.VERSION#CODENAME Build.VERSION.CODENAME}.
396 *
397 * @hide For platform use only; we don't expect developers to need to read this value.
398 */
399 @Nullable
400 public String compileSdkVersionCodename;
401
Dario Frenicb7a68d2018-10-18 11:49:50 +0100402 /**
403 * Whether the package is an APEX package.
404 */
405 public boolean isApex;
406
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800407 public PackageInfo() {
408 }
409
Adam Lesinskiab56b9d2017-11-14 00:50:18 -0800410 /**
411 * Returns true if the package is a valid Runtime Overlay package.
412 * @hide
413 */
414 public boolean isOverlayPackage() {
Adam Lesinskie7334972018-01-17 16:13:52 -0800415 return overlayTarget != null;
Adam Lesinskiab56b9d2017-11-14 00:50:18 -0800416 }
417
418 /**
419 * Returns true if the package is a valid static Runtime Overlay package. Static overlays
420 * are not updatable outside of a system update and are safe to load in the system process.
421 * @hide
422 */
423 public boolean isStaticOverlayPackage() {
Adam Lesinskie7334972018-01-17 16:13:52 -0800424 return overlayTarget != null && mOverlayIsStatic;
Adam Lesinskiab56b9d2017-11-14 00:50:18 -0800425 }
426
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -0800427 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800428 public String toString() {
429 return "PackageInfo{"
430 + Integer.toHexString(System.identityHashCode(this))
431 + " " + packageName + "}";
432 }
433
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -0800434 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800435 public int describeContents() {
436 return 0;
437 }
438
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -0800439 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800440 public void writeToParcel(Parcel dest, int parcelableFlags) {
441 dest.writeString(packageName);
Jeff Sharkey6c833e02014-07-14 22:44:30 -0700442 dest.writeStringArray(splitNames);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800443 dest.writeInt(versionCode);
Dianne Hackborn3accca02013-09-20 09:32:11 -0700444 dest.writeInt(versionCodeMajor);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800445 dest.writeString(versionName);
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -0800446 dest.writeInt(baseRevisionCode);
447 dest.writeIntArray(splitRevisionCodes);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800448 dest.writeString(sharedUserId);
449 dest.writeInt(sharedUserLabel);
450 if (applicationInfo != null) {
451 dest.writeInt(1);
452 applicationInfo.writeToParcel(dest, parcelableFlags);
453 } else {
454 dest.writeInt(0);
455 }
Dianne Hackborn78d6883692010-10-07 01:12:46 -0700456 dest.writeLong(firstInstallTime);
457 dest.writeLong(lastUpdateTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800458 dest.writeIntArray(gids);
Christopher Tateb9116762015-09-09 18:46:31 -0700459 dest.writeTypedArray(activities, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
460 dest.writeTypedArray(receivers, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
461 dest.writeTypedArray(services, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
462 dest.writeTypedArray(providers, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800463 dest.writeTypedArray(instrumentation, parcelableFlags);
464 dest.writeTypedArray(permissions, parcelableFlags);
465 dest.writeStringArray(requestedPermissions);
Dianne Hackborne639da72012-02-21 15:11:13 -0800466 dest.writeIntArray(requestedPermissionsFlags);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800467 dest.writeTypedArray(signatures, parcelableFlags);
468 dest.writeTypedArray(configPreferences, parcelableFlags);
Dianne Hackborn49237342009-08-27 20:08:01 -0700469 dest.writeTypedArray(reqFeatures, parcelableFlags);
Adam Lesinskid3edfde2014-08-08 17:32:44 -0700470 dest.writeTypedArray(featureGroups, parcelableFlags);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800471 dest.writeInt(installLocation);
Todd Kennedy7c8addf2017-06-27 14:13:55 -0700472 dest.writeInt(isStub ? 1 : 0);
Jeff Hao272bf3a2014-10-08 13:34:43 -0700473 dest.writeInt(coreApp ? 1 : 0);
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800474 dest.writeInt(requiredForAllUsers ? 1 : 0);
Amith Yamasani0ac1fc92013-03-27 18:56:08 -0700475 dest.writeString(restrictedAccountType);
Amith Yamasaniccbe3892013-04-12 17:52:42 -0700476 dest.writeString(requiredAccountType);
MÃ¥rten Kongstad48d22322014-01-31 14:43:27 +0100477 dest.writeString(overlayTarget);
Adrian Roosc84df772018-01-19 21:20:22 +0100478 dest.writeString(overlayCategory);
Jaekyun Seok42d53f62017-04-10 13:48:58 +0900479 dest.writeInt(overlayPriority);
Adam Lesinskie7334972018-01-17 16:13:52 -0800480 dest.writeBoolean(mOverlayIsStatic);
Alan Viveretteb6a25732017-11-21 14:49:24 -0500481 dest.writeInt(compileSdkVersion);
482 dest.writeString(compileSdkVersionCodename);
Dan Cashman5c9f527e2018-04-03 16:42:23 -0700483 if (signingInfo != null) {
484 dest.writeInt(1);
485 signingInfo.writeToParcel(dest, parcelableFlags);
Dan Cashman050b7992018-02-06 17:08:58 -0800486 } else {
Dan Cashman5c9f527e2018-04-03 16:42:23 -0700487 dest.writeInt(0);
Dan Cashman050b7992018-02-06 17:08:58 -0800488 }
Dario Frenicb7a68d2018-10-18 11:49:50 +0100489 dest.writeBoolean(isApex);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800490 }
491
492 public static final Parcelable.Creator<PackageInfo> CREATOR
493 = new Parcelable.Creator<PackageInfo>() {
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -0800494 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800495 public PackageInfo createFromParcel(Parcel source) {
496 return new PackageInfo(source);
497 }
498
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -0800499 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800500 public PackageInfo[] newArray(int size) {
501 return new PackageInfo[size];
502 }
503 };
504
Mathew Inwood31755f92018-12-20 13:53:36 +0000505 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800506 private PackageInfo(Parcel source) {
507 packageName = source.readString();
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -0800508 splitNames = source.createStringArray();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800509 versionCode = source.readInt();
Dianne Hackborn3accca02013-09-20 09:32:11 -0700510 versionCodeMajor = source.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800511 versionName = source.readString();
Jeff Sharkey88d2a3c2014-11-22 16:49:34 -0800512 baseRevisionCode = source.readInt();
513 splitRevisionCodes = source.createIntArray();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800514 sharedUserId = source.readString();
515 sharedUserLabel = source.readInt();
516 int hasApp = source.readInt();
517 if (hasApp != 0) {
518 applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
519 }
Dianne Hackborn78d6883692010-10-07 01:12:46 -0700520 firstInstallTime = source.readLong();
521 lastUpdateTime = source.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800522 gids = source.createIntArray();
523 activities = source.createTypedArray(ActivityInfo.CREATOR);
524 receivers = source.createTypedArray(ActivityInfo.CREATOR);
525 services = source.createTypedArray(ServiceInfo.CREATOR);
526 providers = source.createTypedArray(ProviderInfo.CREATOR);
527 instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
528 permissions = source.createTypedArray(PermissionInfo.CREATOR);
529 requestedPermissions = source.createStringArray();
Dianne Hackborne639da72012-02-21 15:11:13 -0800530 requestedPermissionsFlags = source.createIntArray();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800531 signatures = source.createTypedArray(Signature.CREATOR);
532 configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
Dianne Hackborn49237342009-08-27 20:08:01 -0700533 reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
Adam Lesinskid3edfde2014-08-08 17:32:44 -0700534 featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -0800535 installLocation = source.readInt();
Todd Kennedy7c8addf2017-06-27 14:13:55 -0700536 isStub = source.readInt() != 0;
Jeff Hao272bf3a2014-10-08 13:34:43 -0700537 coreApp = source.readInt() != 0;
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800538 requiredForAllUsers = source.readInt() != 0;
Amith Yamasani0ac1fc92013-03-27 18:56:08 -0700539 restrictedAccountType = source.readString();
Amith Yamasaniccbe3892013-04-12 17:52:42 -0700540 requiredAccountType = source.readString();
MÃ¥rten Kongstad48d22322014-01-31 14:43:27 +0100541 overlayTarget = source.readString();
Adrian Roosc84df772018-01-19 21:20:22 +0100542 overlayCategory = source.readString();
Jaekyun Seok42d53f62017-04-10 13:48:58 +0900543 overlayPriority = source.readInt();
Adam Lesinskie7334972018-01-17 16:13:52 -0800544 mOverlayIsStatic = source.readBoolean();
Alan Viveretteb6a25732017-11-21 14:49:24 -0500545 compileSdkVersion = source.readInt();
546 compileSdkVersionCodename = source.readString();
Dan Cashman5c9f527e2018-04-03 16:42:23 -0700547 int hasSigningInfo = source.readInt();
548 if (hasSigningInfo != 0) {
549 signingInfo = SigningInfo.CREATOR.createFromParcel(source);
550 }
Dario Frenicb7a68d2018-10-18 11:49:50 +0100551 isApex = source.readBoolean();
Christopher Tateb9116762015-09-09 18:46:31 -0700552 // The component lists were flattened with the redundant ApplicationInfo
553 // instances omitted. Distribute the canonical one here as appropriate.
554 if (applicationInfo != null) {
555 propagateApplicationInfo(applicationInfo, activities);
556 propagateApplicationInfo(applicationInfo, receivers);
557 propagateApplicationInfo(applicationInfo, services);
558 propagateApplicationInfo(applicationInfo, providers);
559 }
560 }
561
562 private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components) {
563 if (components != null) {
564 for (ComponentInfo ci : components) {
565 ci.applicationInfo = appInfo;
566 }
567 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800568 }
569}