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 = statusView on GitHub (pinned to 157c9d86ac)
Solutions
- Ensure the calling package is installed and queryable with GET_SIGNATURES
- 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.