Gradle 在执行"gradle 干净汇编"时不包含模块依赖项<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应用程序时,构建成功,但当我尝试运行它时,应用程序崩溃并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.access$1600(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)

如您所见,类 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 组装构建与终端构建的方式进行比较后,我偶然发现了下一个差异:

  1. 当 AS 清理项目时,它还会为所有模块项目执行generate<BuildVarian>Sourcesgenerate<BuildVarian>TestSources(这是以这样一种方式安排的,即它总是在运行实际的 assemble 命令之前执行)
  2. 从终端运行./gradlew clean assembleDebug时,gradle 无法按时获取导出的子模块 arrs。可能是 Gradle 2.2 (2.2.1) 或 Android Gradle 插件中的错误 - 我不记得以前的版本有这样的问题
  3. 运行时./gradlew clean generateDebugSources generateDebugTestSources assembleDebug问题仍然存在 - 可能也与错误有关。

临时解决方案

顺序执行以下命令:

# ./gradlew clean generate<BuildVariant>Sources generate<BuildVariant>TestSources
# ... task output
# ...
# ./gradlew assemble<BuildVariant>

这样,输出apk与所有模块项目组装在一起

长期解决方案

在这里发出了发行票

最新更新