microg/GmsCore · error · StandardIntegrityException

APP_NOT_INSTALLED

APP_NOT_INSTALLED

Error message

$callingPackage signature is null

What it means

Integrity guard in IntegrityExtensions.callerAppToIntegrityData: the calling package's signature could not be read (PackageInfo.signature null), so the app cannot be fingerprinted for the Play Integrity verdict.

Source

Thrown at vending-app/src/main/kotlin/com/google/android/finsky/IntegrityExtensions.kt:110

const val PARAMS_PIA_EXPRESS_DEVICE_KEY = "piaExpressDeviceKey"

const val RESULT_UN_AUTH = "<UNAUTH>"

private const val KEY_VERSION_MAJOR = "playcore.integrity.version.major"
private const val KEY_VERSION_MINOR = "playcore.integrity.version.minor"
private const val KEY_VERSION_PATCH = "playcore.integrity.version.patch"

private const val DEVICE_INTEGRITY_SOFT_EXPIRATION_CHECK_PERIOD = 600L // 10 minutes
private const val TEMPORARY_DEVICE_KEY_VALIDITY = 64800L // 18 hours
private const val DEVICE_INTEGRITY_SOFT_EXPIRATION = 100800L // 28 hours
private const val DEVICE_INTEGRITY_HARD_EXPIRATION = 432000L // 5 day
const val INTERMEDIATE_INTEGRITY_HARD_EXPIRATION = 86400L // 1 day
private const val TAG = "IntegrityExtensions"

fun callerAppToIntegrityData(context: Context, callingPackage: String): PlayIntegrityData {
    val pkgSignSha256ByteArray = context.packageManager.getFirstSignatureDigest(callingPackage, "SHA-256")
    if (pkgSignSha256ByteArray == null) {
        throw StandardIntegrityException(IntegrityErrorCode.APP_NOT_INSTALLED, "$callingPackage signature is null")
    }
    val pkgSignSha256 = Base64.encodeToString(pkgSignSha256ByteArray, Base64.NO_WRAP)
    Log.d(TAG, "callerToVisitData $callingPackage pkgSignSha256: $pkgSignSha256")
    val playIntegrityAppList = VendingPreferences.getPlayIntegrityAppList(context)
    val loadDataSet = PlayIntegrityData.loadDataSet(playIntegrityAppList)
    if (loadDataSet.isEmpty() || loadDataSet.none { it.packageName == callingPackage && it.pkgSignSha256 == pkgSignSha256 }) {
        return PlayIntegrityData(true, callingPackage, pkgSignSha256, System.currentTimeMillis())
    }
    return loadDataSet.first { it.packageName == callingPackage && it.pkgSignSha256 == pkgSignSha256 }
}

fun PlayIntegrityData.updateAppIntegrityContent(context: Context, time: Long, result: String, status: Boolean = false) {
    val playIntegrityAppList = VendingPreferences.getPlayIntegrityAppList(context)
    val loadDataSet = PlayIntegrityData.loadDataSet(playIntegrityAppList)
    val dataSetString = PlayIntegrityData.updateDataSetString(loadDataSet, apply {
        lastTime = time
        lastResult = result
        lastStatus = status

View on GitHub (pinned to 157c9d86ac)

Solutions

  1. Ensure the calling package is installed and queryable with GET_SIGNATURES
  2. Reject or fail-closed the integrity request when the signature cannot be resolved
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at vending-app/src/main/kotlin/com/google/android/finsky/IntegrityExtensions.kt:110 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of microg/GmsCore@157c9d86ac (2026-09-06). Data as JSON: /api/errors/64c53b5ac32bfa54. Report an issue: GitHub.