在没有 Android Studio 的情况下使用 gradle 构建 Android multidex 应用程序(在构建服务器上)

Building an Android multidex application using gradle without Android Studio (on a build server)

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

服务器是运行openjdk8,我用的是build tools 23.0.2

我有一个 multidex Android 应用程序,我可以使用 assembleMyFlavorRelease 在本地构建它。 app:transformClassesWithDexForMyFlavorRelease

我的 TeamCity 代理上的相同构建失败

堆栈跟踪显示 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'

使用 multidex 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]

此时如有任何帮助或指导,我们将不胜感激!

事实证明这是一个资源问题,我 运行 我在没有交换的 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 交换文件,我 运行 构建在 ubuntu AMI 运行 上 T2.Small。

在我的 AMI 上:

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

为了在重启后继续存在,我将以下行添加到 /etc/fstab

/swap    none    swap    sw    0    0

在此之后,我的 T2 现在可以在没有 运行 任何错误的情况下构建。

希望这对某人有所帮助