可以从相同的源代码构建产生功能不同的可执行文件吗?

Vas*_*liy 12 java android build

最近,我的一位同事说了这样的话:"构建服务器从同一源代码生成的连续APK(可执行文件)可能不一样".此讨论的上下文是在构建X上执行的QA是否也适用于构建Y,它由相同的源代码由相同的构建服务器(以相同方式配置)执行.

我认为由于各种因素(例如,不同的时间戳),生成的可执行文件可能不完全相同,但问题是它们是否可以在功能上不同.

我能想到的唯一情况是,相同的源代码可以产生不同的功能,这就是多线程问题:在多线程代码同步不正确的情况下,在编译时执行不同的重新排序/优化操作可能会影响这个不良同步的代码并改变其功能行为.

我的问题是:

  1. 由相同源代码的同一构建服务器执行的连续构建是否可以在功能上不同?
  2. 如果#1为真,这些差异是否仅限于错误同步的多线程代码?
  3. 如果#2为假,那么其他可以改变的部分是什么?

任何相关材料的链接将不胜感激.

Los*_*boy 5

我认为不同的功能可能仅由环境差异引起,或者您使用的是某些第三方库的快照版本,因此它在一段时间后更新.

一些建议:如果可以重建它,使用详细的构建工具模式(例如maven中的-X)并逐行比较输出与一些diff程序


tre*_*r-e 5

在少数情况下肯定是可能的.我假设您正在使用Gradle构建您的Android应用.

情况1:您正在使用版本通配符附带的第三方依赖项,例如:

compile somelib.1+

在这种情况下,依赖项可能会发生变化,因此强烈建议使用显式依赖项版本.

案例2:您使用Gradle的buildConfigFields将环境信息注入您的应用程序.这些值将注入您的应用程序BuildConfig类.根据您使用这些值的方式,应用程序行为可能会因连续构建而异.

案例3:您在连续构建之间更新CI上的JDK.虽然我认为极不可能,但您的应用行为可能会根据其编译方式而改变.例如,您可能在JDK中遇到了一个在更高版本中得到修复的边缘情况,导致以前工作过的代码采取不同的行为.

我认为这回答了你的第一个问题和第二个问题.

编辑:对不起,我想我错过了OP的一些重要信息.我的案例2是您e.g. different timestamp和案例3违反您的案例的一个例子configured the same way.我会在这里留下答案.