Get the PackageInfo of specified package.
31 | * @param context 32 | * @param pkgName the package name 33 | * @return 34 | * @throws PackageManager.NameNotFoundException 35 | */ 36 | public PackageInfo getPackageInfo(@NonNull Context context, @NonNull String pkgName) throws PackageManager.NameNotFoundException { 37 | return context.getPackageManager().getPackageInfo(pkgName, 0); 38 | } 39 | 40 | /** 获取签名的MD5摘要 */ 41 | public String getSignatureDigest(@NonNull PackageInfo pkgInfo) { 42 | int length = pkgInfo.signatures.length; 43 | if (length <= 0) { 44 | return ""; 45 | } 46 | 47 | Signature signature = pkgInfo.signatures[0]; 48 | MessageDigest md5 = null; 49 | try { 50 | md5 = MessageDigest.getInstance("MD5"); 51 | } catch (NoSuchAlgorithmException e) { 52 | e.printStackTrace(); 53 | // Should not occur 54 | } 55 | byte[] digest = md5.digest(signature.toByteArray()); // get digest with md5 algorithm 56 | return toHexString(digest); 57 | } 58 | 59 | /** 将字节数组转化为对应的十六进制字符串 */ 60 | private String toHexString(byte[] rawByteArray) { 61 | char[] chars = new char[rawByteArray.length * 2]; 62 | for (int i = 0; i < rawByteArray.length; ++i) { 63 | byte b = rawByteArray[i]; 64 | chars[i*2] = HEX_CHAR[(b >>> 4 & 0x0F)]; 65 | chars[i*2+1] = HEX_CHAR[(b & 0x0F)]; 66 | } 67 | return new String(chars); 68 | } 69 | 70 | public List