根据我的经验,重新编译同一Android应用程序的源代码不会每次都生成相同的二进制文件。对于开发人员来说,可重现的构建非常useful,但我认为可重现的构建过程最重要的好处是安全性。在开源Android应用程序中,我们如何验证生成的二进制文件(.apk
)是否真的是根据已审查的源代码编译的?有没有办法从Android SDK或Java生成可重现的构建?
答案 0 :(得分:2)
“Reproducible”/“deterministic”构建是指构建过程,其中编译器在给定相同的输入文件/构建系统/ chroot的情况下输出始终相同的二进制文件。 (您链接到的文章实际上是在谈论能够构建/运行相同版本的应用程序,该错误被提交,这是不同的。请参阅this description Tor如何进行确定性构建。)
Java包似乎很难使用,因为时间戳存在于许多地方。您可以尝试的一件事,代替完全二进制兼容性,是反编译两个.apk,并查看反编译输出是否相同。
答案 1 :(得分:1)
F-Droid项目几年来一直致力于为Android提供可重复的构建。特定于Android的问题在https://f-droid.org/docs/Reproducible_Builds进行跟踪。这仍然是一个棘手的过程,特别是如果应用程序包含NDK代码。如果应用程序只是Java,那么有一些相对简单的步骤可以帮助您实现,例如预先处理PNG并将它们提交给git。
从长远来看,Google并不容易重现APK,因为他们会做很多随机的小改动,例如:绝对查看diffoscope以查看两个版本之间的差异。您可以在https://verification.f-droid.org
看到大量示例输出答案 2 :(得分: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