# PackageInfoCompat

Artifact: [androidx.core:core](https://developer.android.com/jetpack/androidx/releases/core) [View Source](https://cs.android.com/search?q=file:androidx/core/content/pm/PackageInfoCompat.java+class:androidx.core.content.pm.PackageInfoCompat) Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

*** ** * ** ***


```
public final class PackageInfoCompat
```

<br />

*** ** * ** ***

Helper for accessing features in `https://developer.android.com/reference/android/content/pm/PackageInfo.html`.

## Summary

| ### Public methods |
|---|---|
| `static long` | `https://developer.android.com/reference/androidx/core/content/pm/PackageInfoCompat#getLongVersionCode(android.content.pm.PackageInfo)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/content/pm/PackageInfo.html info)` Return `https://developer.android.com/reference/android/R.attr.html#versionCode` and `https://developer.android.com/reference/android/R.attr.html#versionCodeMajor` combined together as a single long value. |
| `static @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/android/content/pm/Signature.html>` | `https://developer.android.com/reference/androidx/core/content/pm/PackageInfoCompat#getSignatures(android.content.pm.PackageManager,java.lang.String)( @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/content/pm/PackageManager.html packageManager, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html packageName )` Retrieve the `https://developer.android.com/reference/android/content/pm/Signature.html` array for the given package. |
| `static boolean` | `https://developer.android.com/reference/androidx/core/content/pm/PackageInfoCompat#hasSignatures(android.content.pm.PackageManager,java.lang.String,java.util.Map<byte[],java.lang.Integer>,boolean)( @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/content/pm/PackageManager.html packageManager, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html packageName, @https://developer.android.com/reference/androidx/annotation/Size(min = 1) @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/util/Map.html<byte[], https://developer.android.com/reference/java/lang/Integer.html> certificatesAndType, boolean matchExact )` Check if a package on device contains set of a certificates. |

## Public methods

### getLongVersionCode

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public static long getLongVersionCode(@NonNull PackageInfo info)
```

Return `https://developer.android.com/reference/android/R.attr.html#versionCode` and `https://developer.android.com/reference/android/R.attr.html#versionCodeMajor` combined together as a single long value. The `versionCodeMajor` is placed in the upper 32 bits on Android P or newer, otherwise these bits are all set to 0.

| See also |
|---|---|
| `https://developer.android.com/reference/android/content/pm/PackageInfo.html#getLongVersionCode()` |   |

### getSignatures

Added in [1.5.0](https://developer.android.com/jetpack/androidx/releases/core#1.5.0)

```
public static @NonNull List<Signature> getSignatures(
    @NonNull PackageManager packageManager,
    @NonNull String packageName
)
```

Retrieve the `https://developer.android.com/reference/android/content/pm/Signature.html` array for the given package. This returns some of certificates, depending on whether the package in question is multi-signed or has signing history.

Security/identity verification should **not** be done with this method. This is only intended to return some array of certificates that correspond to a package.

If verification if required, either use `https://developer.android.com/reference/androidx/core/content/pm/PackageInfoCompat#hasSignatures(android.content.pm.PackageManager,java.lang.String,java.util.Map<byte[],java.lang.Integer>,boolean)` or manually verify the set of certificates using `https://developer.android.com/reference/android/content/pm/PackageManager.html#GET_SIGNING_CERTIFICATES` or `https://developer.android.com/reference/android/content/pm/PackageManager.html#GET_SIGNATURES`.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/content/pm/PackageManager.html packageManager` | The `https://developer.android.com/reference/android/content/pm/PackageManager.html` instance to query against. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html packageName` | The package to query the {@param packageManager} for. Query by app UID is only supported by manually choosing a package name returned in `https://developer.android.com/reference/android/content/pm/PackageManager.html#getPackagesForUid(int)`. |

| Returns |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/android/content/pm/Signature.html>` | an array of certificates the app is signed with |

| Throws |
|---|---|
| `https://developer.android.com/reference/android/content/pm/PackageManager.NameNotFoundException.html` | if the package cannot be found through the provided {@param packageManager} |

### hasSignatures

Added in [1.5.0](https://developer.android.com/jetpack/androidx/releases/core#1.5.0)

```
public static boolean hasSignatures(
    @NonNull PackageManager packageManager,
    @NonNull String packageName,
    @Size(min = 1) @NonNull Map<byte[], Integer> certificatesAndType,
    boolean matchExact
)
```

Check if a package on device contains set of a certificates. Supported types are raw X509 or SHA-256 bytes.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/content/pm/PackageManager.html packageManager` | The `https://developer.android.com/reference/android/content/pm/PackageManager.html` instance to query against. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html packageName` | The package to query the {@param packageManager} for. Query by app UID is only supported by manually choosing a package name returned in `https://developer.android.com/reference/android/content/pm/PackageManager.html#getPackagesForUid(int)`. |
| `@https://developer.android.com/reference/androidx/annotation/Size(min = 1) @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/util/Map.html<byte[], https://developer.android.com/reference/java/lang/Integer.html> certificatesAndType` | The bytes of the certificate mapped to the type, either `https://developer.android.com/reference/android/content/pm/PackageManager.html#CERT_INPUT_RAW_X509` or `https://developer.android.com/reference/android/content/pm/PackageManager.html#CERT_INPUT_SHA256`. A single or multiple certificates may be included. |
| `boolean matchExact` | Whether or not to check for presence of all signatures exactly. If false, then the check will succeed if the query contains a subset of the package certificates. Matching exactly is strongly recommended when running on devices below `https://developer.android.com/reference/android/os/Build.VERSION_CODES.html#LOLLIPOP` due to the fake ID vulnerability that allows a package to be modified to include an unverified signature. |

| Returns |
|---|---|
| `boolean` | true if the package is considered signed by the given certificate set, or false otherwise |

| Throws |
|---|---|
| `https://developer.android.com/reference/android/content/pm/PackageManager.NameNotFoundException.html` | if the package cannot be found through the provided {@param packageManager} |