Home | History | Annotate | Download | only in pm
      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 flag {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate.
    171      */
    172     public int[] requestedPermissionsFlags;
    173 
    174     /**
    175      * Flag for {@link #requestedPermissionsFlags}: the requested permission
    176      * is required for the application to run; the user can not optionally
    177      * disable it.  Currently all permissions are required.
    178      *
    179      * @removed We do not support required permissions.
    180      */
    181     public static final int REQUESTED_PERMISSION_REQUIRED = 1<<0;
    182 
    183     /**
    184      * Flag for {@link #requestedPermissionsFlags}: the requested permission
    185      * is currently granted to the application.
    186      */
    187     public static final int REQUESTED_PERMISSION_GRANTED = 1<<1;
    188 
    189     /**
    190      * Array of all signatures read from the package file.  This is only filled
    191      * in if the flag {@link PackageManager#GET_SIGNATURES} was set.
    192      */
    193     public Signature[] signatures;
    194 
    195     /**
    196      * Application specified preferred configuration
    197      * {@link android.R.styleable#AndroidManifestUsesConfiguration
    198      * &lt;uses-configuration&gt;} tags included under &lt;manifest&gt;,
    199      * or null if there were none. This is only filled in if the flag
    200      * {@link PackageManager#GET_CONFIGURATIONS} was set.
    201      */
    202     public ConfigurationInfo[] configPreferences;
    203 
    204     /**
    205      * Features that this application has requested.
    206      *
    207      * @see FeatureInfo#FLAG_REQUIRED
    208      */
    209     public FeatureInfo[] reqFeatures;
    210 
    211     /**
    212      * Groups of features that this application has requested.
    213      * Each group contains a set of features that are required.
    214      * A device must match the features listed in {@link #reqFeatures} and one
    215      * or more FeatureGroups in order to have satisfied the feature requirement.
    216      *
    217      * @see FeatureInfo#FLAG_REQUIRED
    218      */
    219     public FeatureGroupInfo[] featureGroups;
    220 
    221     /**
    222      * Constant corresponding to <code>auto</code> in
    223      * the {@link android.R.attr#installLocation} attribute.
    224      * @hide
    225      */
    226     public static final int INSTALL_LOCATION_UNSPECIFIED = -1;
    227 
    228     /**
    229      * Constant corresponding to <code>auto</code> in the
    230      * {@link android.R.attr#installLocation} attribute.
    231      */
    232     public static final int INSTALL_LOCATION_AUTO = 0;
    233 
    234     /**
    235      * Constant corresponding to <code>internalOnly</code> in the
    236      * {@link android.R.attr#installLocation} attribute.
    237      */
    238     public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1;
    239 
    240     /**
    241      * Constant corresponding to <code>preferExternal</code> in the
    242      * {@link android.R.attr#installLocation} attribute.
    243      */
    244     public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2;
    245 
    246     /**
    247      * The install location requested by the package. From the
    248      * {@link android.R.attr#installLocation} attribute, one of
    249      * {@link #INSTALL_LOCATION_AUTO}, {@link #INSTALL_LOCATION_INTERNAL_ONLY},
    250      * {@link #INSTALL_LOCATION_PREFER_EXTERNAL}
    251      */
    252     public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
    253 
    254     /** @hide */
    255     public boolean coreApp;
    256 
    257     /** @hide */
    258     public boolean requiredForAllUsers;
    259 
    260     /** @hide */
    261     public String restrictedAccountType;
    262 
    263     /** @hide */
    264     public String requiredAccountType;
    265 
    266     /**
    267      * What package, if any, this package will overlay.
    268      *
    269      * Package name of target package, or null.
    270      * @hide
    271      */
    272     public String overlayTarget;
    273 
    274     /** @hide */
    275     public int overlayPriority;
    276 
    277     /** @hide */
    278     public boolean isStaticOverlay;
    279 
    280     public PackageInfo() {
    281     }
    282 
    283     @Override
    284     public String toString() {
    285         return "PackageInfo{"
    286             + Integer.toHexString(System.identityHashCode(this))
    287             + " " + packageName + "}";
    288     }
    289 
    290     @Override
    291     public int describeContents() {
    292         return 0;
    293     }
    294 
    295     @Override
    296     public void writeToParcel(Parcel dest, int parcelableFlags) {
    297         dest.writeString(packageName);
    298         dest.writeStringArray(splitNames);
    299         dest.writeInt(versionCode);
    300         dest.writeString(versionName);
    301         dest.writeInt(baseRevisionCode);
    302         dest.writeIntArray(splitRevisionCodes);
    303         dest.writeString(sharedUserId);
    304         dest.writeInt(sharedUserLabel);
    305         if (applicationInfo != null) {
    306             dest.writeInt(1);
    307             applicationInfo.writeToParcel(dest, parcelableFlags);
    308         } else {
    309             dest.writeInt(0);
    310         }
    311         dest.writeLong(firstInstallTime);
    312         dest.writeLong(lastUpdateTime);
    313         dest.writeIntArray(gids);
    314         dest.writeTypedArray(activities, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
    315         dest.writeTypedArray(receivers, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
    316         dest.writeTypedArray(services, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
    317         dest.writeTypedArray(providers, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
    318         dest.writeTypedArray(instrumentation, parcelableFlags);
    319         dest.writeTypedArray(permissions, parcelableFlags);
    320         dest.writeStringArray(requestedPermissions);
    321         dest.writeIntArray(requestedPermissionsFlags);
    322         dest.writeTypedArray(signatures, parcelableFlags);
    323         dest.writeTypedArray(configPreferences, parcelableFlags);
    324         dest.writeTypedArray(reqFeatures, parcelableFlags);
    325         dest.writeTypedArray(featureGroups, parcelableFlags);
    326         dest.writeInt(installLocation);
    327         dest.writeInt(coreApp ? 1 : 0);
    328         dest.writeInt(requiredForAllUsers ? 1 : 0);
    329         dest.writeString(restrictedAccountType);
    330         dest.writeString(requiredAccountType);
    331         dest.writeString(overlayTarget);
    332         dest.writeInt(isStaticOverlay ? 1 : 0);
    333         dest.writeInt(overlayPriority);
    334     }
    335 
    336     public static final Parcelable.Creator<PackageInfo> CREATOR
    337             = new Parcelable.Creator<PackageInfo>() {
    338         @Override
    339         public PackageInfo createFromParcel(Parcel source) {
    340             return new PackageInfo(source);
    341         }
    342 
    343         @Override
    344         public PackageInfo[] newArray(int size) {
    345             return new PackageInfo[size];
    346         }
    347     };
    348 
    349     private PackageInfo(Parcel source) {
    350         packageName = source.readString();
    351         splitNames = source.createStringArray();
    352         versionCode = source.readInt();
    353         versionName = source.readString();
    354         baseRevisionCode = source.readInt();
    355         splitRevisionCodes = source.createIntArray();
    356         sharedUserId = source.readString();
    357         sharedUserLabel = source.readInt();
    358         int hasApp = source.readInt();
    359         if (hasApp != 0) {
    360             applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
    361         }
    362         firstInstallTime = source.readLong();
    363         lastUpdateTime = source.readLong();
    364         gids = source.createIntArray();
    365         activities = source.createTypedArray(ActivityInfo.CREATOR);
    366         receivers = source.createTypedArray(ActivityInfo.CREATOR);
    367         services = source.createTypedArray(ServiceInfo.CREATOR);
    368         providers = source.createTypedArray(ProviderInfo.CREATOR);
    369         instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
    370         permissions = source.createTypedArray(PermissionInfo.CREATOR);
    371         requestedPermissions = source.createStringArray();
    372         requestedPermissionsFlags = source.createIntArray();
    373         signatures = source.createTypedArray(Signature.CREATOR);
    374         configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
    375         reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
    376         featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
    377         installLocation = source.readInt();
    378         coreApp = source.readInt() != 0;
    379         requiredForAllUsers = source.readInt() != 0;
    380         restrictedAccountType = source.readString();
    381         requiredAccountType = source.readString();
    382         overlayTarget = source.readString();
    383         isStaticOverlay = source.readInt() != 0;
    384         overlayPriority = source.readInt();
    385 
    386         // The component lists were flattened with the redundant ApplicationInfo
    387         // instances omitted.  Distribute the canonical one here as appropriate.
    388         if (applicationInfo != null) {
    389             propagateApplicationInfo(applicationInfo, activities);
    390             propagateApplicationInfo(applicationInfo, receivers);
    391             propagateApplicationInfo(applicationInfo, services);
    392             propagateApplicationInfo(applicationInfo, providers);
    393         }
    394     }
    395 
    396     private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components) {
    397         if (components != null) {
    398             for (ComponentInfo ci : components) {
    399                 ci.applicationInfo = appInfo;
    400             }
    401         }
    402     }
    403 }
    404