{"record":{"id":"94197a6790077164","repo":"Tencent/tinker","slug":"get-public-key-md5-is-null-94197a","errorCode":null,"errorMessage":"get public key md5 is null","messagePattern":"get public key md5 is null","errorType":"exception","errorClass":"TinkerRuntimeException","httpStatus":null,"severity":"critical","filePath":"tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareSecurityCheck.java","lineNumber":170,"sourceCode":"                    }\n                } catch (Exception e) {\n                    ShareTinkerLog.e(TAG, path.getAbsolutePath(), e);\n                }\n            }\n        }\n        return false;\n    }\n\n    @SuppressLint(\"PackageManagerGetSignatures\")\n    private void init(Context context) {\n        ByteArrayInputStream stream = null;\n        try {\n            PackageManager pm = context.getPackageManager();\n            String packageName = context.getPackageName();\n            PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);\n            mPublicKeyMd5 = SharePatchFileUtil.getMD5(packageInfo.signatures[0].toByteArray());\n            if (mPublicKeyMd5 == null) {\n                throw new TinkerRuntimeException(\"get public key md5 is null\");\n            }\n        } catch (Exception e) {\n            throw new TinkerRuntimeException(\"ShareSecurityCheck init public key fail\", e);\n        } finally {\n            SharePatchFileUtil.closeQuietly(stream);\n        }\n    }\n}\n","sourceCodeStart":152,"sourceCodeEnd":179,"githubUrl":"https://github.com/Tencent/tinker/blob/1b7ea02c239840f563ea64fb5bd286eb98d4011e/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareSecurityCheck.java#L152-L179","documentation":"During ShareSecurityCheck.init, the app's signing certificate bytes are hashed with MD5; if SharePatchFileUtil.getMD5(...) returns null (digest could not be computed), TinkerRuntimeException(\"get public key md5 is null\") is thrown. The loader needs this md5 to compare with the patch's signing identity, so failing here blocks all security checks.","triggerScenarios":"Constructing ShareSecurityCheck(context) when getMD5(packageInfo.signatures[0].toByteArray()) returns null — an empty/null signature byte array fed to the digest, typically on ROMs reporting null signatures.","commonSituations":"Running on emulators or modified ROMs where PackageManager returns empty signature arrays; apps installed in unusual ways (debug bridges, some enterprise stores) with missing signer info; in practice rare — most failures surface as the wrapped exception in error 218.","solutions":["Verify the app is properly signed and installed (pm dump or apksigner verify on the APK).","Confirm context is the real application context, not a mocked/instrumented one, when the check runs.","If you ship a fork, guard for null signatures before hashing and fail closed with a clearer error.","Reinstall the APK normally and retry patch loading."],"exampleFix":"// before\nmPublicKeyMd5 = SharePatchFileUtil.getMD5(packageInfo.signatures[0].toByteArray());\n// after\nbyte[] sigBytes = packageInfo.signatures != null && packageInfo.signatures.length > 0\n        ? packageInfo.signatures[0].toByteArray() : null;\nmPublicKeyMd5 = sigBytes != null ? SharePatchFileUtil.getMD5(sigBytes) : null;","handlingStrategy":"try-catch","validationCode":"PackageInfo pi = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);\nif (pi.signatures == null || pi.signatures.length == 0 || pi.signatures[0] == null) {\n    // signature metadata unavailable: do not attempt security check\n}","typeGuard":null,"tryCatchPattern":"try {\n    ShareSecurityCheck check = new ShareSecurityCheck(context);\n} catch (TinkerRuntimeException e) {\n    // 'get public key md5 is null' or init failure: block patch loading on this install\n}","preventionTips":["Ship only properly signed release builds when testing patch flows.","Do not run patch loads from instrumented/mocked contexts.","Treat any security-check init failure as 'patching disabled', never retry in a loop."],"tags":["android","tinker","security","signature","md5"],"backgroundTag":null,"analyzedSha":"1b7ea02c239840f563ea64fb5bd286eb98d4011e","analyzedAt":"2026-08-14T15:16:52.110Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}