当前位置: 首页 > 知识库问答 >
问题:

将调试模式下的共享库与Android Studio(v2)链接的变通方法

莫誉
2023-03-14

很久以前,Google Code票证被打开,因为Gradle插件不会将您是在进行调试构建还是发布构建传播到依赖的android库:

描述:
Gradle插件不会将调试版本或发布版本传播到依赖的android库。

版本信息:
渐变插件:0.3渐变:1.4

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

这在Google Code和Stack Overflow上进行了非常彻底的讨论,碰巧Kane O'Riley提出了一个非常有趣(且干净)的解决方法:

将其放入应用程序依赖项{debugCompile project(路径:':custom_lib',配置:“libraryDebug”)releaseCompile project(路径:':custom_lib',配置:“libraryRelease”)}

和库的构建中。gradle add:defaultPublishConfig'release'PublishNonfault true productFlavors{library{}

我试过了,但我在Gradle同步时间收到了以下消息:

Error:Configuration with name 'libraryDebug' not found. 

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

有什么想法可以让这个有趣的解决方法发挥作用吗?(我正在运行Android Studio 2.0 beta 2)

附录:

>

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配置:

共有2个答案

鲜于海
2023-03-14

无论我使用什么步骤,Shlublu的解决方案都不适用于我。

经过大量挖掘,我们发现可以定义可用的配置(至少使用实验梯度),从而避免了为了修复所有错误而必须进行清理/重建。

在AS2中使用最新的gradle。1.我通过一个非常简单的依赖项内容解决了这个问题:

Lib的身材。gradle(使用实验gradle 0.7.0):

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

应用程序的构建。gradle(使用标准gradle 2.1.0):

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

我很确定,如果只使用调试/发布配置,则不需要库的gradle中的productFlavors,比如:

Lib的身材。gradle(使用实验gradle 0.7.0):

model {
...
}
configurations {
  debug
  release
}

应用程序的构建。gradle(使用标准gradle 2.1.0):

debugCompile project(path: ':lib', configuration: 'debug')
releaseCompile project(path: ':lib', configuration: 'release')
周枫涟
2023-03-14

为了实现这一点,需要构建两个。gradle在同步一次之前,不能同时修改文件。我必须遵循以下步骤:

>

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

    // "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,正如Kane所说:

    dependencies {
        debugCompile project(path: ':custom_lib', configuration: "libraryDebug")
        releaseCompile project(path: ':custom_lib', configuration: "libraryRelease") 
    }
    

    第4步:Gradle同步。

    所以这只是一个先更改库,然后在修改应用程序之前进行清理的问题。

    我检查了由debugrelease构建模式生成的APK,每个模式都包含正确的库变量,这与应用此解决方案之前不同,因此它确实有效(感谢凯恩!)。

  •  类似资料:
    • 问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?

    • 我试图将我编译的简单共享库(libhello.so)链接到我的本机C++代码中。库libhello.so文件是: 1。Get13.h 2.get13.cpp Android文件是: 1。myapplication/jni/android.mk 问题是,在gradle构建过程中,我在文件native-lib.cpp中得到了这个错误: 我使用android NDK包中包含的make_standalon

    • 我正在尝试链接一个名为libtest lib的预编译共享库文件。所以这是我在CMakeLists的底部所拥有的。txt: 如上所述,我得到以下错误: 如果我注释掉add_library行,我会得到以下结果: 在库中链接时,似乎绝对需要源文件(.c、cpp等)。但我如何在一个。那档案呢?这些文档对target_link_库()做了如下介绍: 被命名的必须是由add_executable()或add_

    • 问题内容: 我正在尝试使用集成使用我的应用程序编写的第三方库。我已经为测试编写了所有的python代码。我很难找到设置此示例的方法。 我有一个手动创建的文件。第三方给了我a和a 。据我所知,没有其他依赖项。有人可以提供使用和进行设置的示例吗? 谢谢 问题答案: 当然可以! (在下文中,我假设你已经知道如何处理之间和交互和,如果这不是完全的情况下,只问我会开发部分以及) 示例(来自我的C ++项目,

    • #include <hiredis/hiredis.h> int main(void) { char a[1026] = {0}; redisContext *c = NULL; void *reply = NULL; memset(a, 'a', (sizeof(a) - 1)); c = redisConnec

    • 问题内容: 如何在gcc中静态链接共享库函数? 问题答案: 参考: http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static- linking-of-shared- libraries-696714/ http://linux.derkeiler.com/Newsgroups/comp.os.linux.develo