最近,我的一位同事说了类似的话:“由构建服务器从相同的源代码生成的连续APK(可执行文件)可能并不相同”。讨论的上下文是,对X版本执行的质量检查是否也适用于Y版本,它是由同一构建服务器(以相同的方式配置)从相同的源代码执行的。
我认为由于各种因素(例如不同的时间戳记),生成的可执行文件可能并不相同,但问题是它们在功能上是否可以不同。
我可以想到的唯一情形是,同一源代码可能产生不同的功能是多线程问题:如果多线程代码同步不正确,则在编译时执行不同的重新排序/优化操作可能会影响此同步不良的代码并更改其功能行为。
我的问题是:
任何相关材料的链接将不胜感激。
在某些情况下当然有可能。我假设您正在使用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
。我会在这里留下答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句