【问题标题】:Building an Android multidex application using gradle without Android Studio (on a build server)在没有 Android Studio 的情况下使用 gradle 构建 Android multidex 应用程序(在构建服务器上)
【发布时间】:2016-03-08 18:09:33
【问题描述】:

我正在设置运行 TeamCity 的 CI 服务器。

服务器运行的是openjdk8,我使用的是构建工具23.0.2

我有一个 multidex Android 应用程序,我可以使用 assembleMyFlavorRelease 在本地构建它。我在 app:transformClassesWithDexForMyFlavorRelease 上的 TeamCity 代理上的相同构建失败了

stacktrace 显示 java 以 1 退出,但我似乎找不到原因

[Gradle failure report] Execution failed for task ':app:transformClassesWithDexForMyFlavorRelease'.
[Gradle failure report] >
com.android.build.api.transform.TransformException:
com.android.ide.common.process.ProcessException:
java.util.concurrent.ExecutionException:
com.android.ide.common.process.ProcessException: 
org.gradle.process.internal.ExecException: 
Process 'command '/usr/lib/jvm/java-8-openjdk-amd64/bin/java'' finished with non-zero exit value 1

Exception is:
[Gradle failure report] org.gradle.api.tasks.TaskExecutionException:
Execution failed for task ':app:transformClassesWithDexForMyFlavorRelease'.
....
Caused by: 
java.lang.RuntimeException: com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-8-openjdk-amd64/bin/java'' finished with non-zero exit value 1
....
Caused by: 
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-8-openjdk-amd64/bin/java'' finished with non-zero exit value 1

我的 app.gradle 是这样的

productFlavors {

    final def MIN_SDK = 19
    final def TARGET_SDK = 23

    myFlavor {
        minSdkVersion MIN_SDK
        targetSdkVersion TARGET_SDK
        multiDexEnabled true
    }

使用这些 dex 选项

dexOptions {
    javaMaxHeapSize "4g"
    preDexLibraries false
 }

编译

compileSdkVersion 23
buildToolsVersion '23.0.2'

使用多索引 1.0.1

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

构建代理完成了两者

:app:collectMyFlavorReleaseMultiDexComponents
:app:transformClassesWithMultidexlistForMyFlavorRelease

在失败之前

app:transformClassesWithDexForMyFlavorRelease

使用信息运行会在退出前显示这一点

[org.gradle.launcher.daemon.client.DaemonClient] Received result Failure[value=org.gradle.initialization.ReportedException:
org.gradle.internal.exceptions.LocationAwareException: Execution failed for task ':app:transformClassesWithDexForMyFlavor'.] 
from daemon DaemonInfo{pid=2200, 
address=[a10b64d0-94c0-40e9-8b5d-b5a5bbb171c4 port:46291, addresses:[/0:0:0:0:0:0:0:1%lo, /127.0.0.1]], idle=false,
context=DefaultDaemonContext[uid=968a9ee5-e6d4-4cba-a2a5-ce768ecbfe44,
javaHome=/usr/lib/jvm/java-8-openjdk-amd64,
daemonRegistryDir=/root/.gradle/daemon,pid=2200,idleTimeout=120000,
daemonOpts=-XX:MaxPermSize=512m,-XX:+HeapDumpOnOutOfMemoryError,-Xmx2048m,-Dfile.encoding=UTF-8,
-Duser.country=US,-Duser.language=en,-Duser.variant]

在这一点上的任何帮助或指导将不胜感激!

【问题讨论】:

  • “堆栈跟踪显示 java 以 1 退出,但我似乎无法找到原因”——您确定在这部分输出之前没有任何内容吗?
  • 是的,我所看到的只是在堆栈跟踪失败之前:构建失败并出现异常。
  • 如果您还没有这样做,请尝试常规的命令行 Gradle 构建(例如,gradle assembleDebug)。在配备 Android Studio 的机器和 TeamCity 服务器上试用。如果他们都成功了,那么问题可能与 TeamCity 集成有关。如果它们都失败了,则问题可能与 Gradle 构建文件有关。如果开发者机器成功但 TeamCity 服务器失败,则问题可能与环境中的其他内容(例如 JDK 版本)有关。
  • 在本地和构建服务器上运行assembleDebug,它在本地工作正常,但在服务器上失败。我用信息日志输出更新了帖子。构建服务器正在运行我正在运行的 OpenJDK1.8 Java(TM) SE Runtime Environment (build 1.8.0_25-b17)

标签: java android teamcity android-multidex


【解决方案1】:

原来这是一个资源问题,我在没有交换的情况下在 AWS AMI 上运行构建,并且 dexer 内存不足。我在只有2g ram 的AMI 上将javaMaxHeapSize 设置为4g 也无济于事。

为了解决这个问题,我首先将 javaMaxHeapSize 减少到 2g

dexOptions {
    javaMaxHeapSize "2g"
    preDexLibraries false
}

2g 似乎足以让 dexing 避免在我的构建中抛出 java.lang.OutOfMemoryError: GC overhead limit exceeded。我的项目包含 Google Analytics 库,并且在使用默认 dex 堆大小构建时遇到了问题。

在 AMI 方面,我创建了一个 2G 交换文件,我在 T2.Small 上运行的 ubuntu AMI 上运行构建。

在我的 AMI 上:

sudo fallocate -l 2G /swap
sudo mkswap /swap
sudo swapon /swap

为了在重启后保持不变,我将以下行添加到 /etc/fstab

/swap    none    swap    sw    0    0

在此之后,我的 T2 现在能够构建而不会遇到任何错误。

希望这对某人有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2010-12-16
    • 2017-03-03
    • 2017-10-06
    • 2018-06-11
    相关资源
    最近更新 更多