SDK或ADT如何为Android应用程序包的资源生成SHA1-Digest

时间:2012-05-24 02:58:20

标签: android message-digest

在签名的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文件:enter image description here

在apk中,此png文件的摘要是 4ss2KZ3FzkmfE6HAAsVu0aJKx1U = ,这与我上面的代码生成的 sjmKOs4BYDXg7COdeTc8tIfPBR0 = 非常不同。

但是如何解释我的代码生成的近20个摘要与apk中的摘要相同,只有这个Png的摘要是不同的?

您能告诉我SDK或ADT如何为Android应用程序包的资源生成SHA1-Digest,或者与我的代码有什么不同?

非常感谢!

1 个答案:

答案 0 :(得分:2)

创建APK文件的aapt Android工具会对其输入进行一些处理。除了将XML资源转换为二进制形式外,它还优化了PNG文件。您最有可能获取原始PNG文件的哈希值,而APK中的PNG文件已经以某种方式处理(压缩等),并且它的哈希(摘要)是不同的。如果您解压缩导出的APK并在包中获取PNG的哈希值,则应获得相同的哈希值。