public class getApkSign {
public static void main(String[] args) throws IOException, Exception {
String path = "E:\\android\\workspace\\trunk\\ccplay_2016\\CCPlay_Market\\build\\outputs\\apk\\CCPlay_Market-debug.apk";// apk的路径
byte[] bytes = getSignaturesFromApk(path);
System.out.println(hexDigest(bytes));
}
public static String hexDigest(byte[] bytes) {
MessageDigest md5;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
e.printStackTrace();
return "";
}
byte[] md5Bytes = md5.digest(bytes);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
/**
* 从APK中读取签名
*
* @param file
* @return
* @throws IOException
*/
private static byte[] getSignaturesFromApk(String strFile) throws IOException {
File file = new File(strFile);
JarFile jarFile = new JarFile(file);
try {
JarEntry je = jarFile.getJarEntry("AndroidManifest.xml");
byte[] readBuffer = new byte[8192];
Certificate[] certs = loadCertificates(jarFile, je, readBuffer);
if (certs != null) {
for (Certificate c : certs) {
return c.getEncoded();
}
}
} catch (Exception ex) {
}
return null;
}
/**
* 加载签名
*
* @param jarFile
* @param je
* @param readBuffer
* @return
*/
private static Certificate[] loadCertificates(JarFile jarFile, JarEntry je, byte[] readBuffer) {
try {
InputStream is = jarFile.getInputStream(je);
while (is.read(readBuffer, 0, readBuffer.length) != -1) {
}
is.close();
return je != null ? je.getCertificates() : null;
} catch (IOException e) {
}
return null;
}
}