将调试模式下的共享库与Android Studio(v2 +)

时间:2016-02-10 10:32:45

标签: android android-studio

很久以前,a Google Code ticket被打开了,因为Gradle插件不会传播,无论你是在为一个依赖的android库做一个调试版本还是一个发布版本:

  

说明:
  无论您是在做Gradle插件,Gradle插件都不会传播   调试构建或发布构建到依赖的android库。

     

版本信息:
  gradle插件:0.3 gradle:1.4

这是一个问题,尤其是当库的release配置阻止代码版本或调试过程正常发生时(本机方法的红色突出显示,因为IDE在链接时不再找到它们)通常,破旧的Java逐步调试......)。

在Google代码和Stack Overflow上已经对此进行了彻底的讨论,Kane O'Riley a really interesting (and clean) workaround提出My Gradle config

  

把它放在你的应用中:    dependencies { debugCompile project(path: ':custom_lib', configuration: "libraryDebug") releaseCompile project(path: ':custom_lib', configuration: "libraryRelease") }

  并在你的图书馆的build.gradle中添加:    defaultPublishConfig 'release' publishNonDefault true productFlavors { library { } }

我试了一下,但是我在Gradle同步时有以下消息:

Error:Configuration with name 'libraryDebug' not found. 

我尝试过" debug"和" release" (这是我在lib中使用的构建配置名称)但结果是一样的。

有什么想让这个有趣的解决方法有效吗? (我正在运行Android Studio 2.0 beta 2)

附录

  • 我的lib build.gradle文件(包括我目前正在使用的丑陋的解决方法):

    apply plugin: 'com.android.library'
    
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"
    
        // THIS IS WHERE I INSERT THE THREE STATEMENTS PERTAINING
        // TO THE LIB FROM Kane O'Riley'S WORKAROUND ABOVE
    
        defaultConfig {
            minSdkVersion 16
            targetSdkVersion 21
        }
    
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }
    
        buildTypes {
            /*
            release {
                // UNCOMMENT BEFORE MAKING AN ACTUAL RELEASE !!! (duh...)
                ndk {
                    moduleName "mylib"
                    ldLibs "log"
                    cFlags "-fvisibility=hidden -g0 -DSHLUBLU_ACTUAL_RELEASE -O3"
                }
    
                buildConfigField "boolean", "actualRelease", "true"
                debuggable false
                jniDebuggable false
                minifyEnabled false
            }
            */
    
            release {
                // COMMENT THIS WHOLE BLOCK BEFORE MAKING AN ACTUAL RELEASE !!!
                // (this is a copy of the "debug" config below... did I say 'duh' ?)
                ndk {
                    moduleName "mylib"
                    ldLibs "log"
                    cFlags "-g"
                }
    
                buildConfigField "boolean", "actualRelease", "false"
                debuggable true
                jniDebuggable true
                minifyEnabled false
            }
    
            debug {
                // IF ONLY THIS ONE WAS USED WHEN DEBUGGING!
                // (Only the IDE uses that, but the release build is actually linked,    
                // see https://code.google.com/p/android/issues/detail?id=52962 )
                ndk {
                    moduleName "mylib"
                    ldLibs "log"
                    cFlags "-g"
                }
    
                buildConfigField "boolean", "actualRelease", "false"
                debuggable true
                jniDebuggable true
                minifyEnabled false
            }
        }     
    }    
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])     
    }
    
  • 我的项目build.gradle档案

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"
    
        defaultConfig {
            minSdkVersion 16
            targetSdkVersion 21
            versionCode 27
            versionName "1.4"
        }
    
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }
    
        buildTypes {
            release {
                debuggable false
                jniDebuggable false
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android-shlublu.txt'), 'proguard-rules.pro'
            }
    
            debug {
                debuggable true
                jniDebuggable true
                minifyEnabled false
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile project(':mylib')
        // THE LINE ABOVE IS WHAT I REPLACE BY Kane O'Riley's WORKAROUND
        // DESCRIBED AT THE BEGINNING OF THIS POST
    }
    
  • 我的Gradle配置

enter image description here

2 个答案:

答案 0 :(得分:8)

要实现此功能,必须同时修改两个build.gradle文件,然后才能同步一次。我必须遵循以下步骤:

  • 第1步:修改lib的build.gradle,正如凯恩所说:

    // "android" section:
    defaultPublishConfig 'release' 
    publishNonDefault true 
    productFlavors {
        library {
            /* This strange empty flavour is actually needed 
               for the step 3 to be successful               */
        } 
    }
    
  • 第2步:清理/重建

  • 第3步:修改应用的build.gradle,同时凯恩说:

    dependencies {
        debugCompile project(path: ':custom_lib', configuration: "libraryDebug")
        releaseCompile project(path: ':custom_lib', configuration: "libraryRelease") 
    }
    
  • 第4步:Gradle sync。

因此,只需首先更改库,然后在修改应用程序之前进行清理。

我检查了由debugrelease构建模式生成的APK,并且每个都包含lib的正确变体,与应用此变通方法之前不同,所以它确实有效(感谢Kane! )。

答案 1 :(得分:1)

无论我使用什么步骤,Shlublu的解决方案对我都不起作用。

经过多次挖掘,发现可以定义可用的配置(至少使用实验gradle),这反过来避免了必须清理/重建以避免修复所有错误。

使用最新的gradle和AS2.1,我能够通过一个非常简单的依赖内容来解决这个问题:

Lib的build.gradle(使用实验gradle 0.7.0):

model {
  android {
...
    productFlavors {
       create('all') {
         ...
       }
    }
    publishNonDefault true
  }
}
configurations {
  allDebug
  allRelease
}

App的build.gradle(使用标准gradle 2.1.0):

debugCompile project(path: ':lib', configuration: 'allDebug')
releaseCompile project(path: ':lib', configuration: 'allRelease')

我非常确定如果仅使用调试/发布配置,则不需要lib的gradle中的productFlavors,如下所示:

Lib的build.gradle(使用实验gradle 0.7.0):

model {
...
}
configurations {
  debug
  release
}

App的build.gradle(使用标准gradle 2.1.0):

debugCompile project(path: ':lib', configuration: 'debug')
releaseCompile project(path: ':lib', configuration: 'release')