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

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

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

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

我的问题是:

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

任何相关 Material 的链接将不胜感激。

最佳答案

在某些情况下当然是可能的。我假设您正在使用 Gradle 构建您的 Android 应用。

案例 1:您正在使用包含在版本通配符中的第 3 方依赖项,例如:

编译 somelib.1+

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

案例 2: 您正在使用 Gradle 的 buildConfigFields 将环境信息注入(inject)您的应用程序。这些值将被注入(inject)到您应用的 BuildConfig 类中。根据您使用这些值的方式,应用行为可能会因连续构建而有所不同。

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

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

编辑:抱歉,我想我错过了您的 OP 中的一些重要信息。我的案例 2 是您的 示例,例如不同的时间戳和case 3违反了你的配置相同的方式。不过我会在这里留下答案。

https://stackoverflow.com/questions/35527794/

相关文章:

ant - 如何在项目之间最好地共享 Ant 目标?

scala - 如何构建独立的 scala 可执行文件

java - 无法解析不同风格android studio的方法 'getAllUserGroupB

build - 如何选择哪个 CMake 可执行目标将是默认目标?

ios - 此构建在 https ://itunesconnect. apple.com 上无效

haskell - 由于 native 依赖项中的 "multiple definition"链接器

build - Gulp-Inject 不起作用

iphone - Xcode:为不同的构建配置设置 GCC_PREPROCESSOR_DEFINIT

build - Intellij IDEA 项目中的自定义构建步骤

c++ - 在 CMake 中使用编译器前缀命令(distcc、ccache)