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.annotation.Nullable;
     20 import android.os.Parcel;
     21 import android.os.Parcelable;
     22 
     23 /**
     24  * Overall information about the contents of a package.  This corresponds
     25  * to all of the information collected from AndroidManifest.xml.
     26  */
     27 public class PackageInfo implements Parcelable {
     28     /**
     29      * The name of this package.  From the <manifest> tag's "name"
     30      * attribute.
     31      */
     32     public String packageName;
     33 
     34     /**
     35      * The names of any installed split APKs for this package.
     36      */
     37     public String[] splitNames;
     38 
     39     /**
     40      * @deprecated Use {@link #getLongVersionCode()} instead, which includes both
     41      * this and the additional
     42      * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} attribute.
     43      * The version number of this package, as specified by the <manifest>
     44      * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCode}
     45      * attribute.
     46      * @see #getLongVersionCode()
     47      */
     48     @Deprecated
     49     public int versionCode;
     50 
     51     /**
     52      * @hide
     53      * The major version number of this package, as specified by the <manifest>
     54      * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCodeMajor}
     55      * attribute.
     56      * @see #getLongVersionCode()
     57      */
     58     public int versionCodeMajor;
     59 
     60     /**
     61      * Return {@link android.R.styleable#AndroidManifest_versionCode versionCode} and
     62      * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} combined
     63      * together as a single long value.  The
     64      * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} is placed in
     65      * the upper 32 bits.
     66      */
     67     public long getLongVersionCode() {
     68         return composeLongVersionCode(versionCodeMajor, versionCode);
     69     }
     70 
     71     /**
     72      * Set the full version code in this PackageInfo, updating {@link #versionCode}
     73      * with the lower bits.
     74      * @see #getLongVersionCode()
     75      */
     76     public void setLongVersionCode(long longVersionCode) {
     77         versionCodeMajor = (int) (longVersionCode>>32);
     78         versionCode = (int) longVersionCode;
     79     }
     80 
     81     /**
     82      * @hide Internal implementation for composing a minor and major version code in to
     83      * a single long version code.
     84      */
     85     public static long composeLongVersionCode(int major, int minor) {
     86         return (((long) major) << 32) | (((long) minor) & 0xffffffffL);
     87     }
     88 
     89     /**
     90      * The version name of this package, as specified by the &lt;manifest&gt;
     91      * tag's {@link android.R.styleable#AndroidManifest_versionName versionName}
     92      * attribute.
     93      */
     94     public String versionName;
     95 
     96     /**
     97      * The revision number of the base APK for this package, as specified by the
     98      * &lt;manifest&gt; tag's
     99      * {@link android.R.styleable#AndroidManifest_revisionCode revisionCode}
    100      * attribute.
    101      */
    102     public int baseRevisionCode;
    103 
    104     /**
    105      * The revision number of any split APKs for this package, as specified by
    106      * the &lt;manifest&gt; tag's
    107      * {@link android.R.styleable#AndroidManifest_revisionCode revisionCode}
    108      * attribute. Indexes are a 1:1 mapping against {@link #splitNames}.
    109      */
    110     public int[] splitRevisionCodes;
    111 
    112     /**
    113      * The shared user ID name of this package, as specified by the &lt;manifest&gt;
    114      * tag's {@link android.R.styleable#AndroidManifest_sharedUserId sharedUserId}
    115      * attribute.
    116      */
    117     public String sharedUserId;
    118 
    119     /**
    120      * The shared user ID label of this package, as specified by the &lt;manifest&gt;
    121      * tag's {@link android.R.styleable#AndroidManifest_sharedUserLabel sharedUserLabel}
    122      * attribute.
    123      */
    124     public int sharedUserLabel;
    125 
    126     /**
    127      * Information collected from the &lt;application&gt; tag, or null if
    128      * there was none.
    129      */
    130     public ApplicationInfo applicationInfo;
    131 
    132     /**
    133      * The time at which the app was first installed.  Units are as
    134      * per {@link System#currentTimeMillis()}.
    135      */
    136     public long firstInstallTime;
    137 
    138     /**
    139      * The time at which the app was last updated.  Units are as
    140      * per {@link System#currentTimeMillis()}.
    141      */
    142     public long lastUpdateTime;
    143 
    144     /**
    145      * All kernel group-IDs that have been assigned to this package.
    146      * This is only filled in if the flag {@link PackageManager#GET_GIDS} was set.
    147      */
    148     public int[] gids;
    149 
    150     /**
    151      * Array of all {@link android.R.styleable#AndroidManifestActivity
    152      * &lt;activity&gt;} tags included under &lt;application&gt;,
    153      * or null if there were none.  This is only filled in if the flag
    154      * {@link PackageManager#GET_ACTIVITIES} was set.
    155      */
    156     public ActivityInfo[] activities;
    157 
    158     /**
    159      * Array of all {@link android.R.styleable#AndroidManifestReceiver
    160      * &lt;receiver&gt;} tags included under &lt;application&gt;,
    161      * or null if there were none.  This is only filled in if the flag
    162      * {@link PackageManager#GET_RECEIVERS} was set.
    163      */
    164     public ActivityInfo[] receivers;
    165 
    166     /**
    167      * Array of all {@link android.R.styleable#AndroidManifestService
    168      * &lt;service&gt;} tags included under &lt;application&gt;,
    169      * or null if there were none.  This is only filled in if the flag
    170      * {@link PackageManager#GET_SERVICES} was set.
    171      */
    172     public ServiceInfo[] services;
    173 
    174     /**
    175      * Array of all {@link android.R.styleable#AndroidManifestProvider
    176      * &lt;provider&gt;} tags included under &lt;application&gt;,
    177      * or null if there were none.  This is only filled in if the flag
    178      * {@link PackageManager#GET_PROVIDERS} was set.
    179      */
    180     public ProviderInfo[] providers;
    181 
    182     /**
    183      * Array of all {@link android.R.styleable#AndroidManifestInstrumentation
    184      * &lt;instrumentation&gt;} tags included under &lt;manifest&gt;,
    185      * or null if there were none.  This is only filled in if the flag
    186      * {@link PackageManager#GET_INSTRUMENTATION} was set.
    187      */
    188     public InstrumentationInfo[] instrumentation;
    189 
    190     /**
    191      * Array of all {@link android.R.styleable#AndroidManifestPermission
    192      * &lt;permission&gt;} tags included under &lt;manifest&gt;,
    193      * or null if there were none.  This is only filled in if the flag
    194      * {@link PackageManager#GET_PERMISSIONS} was set.
    195      */
    196     public PermissionInfo[] permissions;
    197 
    198     /**
    199      * Array of all {@link android.R.styleable#AndroidManifestUsesPermission
    200      * &lt;uses-permission&gt;} tags included under &lt;manifest&gt;,
    201      * or null if there were none.  This is only filled in if the flag
    202      * {@link PackageManager#GET_PERMISSIONS} was set.  This list includes
    203      * all permissions requested, even those that were not granted or known
    204      * by the system at install time.
    205      */
    206     public String[] requestedPermissions;
    207 
    208     /**
    209      * Array of flags of all {@link android.R.styleable#AndroidManifestUsesPermission
    210      * &lt;uses-permission&gt;} tags included under &lt;manifest&gt;,
    211      * or null if there were none.  This is only filled in if the flag
    212      * {@link PackageManager#GET_PERMISSIONS} was set.  Each value matches
    213      * the corresponding entry in {@link #requestedPermissions}, and will have
    214      * the flag {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate.
    215      */
    216     public int[] requestedPermissionsFlags;
    217 
    218     /**
    219      * Flag for {@link #requestedPermissionsFlags}: the requested permission
    220      * is required for the application to run; the user can not optionally
    221      * disable it.  Currently all permissions are required.
    222      *
    223      * @removed We do not support required permissions.
    224      */
    225     public static final int REQUESTED_PERMISSION_REQUIRED = 1<<0;
    226 
    227     /**
    228      * Flag for {@link #requestedPermissionsFlags}: the requested permission
    229      * is currently granted to the application.
    230      */
    231     public static final int REQUESTED_PERMISSION_GRANTED = 1<<1;
    232 
    233     /**
    234      * Array of all signatures read from the package file. This is only filled
    235      * in if the flag {@link PackageManager#GET_SIGNATURES} was set. A package
    236      * must be singed with at least one certificate which is at position zero.
    237      * The package can be signed with additional certificates which appear as
    238      * subsequent entries.
    239      *
    240      * <strong>Note:</strong> Signature ordering is not guaranteed to be
    241      * stable which means that a package signed with certificates A and B is
    242      * equivalent to being signed with certificates B and A. This means that
    243      * in case multiple signatures are reported you cannot assume the one at
    244      * the first position to be the same across updates.
    245      *
    246      * <strong>Deprecated</strong> This has been replaced by the
    247      * {@link PackageInfo#signingInfo} field, which takes into
    248      * account signing certificate rotation.  For backwards compatibility in
    249      * the event of signing certificate rotation, this will return the oldest
    250      * reported signing certificate, so that an application will appear to
    251      * callers as though no rotation occurred.
    252      *
    253      * @deprecated use {@code signingInfo} instead
    254      */
    255     @Deprecated
    256     public Signature[] signatures;
    257 
    258     /**
    259      * Signing information read from the package file, potentially
    260      * including past signing certificates no longer used after signing
    261      * certificate rotation.  This is only filled in if
    262      * the flag {@link PackageManager#GET_SIGNING_CERTIFICATES} was set.
    263      *
    264      * Use this field instead of the deprecated {@code signatures} field.
    265      * See {@link SigningInfo} for more information on its contents.
    266      */
    267     public SigningInfo signingInfo;
    268 
    269     /**
    270      * Application specified preferred configuration
    271      * {@link android.R.styleable#AndroidManifestUsesConfiguration
    272      * &lt;uses-configuration&gt;} tags included under &lt;manifest&gt;,
    273      * or null if there were none. This is only filled in if the flag
    274      * {@link PackageManager#GET_CONFIGURATIONS} was set.
    275      */
    276     public ConfigurationInfo[] configPreferences;
    277 
    278     /**
    279      * Features that this application has requested.
    280      *
    281      * @see FeatureInfo#FLAG_REQUIRED
    282      */
    283     public FeatureInfo[] reqFeatures;
    284 
    285     /**
    286      * Groups of features that this application has requested.
    287      * Each group contains a set of features that are required.
    288      * A device must match the features listed in {@link #reqFeatures} and one
    289      * or more FeatureGroups in order to have satisfied the feature requirement.
    290      *
    291      * @see FeatureInfo#FLAG_REQUIRED
    292      */
    293     public FeatureGroupInfo[] featureGroups;
    294 
    295     /**
    296      * Constant corresponding to <code>auto</code> in
    297      * the {@link android.R.attr#installLocation} attribute.
    298      * @hide
    299      */
    300     public static final int INSTALL_LOCATION_UNSPECIFIED = -1;
    301 
    302     /**
    303      * Constant corresponding to <code>auto</code> in the
    304      * {@link android.R.attr#installLocation} attribute.
    305      */
    306     public static final int INSTALL_LOCATION_AUTO = 0;
    307 
    308     /**
    309      * Constant corresponding to <code>internalOnly</code> in the
    310      * {@link android.R.attr#installLocation} attribute.
    311      */
    312     public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1;
    313 
    314     /**
    315      * Constant corresponding to <code>preferExternal</code> in the
    316      * {@link android.R.attr#installLocation} attribute.
    317      */
    318     public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2;
    319 
    320     /**
    321      * The install location requested by the package. From the
    322      * {@link android.R.attr#installLocation} attribute, one of
    323      * {@link #INSTALL_LOCATION_AUTO}, {@link #INSTALL_LOCATION_INTERNAL_ONLY},
    324      * {@link #INSTALL_LOCATION_PREFER_EXTERNAL}
    325      */
    326     public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
    327 
    328     /** @hide */
    329     public boolean isStub;
    330 
    331     /** @hide */
    332     public boolean coreApp;
    333 
    334     /** @hide */
    335     public boolean requiredForAllUsers;
    336 
    337     /** @hide */
    338     public String restrictedAccountType;
    339 
    340     /** @hide */
    341     public String requiredAccountType;
    342 
    343     /**
    344      * What package, if any, this package will overlay.
    345      *
    346      * Package name of target package, or null.
    347      * @hide
    348      */
    349     public String overlayTarget;
    350 
    351     /**
    352      * The overlay category, if any, of this package
    353      *
    354      * @hide
    355      */
    356     public String overlayCategory;
    357 
    358     /** @hide */
    359     public int overlayPriority;
    360 
    361     /**
    362      * Whether the overlay is static, meaning it cannot be enabled/disabled at runtime.
    363      */
    364     boolean mOverlayIsStatic;
    365 
    366     /**
    367      * The user-visible SDK version (ex. 26) of the framework against which the application claims
    368      * to have been compiled, or {@code 0} if not specified.
    369      * <p>
    370      * This property is the compile-time equivalent of
    371      * {@link android.os.Build.VERSION#SDK_INT Build.VERSION.SDK_INT}.
    372      *
    373      * @hide For platform use only; we don't expect developers to need to read this value.
    374      */
    375     public int compileSdkVersion;
    376 
    377     /**
    378      * The development codename (ex. "O", "REL") of the framework against which the application
    379      * claims to have been compiled, or {@code null} if not specified.
    380      * <p>
    381      * This property is the compile-time equivalent of
    382      * {@link android.os.Build.VERSION#CODENAME Build.VERSION.CODENAME}.
    383      *
    384      * @hide For platform use only; we don't expect developers to need to read this value.
    385      */
    386     @Nullable
    387     public String compileSdkVersionCodename;
    388 
    389     public PackageInfo() {
    390     }
    391 
    392     /**
    393      * Returns true if the package is a valid Runtime Overlay package.
    394      * @hide
    395      */
    396     public boolean isOverlayPackage() {
    397         return overlayTarget != null;
    398     }
    399 
    400     /**
    401      * Returns true if the package is a valid static Runtime Overlay package. Static overlays
    402      * are not updatable outside of a system update and are safe to load in the system process.
    403      * @hide
    404      */
    405     public boolean isStaticOverlayPackage() {
    406         return overlayTarget != null && mOverlayIsStatic;
    407     }
    408 
    409     @Override
    410     public String toString() {
    411         return "PackageInfo{"
    412             + Integer.toHexString(System.identityHashCode(this))
    413             + " " + packageName + "}";
    414     }
    415 
    416     @Override
    417     public int describeContents() {
    418         return 0;
    419     }
    420 
    421     @Override
    422     public void writeToParcel(Parcel dest, int parcelableFlags) {
    423         dest.writeString(packageName);
    424         dest.writeStringArray(splitNames);
    425         dest.writeInt(versionCode);
    426         dest.writeInt(versionCodeMajor);
    427         dest.writeString(versionName);
    428         dest.writeInt(baseRevisionCode);
    429         dest.writeIntArray(splitRevisionCodes);
    430         dest.writeString(sharedUserId);
    431         dest.writeInt(sharedUserLabel);
    432         if (applicationInfo != null) {
    433             dest.writeInt(1);
    434             applicationInfo.writeToParcel(dest, parcelableFlags);
    435         } else {
    436             dest.writeInt(0);
    437         }
    438         dest.writeLong(firstInstallTime);
    439         dest.writeLong(lastUpdateTime);
    440         dest.writeIntArray(gids);
    441         dest.writeTypedArray(activities, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
    442         dest.writeTypedArray(receivers, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
    443         dest.writeTypedArray(services, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
    444         dest.writeTypedArray(providers, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
    445         dest.writeTypedArray(instrumentation, parcelableFlags);
    446         dest.writeTypedArray(permissions, parcelableFlags);
    447         dest.writeStringArray(requestedPermissions);
    448         dest.writeIntArray(requestedPermissionsFlags);
    449         dest.writeTypedArray(signatures, parcelableFlags);
    450         dest.writeTypedArray(configPreferences, parcelableFlags);
    451         dest.writeTypedArray(reqFeatures, parcelableFlags);
    452         dest.writeTypedArray(featureGroups, parcelableFlags);
    453         dest.writeInt(installLocation);
    454         dest.writeInt(isStub ? 1 : 0);
    455         dest.writeInt(coreApp ? 1 : 0);
    456         dest.writeInt(requiredForAllUsers ? 1 : 0);
    457         dest.writeString(restrictedAccountType);
    458         dest.writeString(requiredAccountType);
    459         dest.writeString(overlayTarget);
    460         dest.writeString(overlayCategory);
    461         dest.writeInt(overlayPriority);
    462         dest.writeBoolean(mOverlayIsStatic);
    463         dest.writeInt(compileSdkVersion);
    464         dest.writeString(compileSdkVersionCodename);
    465         if (signingInfo != null) {
    466             dest.writeInt(1);
    467             signingInfo.writeToParcel(dest, parcelableFlags);
    468         } else {
    469             dest.writeInt(0);
    470         }
    471     }
    472 
    473     public static final Parcelable.Creator<PackageInfo> CREATOR
    474             = new Parcelable.Creator<PackageInfo>() {
    475         @Override
    476         public PackageInfo createFromParcel(Parcel source) {
    477             return new PackageInfo(source);
    478         }
    479 
    480         @Override
    481         public PackageInfo[] newArray(int size) {
    482             return new PackageInfo[size];
    483         }
    484     };
    485 
    486     private PackageInfo(Parcel source) {
    487         packageName = source.readString();
    488         splitNames = source.createStringArray();
    489         versionCode = source.readInt();
    490         versionCodeMajor = source.readInt();
    491         versionName = source.readString();
    492         baseRevisionCode = source.readInt();
    493         splitRevisionCodes = source.createIntArray();
    494         sharedUserId = source.readString();
    495         sharedUserLabel = source.readInt();
    496         int hasApp = source.readInt();
    497         if (hasApp != 0) {
    498             applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
    499         }
    500         firstInstallTime = source.readLong();
    501         lastUpdateTime = source.readLong();
    502         gids = source.createIntArray();
    503         activities = source.createTypedArray(ActivityInfo.CREATOR);
    504         receivers = source.createTypedArray(ActivityInfo.CREATOR);
    505         services = source.createTypedArray(ServiceInfo.CREATOR);
    506         providers = source.createTypedArray(ProviderInfo.CREATOR);
    507         instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
    508         permissions = source.createTypedArray(PermissionInfo.CREATOR);
    509         requestedPermissions = source.createStringArray();
    510         requestedPermissionsFlags = source.createIntArray();
    511         signatures = source.createTypedArray(Signature.CREATOR);
    512         configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
    513         reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
    514         featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
    515         installLocation = source.readInt();
    516         isStub = source.readInt() != 0;
    517         coreApp = source.readInt() != 0;
    518         requiredForAllUsers = source.readInt() != 0;
    519         restrictedAccountType = source.readString();
    520         requiredAccountType = source.readString();
    521         overlayTarget = source.readString();
    522         overlayCategory = source.readString();
    523         overlayPriority = source.readInt();
    524         mOverlayIsStatic = source.readBoolean();
    525         compileSdkVersion = source.readInt();
    526         compileSdkVersionCodename = source.readString();
    527         int hasSigningInfo = source.readInt();
    528         if (hasSigningInfo != 0) {
    529             signingInfo = SigningInfo.CREATOR.createFromParcel(source);
    530         }
    531 
    532         // The component lists were flattened with the redundant ApplicationInfo
    533         // instances omitted.  Distribute the canonical one here as appropriate.
    534         if (applicationInfo != null) {
    535             propagateApplicationInfo(applicationInfo, activities);
    536             propagateApplicationInfo(applicationInfo, receivers);
    537             propagateApplicationInfo(applicationInfo, services);
    538             propagateApplicationInfo(applicationInfo, providers);
    539         }
    540     }
    541 
    542     private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components) {
    543         if (components != null) {
    544             for (ComponentInfo ci : components) {
    545                 ci.applicationInfo = appInfo;
    546             }
    547         }
    548     }
    549 }
    550