1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.content.pm;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 
22 /**
23  * Overall information about the contents of a package.  This corresponds
24  * to all of the information collected from AndroidManifest.xml.
25  */
26 public class PackageInfo implements Parcelable {
27     /**
28      * The name of this package.  From the <manifest> tag's "name"
29      * attribute.
30      */
31     public String packageName;
32 
33     /**
34      * The names of any installed split APKs for this package.
35      */
36     public String[] splitNames;
37 
38     /**
39      * The version number of this package, as specified by the <manifest>
40      * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCode}
41      * attribute.
42      */
43     public int versionCode;
44 
45     /**
46      * The version name of this package, as specified by the <manifest>
47      * tag's {@link android.R.styleable#AndroidManifest_versionName versionName}
48      * attribute.
49      */
50     public String versionName;
51 
52     /**
53      * The revision number of the base APK for this package, as specified by the
54      * <manifest> tag's
55      * {@link android.R.styleable#AndroidManifest_revisionCode revisionCode}
56      * attribute.
57      */
58     public int baseRevisionCode;
59 
60     /**
61      * The revision number of any split APKs for this package, as specified by
62      * the <manifest> tag's
63      * {@link android.R.styleable#AndroidManifest_revisionCode revisionCode}
64      * attribute. Indexes are a 1:1 mapping against {@link #splitNames}.
65      */
66     public int[] splitRevisionCodes;
67 
68     /**
69      * The shared user ID name of this package, as specified by the <manifest>
70      * tag's {@link android.R.styleable#AndroidManifest_sharedUserId sharedUserId}
71      * attribute.
72      */
73     public String sharedUserId;
74 
75     /**
76      * The shared user ID label of this package, as specified by the <manifest>
77      * tag's {@link android.R.styleable#AndroidManifest_sharedUserLabel sharedUserLabel}
78      * attribute.
79      */
80     public int sharedUserLabel;
81 
82     /**
83      * Information collected from the <application> tag, or null if
84      * there was none.
85      */
86     public ApplicationInfo applicationInfo;
87 
88     /**
89      * The time at which the app was first installed.  Units are as
90      * per {@link System#currentTimeMillis()}.
91      */
92     public long firstInstallTime;
93 
94     /**
95      * The time at which the app was last updated.  Units are as
96      * per {@link System#currentTimeMillis()}.
97      */
98     public long lastUpdateTime;
99 
100     /**
101      * All kernel group-IDs that have been assigned to this package.
102      * This is only filled in if the flag {@link PackageManager#GET_GIDS} was set.
103      */
104     public int[] gids;
105 
106     /**
107      * Array of all {@link android.R.styleable#AndroidManifestActivity
108      * <activity>} tags included under <application>,
109      * or null if there were none.  This is only filled in if the flag
110      * {@link PackageManager#GET_ACTIVITIES} was set.
111      */
112     public ActivityInfo[] activities;
113 
114     /**
115      * Array of all {@link android.R.styleable#AndroidManifestReceiver
116      * <receiver>} tags included under <application>,
117      * or null if there were none.  This is only filled in if the flag
118      * {@link PackageManager#GET_RECEIVERS} was set.
119      */
120     public ActivityInfo[] receivers;
121 
122     /**
123      * Array of all {@link android.R.styleable#AndroidManifestService
124      * <service>} tags included under <application>,
125      * or null if there were none.  This is only filled in if the flag
126      * {@link PackageManager#GET_SERVICES} was set.
127      */
128     public ServiceInfo[] services;
129 
130     /**
131      * Array of all {@link android.R.styleable#AndroidManifestProvider
132      * <provider>} tags included under <application>,
133      * or null if there were none.  This is only filled in if the flag
134      * {@link PackageManager#GET_PROVIDERS} was set.
135      */
136     public ProviderInfo[] providers;
137 
138     /**
139      * Array of all {@link android.R.styleable#AndroidManifestInstrumentation
140      * <instrumentation>} tags included under <manifest>,
141      * or null if there were none.  This is only filled in if the flag
142      * {@link PackageManager#GET_INSTRUMENTATION} was set.
143      */
144     public InstrumentationInfo[] instrumentation;
145 
146     /**
147      * Array of all {@link android.R.styleable#AndroidManifestPermission
148      * <permission>} tags included under <manifest>,
149      * or null if there were none.  This is only filled in if the flag
150      * {@link PackageManager#GET_PERMISSIONS} was set.
151      */
152     public PermissionInfo[] permissions;
153 
154     /**
155      * Array of all {@link android.R.styleable#AndroidManifestUsesPermission
156      * <uses-permission>} tags included under <manifest>,
157      * or null if there were none.  This is only filled in if the flag
158      * {@link PackageManager#GET_PERMISSIONS} was set.  This list includes
159      * all permissions requested, even those that were not granted or known
160      * by the system at install time.
161      */
162     public String[] requestedPermissions;
163 
164     /**
165      * Array of flags of all {@link android.R.styleable#AndroidManifestUsesPermission
166      * <uses-permission>} tags included under <manifest>,
167      * or null if there were none.  This is only filled in if the flag
168      * {@link PackageManager#GET_PERMISSIONS} was set.  Each value matches
169      * the corresponding entry in {@link #requestedPermissions}, and will have
170      * the flags {@link #REQUESTED_PERMISSION_REQUIRED} and
171      * {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate.
172      */
173     public int[] requestedPermissionsFlags;
174 
175     /**
176      * Flag for {@link #requestedPermissionsFlags}: the requested permission
177      * is required for the application to run; the user can not optionally
178      * disable it.  Currently all permissions are required.
179      */
180     public static final int REQUESTED_PERMISSION_REQUIRED = 1<<0;
181 
182     /**
183      * Flag for {@link #requestedPermissionsFlags}: the requested permission
184      * is currently granted to the application.
185      */
186     public static final int REQUESTED_PERMISSION_GRANTED = 1<<1;
187 
188     /**
189      * Array of all signatures read from the package file.  This is only filled
190      * in if the flag {@link PackageManager#GET_SIGNATURES} was set.
191      */
192     public Signature[] signatures;
193 
194     /**
195      * Application specified preferred configuration
196      * {@link android.R.styleable#AndroidManifestUsesConfiguration
197      * &lt;uses-configuration&gt;} tags included under &lt;manifest&gt;,
198      * or null if there were none. This is only filled in if the flag
199      * {@link PackageManager#GET_CONFIGURATIONS} was set.
200      */
201     public ConfigurationInfo[] configPreferences;
202 
203     /**
204      * Features that this application has requested.
205      *
206      * @see FeatureInfo#FLAG_REQUIRED
207      */
208     public FeatureInfo[] reqFeatures;
209 
210     /**
211      * Groups of features that this application has requested.
212      * Each group contains a set of features that are required.
213      * A device must match the features listed in {@link #reqFeatures} and one
214      * or more FeatureGroups in order to have satisfied the feature requirement.
215      *
216      * @see FeatureInfo#FLAG_REQUIRED
217      */
218     public FeatureGroupInfo[] featureGroups;
219 
220     /**
221      * Constant corresponding to <code>auto</code> in
222      * the {@link android.R.attr#installLocation} attribute.
223      * @hide
224      */
225     public static final int INSTALL_LOCATION_UNSPECIFIED = -1;
226 
227     /**
228      * Constant corresponding to <code>auto</code> in the
229      * {@link android.R.attr#installLocation} attribute.
230      */
231     public static final int INSTALL_LOCATION_AUTO = 0;
232 
233     /**
234      * Constant corresponding to <code>internalOnly</code> in the
235      * {@link android.R.attr#installLocation} attribute.
236      */
237     public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1;
238 
239     /**
240      * Constant corresponding to <code>preferExternal</code> in the
241      * {@link android.R.attr#installLocation} attribute.
242      */
243     public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2;
244 
245     /**
246      * The install location requested by the package. From the
247      * {@link android.R.attr#installLocation} attribute, one of
248      * {@link #INSTALL_LOCATION_AUTO}, {@link #INSTALL_LOCATION_INTERNAL_ONLY},
249      * {@link #INSTALL_LOCATION_PREFER_EXTERNAL}
250      */
251     public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
252 
253     /** @hide */
254     public boolean coreApp;
255 
256     /** @hide */
257     public boolean requiredForAllUsers;
258 
259     /** @hide */
260     public String restrictedAccountType;
261 
262     /** @hide */
263     public String requiredAccountType;
264 
265     /**
266      * What package, if any, this package will overlay.
267      *
268      * Package name of target package, or null.
269      * @hide
270      */
271     public String overlayTarget;
272 
PackageInfo()273     public PackageInfo() {
274     }
275 
276     @Override
toString()277     public String toString() {
278         return "PackageInfo{"
279             + Integer.toHexString(System.identityHashCode(this))
280             + " " + packageName + "}";
281     }
282 
283     @Override
describeContents()284     public int describeContents() {
285         return 0;
286     }
287 
288     @Override
writeToParcel(Parcel dest, int parcelableFlags)289     public void writeToParcel(Parcel dest, int parcelableFlags) {
290         dest.writeString(packageName);
291         dest.writeStringArray(splitNames);
292         dest.writeInt(versionCode);
293         dest.writeString(versionName);
294         dest.writeInt(baseRevisionCode);
295         dest.writeIntArray(splitRevisionCodes);
296         dest.writeString(sharedUserId);
297         dest.writeInt(sharedUserLabel);
298         if (applicationInfo != null) {
299             dest.writeInt(1);
300             applicationInfo.writeToParcel(dest, parcelableFlags);
301         } else {
302             dest.writeInt(0);
303         }
304         dest.writeLong(firstInstallTime);
305         dest.writeLong(lastUpdateTime);
306         dest.writeIntArray(gids);
307         dest.writeTypedArray(activities, parcelableFlags);
308         dest.writeTypedArray(receivers, parcelableFlags);
309         dest.writeTypedArray(services, parcelableFlags);
310         dest.writeTypedArray(providers, parcelableFlags);
311         dest.writeTypedArray(instrumentation, parcelableFlags);
312         dest.writeTypedArray(permissions, parcelableFlags);
313         dest.writeStringArray(requestedPermissions);
314         dest.writeIntArray(requestedPermissionsFlags);
315         dest.writeTypedArray(signatures, parcelableFlags);
316         dest.writeTypedArray(configPreferences, parcelableFlags);
317         dest.writeTypedArray(reqFeatures, parcelableFlags);
318         dest.writeTypedArray(featureGroups, parcelableFlags);
319         dest.writeInt(installLocation);
320         dest.writeInt(coreApp ? 1 : 0);
321         dest.writeInt(requiredForAllUsers ? 1 : 0);
322         dest.writeString(restrictedAccountType);
323         dest.writeString(requiredAccountType);
324         dest.writeString(overlayTarget);
325     }
326 
327     public static final Parcelable.Creator<PackageInfo> CREATOR
328             = new Parcelable.Creator<PackageInfo>() {
329         @Override
330         public PackageInfo createFromParcel(Parcel source) {
331             return new PackageInfo(source);
332         }
333 
334         @Override
335         public PackageInfo[] newArray(int size) {
336             return new PackageInfo[size];
337         }
338     };
339 
PackageInfo(Parcel source)340     private PackageInfo(Parcel source) {
341         packageName = source.readString();
342         splitNames = source.createStringArray();
343         versionCode = source.readInt();
344         versionName = source.readString();
345         baseRevisionCode = source.readInt();
346         splitRevisionCodes = source.createIntArray();
347         sharedUserId = source.readString();
348         sharedUserLabel = source.readInt();
349         int hasApp = source.readInt();
350         if (hasApp != 0) {
351             applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
352         }
353         firstInstallTime = source.readLong();
354         lastUpdateTime = source.readLong();
355         gids = source.createIntArray();
356         activities = source.createTypedArray(ActivityInfo.CREATOR);
357         receivers = source.createTypedArray(ActivityInfo.CREATOR);
358         services = source.createTypedArray(ServiceInfo.CREATOR);
359         providers = source.createTypedArray(ProviderInfo.CREATOR);
360         instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
361         permissions = source.createTypedArray(PermissionInfo.CREATOR);
362         requestedPermissions = source.createStringArray();
363         requestedPermissionsFlags = source.createIntArray();
364         signatures = source.createTypedArray(Signature.CREATOR);
365         configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
366         reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
367         featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
368         installLocation = source.readInt();
369         coreApp = source.readInt() != 0;
370         requiredForAllUsers = source.readInt() != 0;
371         restrictedAccountType = source.readString();
372         requiredAccountType = source.readString();
373         overlayTarget = source.readString();
374     }
375 }
376