如何使用可重现的构建制作Android应用程序?

时间:2013-10-22 07:11:22

标签: java android open-source binary-reproducibility

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

3 个答案:

答案 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