在没有 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 现在可以在没有 运行 任何错误的情况下构建。
希望这对某人有所帮助
我正在设置 CI 服务器 运行 TeamCity。
服务器是运行openjdk8,我用的是build tools 23.0.2
我有一个 multidex Android 应用程序,我可以使用 assembleMyFlavorRelease 在本地构建它。 app:transformClassesWithDexForMyFlavorRelease
堆栈跟踪显示 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 现在可以在没有 运行 任何错误的情况下构建。
希望这对某人有所帮助