在签名的apk中,会有一个 META-INF / MANIFEST.MF 文件。在这个文件中,我们可以找到这样的摘要:
名称:res / layout / main.xml SHA1-Digest:NJ1YLN3mBEKTPibVXbFO8eRCAr8 =
名称:AndroidManifest.xml SHA1-Digest:BlnC6ZBDtQYWeJNiespsQve82wY =
名称:res / drawable-mdpi / ic_launcher.png SHA1-Digest: 4ss2KZ3FzkmfE6HAAsVu0aJKx1U =
我找到了一种在java中生成摘要的方法:
public static void main(String[] args) throws NoSuchAlgorithmException, Exception {
MessageDigest md = MessageDigest.getInstance("sha-1");
FileInputStream in = new FileInputStream("./ic_launcher.png");
int bytes = 0;
while ((bytes = in.read()) != -1) {
md.update((byte)bytes);
}
in.close();
byte[] thedigest = md.digest();
System.out.println(Base64Encoder.encode(thedigest));
}
为了进行测试,我使用这个简单的代码来生成一些摘要,这些摘要与apk中的 META-INF / MANIFEST.MF 的摘要大致相同,并且仍有少量的摘要例外。像这个Png文件:
在apk中,此png文件的摘要是 4ss2KZ3FzkmfE6HAAsVu0aJKx1U = ,这与我上面的代码生成的 sjmKOs4BYDXg7COdeTc8tIfPBR0 = 非常不同。
但是如何解释我的代码生成的近20个摘要与apk中的摘要相同,只有这个Png的摘要是不同的?
您能告诉我SDK或ADT如何为Android应用程序包的资源生成SHA1-Digest,或者与我的代码有什么不同?
非常感谢!
答案 0 :(得分:2)
创建APK文件的aapt Android工具会对其输入进行一些处理。除了将XML资源转换为二进制形式外,它还优化了PNG文件。您最有可能获取原始PNG文件的哈希值,而APK中的PNG文件已经以某种方式处理(压缩等),并且它的哈希(摘要)是不同的。如果您解压缩导出的APK并在包中获取PNG的哈希值,则应获得相同的哈希值。