1

在已签名的 apk 中,会有一个META-INF/MANIFEST.MF文件。在这个文件中,我们可以找到这样的摘要:

名称:res/layout/main.xml SHA1-摘要:NJ1YLN3mBEKTPibVXbFO8eRCAr8=

名称:AndroidManifest.xml SHA1-摘要:BlnC6ZBDtQYWeJNiespsQve82wY=

名称:res/drawable-mdpi/ic_launcher.png SHA1-摘要: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,或者与我的代码有什么不同?

非常感谢!

4

1 回答 1

2

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

于 2012-05-24T09:00:01.320 回答