Как SDK или ADT создают SHA1-дайджест для ресурсов пакетов приложений Android

В подписанном 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));
}

Для тестирования я использовал этот простой код для создания некоторых дайджестов, которые в основном совпадают с дайджестами META-INF/MANIFEST.MF в apk, но все же имеют небольшое количество исключений. Как этот файл Png: введите здесь описание изображения

В apk дайджест для этого png-файла имеет вид 4ss2KZ3FzkmfE6HAAsVu0aJKx1U= , который сильно отличается от sjmKOs4BYDXg7COdeTc8tIfPBR0=, сгенерированного моим кодом выше.

Но как объяснить, что почти 20 дайджестов, сгенерированных моим кодом, такие же, как дайджесты в apk, и только этот дайджест Png отличается?

Не могли бы вы рассказать мне, как SDK или ADT генерируют SHA1-дайджест для ресурсов пакетов приложений Android, или чем он отличается от моего кода?

Большое спасибо!


person hardPass    schedule 24.05.2012    source источник


Ответы (1)


Android-инструмент aapt, который создает файлы APK, выполняет некоторую обработку своих входных данных. Помимо преобразования ресурсов XML в двоичную форму, он также оптимизирует файлы PNG. Вы, скорее всего, берете хэш исходного файла PNG, а файл PNG в APK был каким-то образом обработан (сжат и т.д.), и его хэш (дайджест) другой. Если вы разархивируете экспортированный APK и возьмете хэш PNG внутри пакета, вы должны получить такое же значение хеш-функции.

person Nikolay Elenkov    schedule 24.05.2012