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 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 
    273     public PackageInfo() {
    274     }
    275 
    276     @Override
    277     public String toString() {
    278         return "PackageInfo{"
    279             + Integer.toHexString(System.identityHashCode(this))
    280             + " " + packageName + "}";
    281     }
    282 
    283     @Override
    284     public int describeContents() {
    285         return 0;
    286     }
    287 
    288     @Override
    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 
    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