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.

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.

Appendix: 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)