Gradle 在执行`gradle clean assemble<BuildVarian>` 时不包括模块依赖
Gradle doesn't include module dependencies when executing `gradle clean assemble<BuildVarian>`
我有一个多模块 Android 项目。环境的一些输入数据:
Android Studio 1.0.1
Gradle 2.2.1 (Gradle Wrapper)
Java 1.7.0_71
Android Gradle Plugin: 1.0.1
compileSdkVersion = 21
buildToolsVersion = '21.1.2'
minSdkVersion = 14
targetSdkVersion = 21
当我 运行 来自 Android Studio 的项目时。应用程序在设备上正确编译和执行(对于所有构建变体)。但是当我尝试使用 ./gradlew clean assembleDebug
或任何其他构建变体(我有 4 个:调试、alpha、beta、发布)从终端 assemble
应用程序时,构建成功但是当我尝试 运行 如果模块项目中定义的任何 class 出现 java.lang.NoClassDefFoundError
应用程序崩溃。
我已将 ProGuard 排除在外,因为它 运行 仅在发布变体上。但是这个问题对于所有构建都是一致的。
我还检查了模块不包含重复的依赖项。
编辑
一个可能的堆栈跟踪:
9553-9553/my.package.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: my.package.app, PID: 9553
java.lang.NoClassDefFoundError: my.package.module1.Go
at my.package.app.MyApplication.onCreate(MyApplication.java:59)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4729)
at android.app.ActivityThread.access00(ActivityThread.java:174)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1367)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
如您所见,class Go
是包 my.package.module1
的一部分,它在子模块 :module1
中定义(参见构建脚本源)。
gradle 构建的一部分:
buildscript {
repositories {
mavenCentral()
}
dependencies{
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
}
}
apply plugin: 'android-sdk-manager'
apply plugin: 'com.android.application'
android {
// ...
// Compile and tools version
defaultConfig {
// Target sdk and so on
applicationId 'my.package.app'
// ...
// Other stuff regarding version
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
buildTypes {
release { // ... }
alpha { // ... }
beta { // ... }
debug { // ... }
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
dependencies {
// ...
// Standatrt dependencies like support lib and others
compile project(':module1')
compile project(':module2')
compile project(':module3')
// Other moduels
}
在尝试构建脚本并比较 AS assemble 构建与终端构建的方式后,我发现了下一个差异:
- 当 AS 清理项目时,它还会为所有模块项目执行
generate<BuildVarian>Sources
和 generate<BuildVarian>TestSources
(这样安排的方式总是在 运行 实际 assemble 命令)
- 当 运行
./gradlew clean assembleDebug
从终端接缝时 gradle 没有按时获取导出的子模块 arrs。可能是 Gradle 2.2 (2.2.1) 或 Android Gradle 插件中的错误 - 我不记得以前的版本有这样的问题
- 当运行
./gradlew clean generateDebugSources generateDebugTestSources assembleDebug
问题仍然存在- 可能也与错误有关。
临时解决方案
依次执行以下命令:
# ./gradlew clean generate<BuildVariant>Sources generate<BuildVariant>TestSources
# ... task output
# ...
# ./gradlew assemble<BuildVariant>
这样输出的 apk 是 assembled 所有模块项目
长期解决方案
发出问题单 here
我有一个多模块 Android 项目。环境的一些输入数据:
Android Studio 1.0.1
Gradle 2.2.1 (Gradle Wrapper)
Java 1.7.0_71
Android Gradle Plugin: 1.0.1
compileSdkVersion = 21
buildToolsVersion = '21.1.2'
minSdkVersion = 14
targetSdkVersion = 21
当我 运行 来自 Android Studio 的项目时。应用程序在设备上正确编译和执行(对于所有构建变体)。但是当我尝试使用 ./gradlew clean assembleDebug
或任何其他构建变体(我有 4 个:调试、alpha、beta、发布)从终端 assemble
应用程序时,构建成功但是当我尝试 运行 如果模块项目中定义的任何 class 出现 java.lang.NoClassDefFoundError
应用程序崩溃。
我已将 ProGuard 排除在外,因为它 运行 仅在发布变体上。但是这个问题对于所有构建都是一致的。
我还检查了模块不包含重复的依赖项。
编辑
一个可能的堆栈跟踪:
9553-9553/my.package.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: my.package.app, PID: 9553
java.lang.NoClassDefFoundError: my.package.module1.Go
at my.package.app.MyApplication.onCreate(MyApplication.java:59)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4729)
at android.app.ActivityThread.access00(ActivityThread.java:174)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1367)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
如您所见,class Go
是包 my.package.module1
的一部分,它在子模块 :module1
中定义(参见构建脚本源)。
gradle 构建的一部分:
buildscript {
repositories {
mavenCentral()
}
dependencies{
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
}
}
apply plugin: 'android-sdk-manager'
apply plugin: 'com.android.application'
android {
// ...
// Compile and tools version
defaultConfig {
// Target sdk and so on
applicationId 'my.package.app'
// ...
// Other stuff regarding version
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
buildTypes {
release { // ... }
alpha { // ... }
beta { // ... }
debug { // ... }
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
dependencies {
// ...
// Standatrt dependencies like support lib and others
compile project(':module1')
compile project(':module2')
compile project(':module3')
// Other moduels
}
在尝试构建脚本并比较 AS assemble 构建与终端构建的方式后,我发现了下一个差异:
- 当 AS 清理项目时,它还会为所有模块项目执行
generate<BuildVarian>Sources
和generate<BuildVarian>TestSources
(这样安排的方式总是在 运行 实际 assemble 命令) - 当 运行
./gradlew clean assembleDebug
从终端接缝时 gradle 没有按时获取导出的子模块 arrs。可能是 Gradle 2.2 (2.2.1) 或 Android Gradle 插件中的错误 - 我不记得以前的版本有这样的问题 - 当运行
./gradlew clean generateDebugSources generateDebugTestSources assembleDebug
问题仍然存在- 可能也与错误有关。
临时解决方案
依次执行以下命令:
# ./gradlew clean generate<BuildVariant>Sources generate<BuildVariant>TestSources
# ... task output
# ...
# ./gradlew assemble<BuildVariant>
这样输出的 apk 是 assembled 所有模块项目
长期解决方案
发出问题单 here