6

根据我的经验,为同一个 Android 应用程序重新编译源代码不会每次都生成相同的二进制文件。可重现的构建对开发人员非常有用,但我认为可重现构建过程最重要的好处是安全性。在开源 Android 应用程序中,我们如何验证生成的二进制文件 ( .apk) 是否真的是从经过审查的源代码编译而来的?有没有办法从 Android SDK 或 Java 生成可重现的构建?

4

3 回答 3

2

“可重现”/“确定性”构建是指编译器在给定相同的输入文件/构建系统/chroot 的情况下输出始终相同的二进制文件的构建过程。(您链接到的文章实际上是在讨论能够构建/运行相同版本的应用程序,这是针对错误提交的,这是不同的。请参阅有关Tor 如何进行确定性构建的描述。)

Java 包似乎很难使用,因为时间戳存在于很多很多地方。您可以尝试的一件事是对两个 .apk 进行反编译,而不是精确的二进制兼容性,并查看反编译后的输出是否相同。

于 2013-12-06T22:48:58.037 回答
2

F-Droid 项目几年来一直致力于 Android 的可重现构建。Android 特定问题在https://f-droid.org/docs/Reproducible_Builds进行了跟踪。 这仍然是一个棘手的过程,尤其是在应用程序包含 NDK 代码的情况下。如果应用程序只有 Java,那么有一些相对简单的步骤可以让你到达那里,比如预先处理 PNG 并将它们提交到 git。

从长远来看,谷歌并不容易复制 APK,因为它们会做很多随机的小改动,比如:

绝对检查diffoscope以查看两个构建之间的差异。您可以在https://verification.f-droid.org看到很多示例输出

于 2018-01-12T15:18:46.267 回答
0

我刚刚发现 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

于 2021-03-02T19:51:16.670 回答