Как сделать приложения для Android с воспроизводимыми сборками?

По моему опыту, перекомпиляция исходного кода для одного и того же приложения Android не будет каждый раз приводить к одному и тому же двоичному файлу. Воспроизводимая сборка очень полезна для разработчиков, но я думаю, что наиболее важным преимуществом воспроизводимого процесса сборки является безопасность. В приложениях Android с открытым исходным кодом, как мы можем проверить произведенный двоичный файл (.apk) действительно составлен из проверенного исходного кода? Есть ли способ генерировать воспроизводимые сборки из Android SDK или Java?

3 ответа

"Воспроизводимая"/"детерминированная" сборка относится к процессам сборки, в которых компилятор выводит двоичный файл, который всегда идентичен, с учетом идентичных входных файлов / системы сборки /chroot. (В статье, на которую вы ссылаетесь, на самом деле говорится о возможности создания / запуска одной и той же версии приложения, в которую внесена ошибка, что является чем-то другим. См. Это описание того, как Tor делает детерминированные сборки.)

С пакетами Java работать очень сложно, поскольку временные метки присутствуют во многих местах. Вместо точной двоичной совместимости вы можете попытаться декомпилировать два.apk-файла и посмотреть, идентичен ли этот декомпилированный вывод.

Проект F-Droid уже пару лет работает над воспроизводимыми сборками для Android. Проблемы, связанные с Android, отслеживаются по адресу https://f-droid.org/docs/Reproducible_Builds Это все еще сложный процесс, особенно если приложение содержит код NDK. Если приложение только на Java, то есть несколько относительно простых шагов, которые помогут вам там, например, предварительная обработка PNG и передача их в git.

Google не позволяет легко воспроизводить APK в долгосрочной перспективе, так как они вносят много мелких изменений, например:

Обязательно ознакомьтесь с дифоскопом для просмотра различий между двумя сборками. Вы можете увидеть много примеров выходных данных на https://verification.f-droid.org/

Я только что обнаружил, что Telegram утверждает экспериментальные воспроизводимые сборки для своего приложения для Android: https://core.telegram.org/reproducible-builds , поэтому, возможно, стоит изучить, как они этого достигают.

Процедура использует Docker для сборки и в конце сравнивает APK с:

      python apkdiff.py telegram_store.apk telegram_built.apk

что предполагает, что они не байт за байтом одинаковы.

apkdiff.pyприсутствует в дереве по адресу: https://github.com/DrKLO/Telegram/blob/e1c101c334c80387cf10ca9857052e70e19c60af/apkdiff.py

Другие вопросы по тегам