Android studio - 带有库项目的应用程序无法构建

Posted

技术标签:

【中文标题】Android studio - 带有库项目的应用程序无法构建【英文标题】:Android studio - App with library project fails to build 【发布时间】:2013-12-05 17:46:56 【问题描述】:

我在构建我的应用项目时遇到了很大的麻烦。我有主应用程序模块和一个库项目模块,如下所示:

这是每个模块的 gradle.build:

主应用:

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:0.6.+'
    

apply plugin: 'android'
repositories 
    mavenCentral()

android 
    compileSdkVersion 19
    buildToolsVersion '19.0.0'

    defaultConfig 
        minSdkVersion 14
        targetSdkVersion 19
    
    buildTypes 
        release 
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        
    
    productFlavors 
        defaultFlavor 
            proguardFile 'proguard-rules.txt'
        
    

dependencies 
    compile 'com.android.support:support-v13:19.0.+'
    compile 'com.google.android.gms:play-services:4.0.+'
    compile project(':libraries:datetimepicker')

这个是图书馆项目的:

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:0.6.+'
    

apply plugin: 'android-library'

repositories 
    mavenCentral()


android 
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig 
        minSdkVersion 14
        targetSdkVersion 19
    
    release 
        runProguard true
        proguardFile 'proguard-rules.txt'
        proguardFile getDefaultProguardFile('proguard-android-ptimize.txt')
    


dependencies 
    compile 'com.android.support:support-v4:19.0.+'

最后,这是项目 settings.gradle 文件。

include ':App', ':libraries:datetimepicker'

我能够成功地将包从库导入到我的应用程序代码并使用它们,但是当我尝试编译时,我得到以下信息:

Gradle: Execution failed for task ':App:compileDefaultFlavorDebug'.
> Compilation failed; see the compiler error output for details.

E:\blah\blah\MyClass.java
Gradle: error: cannot find symbol class DatePickerDialog
Gradle: error: package DatePickerDialog does not exist
Gradle: error: cannot find symbol class DatePickerDialog
Gradle: error: cannot find symbol class DatePickerDialog
Gradle: error: cannot find symbol variable DatePickerDialog
Gradle: error: method does not override or implement a method from a supertype

我已经尝试解决这个问题 3 天了,并且已经用尽了几乎所有我可以在这里找到的类似问题的解决方案。我对为 android 开发很有信心,对 gradle 没有那么自信,并且可能做了一些明显错误的事情。

一些额外的信息:

Android Studio v0.3.6 Android SDK 构建工具第 19 版 Gradle 1.8 版

关于如何解决这个问题的任何想法?

【问题讨论】:

【参考方案1】:

Gradle 构建库项目时,它会构建发布类型,即使您正在构建主应用程序的调试类型(这是 bug)。在您的库项目中,您为发布构建类型配置了 Proguard,并且 Proguard 混淆了符号名称,使它们对您的应用程序不可见。

由于您可以控制库代码,因此最好不要在库构建中运行 Proguard,而只在主应用程序的发布构建中运行它。它将混淆所有代码,包括依赖项。

如果你真的想独立混淆库代码,你需要设置 Proguard 规则来公开库的公共符号,DatePickerDialog 就是其中之一。

【讨论】:

第二段占据了我的一天。 非常感谢,我将 minifyEnabled 设置为 false,并构建成功 第二段是金 第二段节省时间 你是冠军!【参考方案2】:

只是明确地告诉 gradle 你的库项目不能通过添加/修改部分来缩小

android/buildTypes/debug

你的库项目的 build.gradle 文件是这样的(minifyEnabled false 是关键):

android 
...
    buildTypes 
        debug 
            debuggable true
            minifyEnabled false
        
...
    
...

注意:

在这里,我还明确指示 gradle 使我的“调试”构建可调试(debuggable true)。

【讨论】:

以上是关于Android studio - 带有库项目的应用程序无法构建的主要内容,如果未能解决你的问题,请参考以下文章

如何建立与 Android studio和 gradle android 库

Android Studio 库项目错误

多库项目中的 Android Studio proguard 处理

如何使用 Android Studio 和 gradle 构建一个 android 库?

如何将 Flash builder 项目作为库包含在 android Studio 中?

在 Android Studio 1.3.1 中多次导入库项目导致库消失