Android Studio 的调试器不会在库模块中的断点处停止

Posted

技术标签:

【中文标题】Android Studio 的调试器不会在库模块中的断点处停止【英文标题】:Android Studio's debugger not stopping at breakpoints within library modules 【发布时间】:2015-05-04 08:47:27 【问题描述】:

目前我正在开发一个基于第三方代码的 android 应用。我开始设置断点来理解代码,很快就遇到了问题。突然间,我再也无法让 Android Studio 在断点处停止了。

我尝试在按钮的OnClickListeners 内的 onCreate 方法中设置断点 - 没有任何效果。现在我发现它唯一起作用的地方是在应用程序模块内。由于该项目在应用程序模块中只有一个活动类,而其他所有内容都在库模块中提供,实际上我根本无法调试。

我认为 AndroidManifest.xml 或 build.gradle 文件中可能有问题。当我刚从 Eclipse 切换到 Android Studio 时,所有这些 gradle 的东西对我来说都很新鲜。

如果我在应用程序运行时将鼠标悬停在库断点上,它会告诉我“在...行中找不到 [is] 可执行代码”。我认为这是我的问题的原因,但我不知道如何解决它。

build.gradle 中的条目中是否有任何“通常的嫌疑人”可能导致我的问题?

我已经清理了我的项目并使缓存无效但没有成功。我什至尝试了在库模块中为内部片段添加<activity> 条目的建议。

编辑:我使用的是最新版本的 Android Studio(2 月 18 日的 1.1.0 版),它应该修复了前一段时间存在的类似错误。

app模块中build.gradle的内容:

apply plugin: 'com.android.application'

android 
    compileSdkVersion 19
    buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION

    defaultConfig 
        minSdkVersion Integer.parseInt(project.MIN_SDK)
        targetSdkVersion  Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
    

    signingConfigs 
        release 
            keyAlias 'xxx'
            keyPassword 'xxx'
            storeFile file('xxx')
            storePassword 'xxx'
        
    

    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            signingConfig signingConfigs.release
            debuggable false
            jniDebuggable false
            zipAlignEnabled true
        
        debug 
            minifyEnabled false
            debuggable true
        
    

    packagingOptions 
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    
    productFlavors 
    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':firebase_plugin')

以及库模块的build.gradle:

apply plugin: 'com.android.library'
android 

    compileSdkVersion 19
    buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
    defaultConfig 
        minSdkVersion Integer.parseInt(project.MIN_SDK)
        targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
    

    buildTypes 
        release 
            minifyEnabled true
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        
        debug 
            minifyEnabled false
            debuggable true
        
    

    productFlavors 
    



dependencies 
    // Facebook SDK
    compile project(':facebook')

    // Used for StringUtils
    compile files('libs/commons-lang3-3.3.2.jar')
    // Bug tracking
    compile files('libs/bugsense-3.6.1.jar')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //Google Play Services - For Google Maps
    compile('com.google.android.gms:play-services:5.0.89') 
        exclude group: 'com.google.android', module: 'support-v4'
    
    // Support Library.
    compile 'com.android.support:support-v13:18.0.+'

    compile('com.android.support:appcompat-v7:19.1.0') 
        exclude group: 'com.google.android', module: 'support-v4'
    
    // Volley - Networking library from google.
    compile('com.mcxiaoke.volley:library:1.0.0') 
        exclude group: 'com.google.android', module: 'support-v4'
    
    // Has is own support library in it so need to exclude it so no TOP_LEVEL_EXCEPTION will occur.
    compile('de.greenrobot:greendao:1.3.0') 
        exclude group: 'com.google.android', module: 'support-v4'
    
    // Firebase
    compile('com.firebase:firebase-simple-login:1.4.2') 
        exclude group: 'com.android.support', module: 'support-v4'
    
    // Super Toast
    compile('com.github.johnpersano:supertoasts:1.3.4@aar') 
        exclude group: 'com.android.support', module: 'support-v4'
    
    // Croping images
    compile('com.soundcloud.android:android-crop:0.9.10@aar') 
        exclude group: 'com.android.support', module: 'support-v4'
    
    compile('com.github.chrisbanes.actionbarpulltorefresh:library:0.9.9') 
        exclude group: 'com.android.support', module: 'support-v4'
    



    packagingOptions 
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    
    productFlavors 
    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':firebase_plugin')

【问题讨论】:

不是,我主要是用模拟器(genymotion) 好的,我问这个是因为主要在带有棒棒糖的 S5 中存在一个会产生这种不良行为的错误。请发布您的一些代码/ gradle 文件,以便我们找出问题所在。 android studio 版本也很有用 我刚刚在我的索尼设备上进行了测试,以确保它与模拟器无关。它也没有在那里工作。我将在一分钟内用两个主要 build.gradle 文件的内容更新问题。 从图中可以看出,AS 正在为您的库的所有配置运行构建调试。我建议您只在 gradle 调试库模块中进行以下配置: minifyEnabled false debuggable true @Feantury 你能用minifyEnabled false 添加提示以禁用ProGuard 作为答案,以便我接受吗?这是指向正确方向的提示,如果我做对了所有事情,大概会有所帮助;-) 【参考方案1】:

如本期的 cmets 所述,在调试版本中设置 minifyEnabled false 是最佳实践。通过在 app 模块中设置此变量,您将禁用整个 proguard 构建过程。它在优化发布版本时很有用,但如果您正在测试和开发,则会出现一些问题。

【讨论】:

请记住,断点不适用于空行或 cmets。 我在这个问题上浪费了几个小时。如果在 Android Studio 3.3 上也将 useProguard 设置为 false,则 minifyEnabled 对我有用,但是在升级到 3.4 后,默认启用 R8 而不是 proguard,因此它可能是一个问题。谢谢 我花了太多时间试图弄清楚为什么调试器没有停止!!!你让我免于浪费更多,谢谢:) 非常感谢。6个月后打开我的项目,花了几个小时终于找到了你的解决方案。【参考方案2】:

我有点解决它,虽然我还没有完全理解它。问题是 ProGuard 仍然像@Feantury 建议的那样处于活动状态。我不知道为什么会这样,因为我在我能想象的每个 build.gradle 位置都指定了minifyEnabled false,但它似乎没有任何效果。

由于几分钟前发生了崩溃,我在堆栈跟踪中看到如下所示的行:

java.lang.NullPointerException
        at com.example.MyClass(Unknown Source)
        ...

这使 ProGuard 成为我的头号嫌疑人。经过一番搜索,我找到了处理 Unknown Source 问题的another SO question。我尝试了建议的解决方案,在启用 ProGuard 的情况下进行调试,并且成功了!

只需将以下行添加到 proguard-rules.txt:

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

【讨论】:

上帝保佑你,我的朋友,我花了我的时间来解决一个该死的问题,最后你非常好的问题和回答帮助我看到了地平线上的曙光:) 问候 我的库 proguard 文件中已经有一个用于“签名”的 -keepattributes 值,为了启用断点,我将其更改为 -keepattributes SourceFile,LineNumberTable,Signature 并且我不必添加 renamesourcefileattribute .多么令人沮丧的问题!!! 是的,将其添加到图书馆的 proguard-rules.pro 作品中(而 minifyEnabled false 对我不起作用)。谢谢。【参考方案3】:

除了 olik79 的回答,我想补充一点,这两行代码会让你的应用在片段中遇到断点。否则它可能会通过碎片

-keep public class * extends android.support.v4.** *;
-keep public class * extends android.app.Fragment

这是我对 sdk\tools\proguard 中 proguard-android.txt 的完整编辑

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

-keep class !android.support.v7.internal.view.menu.**,android.support.** *;
-ignorewarnings
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

-keep public class * extends android.support.v4.** *;
-keep public class * extends android.app.Fragment

【讨论】:

非常感谢您,非常感谢 你救了我的命!!!!!!!太感谢你了,太感谢了!!!! 让人们快乐的快乐 :)【参考方案4】:

我在尝试调试 Kotlin 代码时遇到了问题。调试器没有在任何断点处停止。事实证明这是 Instant run 的问题。我从项目中删除了所有构建目录,然后在禁用即时运行后卸载了该应用程序。

要禁用 即时运行,请转到 文件 > 设置 > 构建、执行、部署 > 即时运行 > 取消选中启用即时运行

【讨论】:

我很久以前就放弃了 Instant run,因为它启动得如此之快以至于完全忽略了我的代码更新!就个人而言,我代表 OP 将责任归咎于 Android SDK 与 Gradle 的冲突。 实际上对我来说它也跳过了应用程序模块的断点,而不仅仅是库。我当时不得不禁用它。看起来他们正在不断地改进它。我目前正在使用 Instant run,几乎没有遇到任何问题。【参考方案5】:

事实上,Android Studio 中存在一个已知问题:Gradle plugin does not propagate debug/release to dependencies。它似乎至少发生在 A Studio 1.4 和 1.5 中。

当应用程序在调试中编译时,它的模块实际上是在发布时编译的。 这就是为什么可以在调试中启用 proguard 的原因。

我推荐这个对我有用的answer。

【讨论】:

直觉上,这听起来是对的,我一个老项目和一个新AS很难,还是我的新项目也遭受了同样的命运,让我挖了这个旧项目?终端故障IMO,断点断,还不如用vim【参考方案6】:

我发现问题在于 Android Studio 处于离线模式。当我从离线模式更改时,这允许调试有效地工作。

【讨论】:

离线模式:文件 > 设置 (Ctrl-Alt-S) > 构建、执行、部署 > Gradle Under Global gradle settings: Offline work 复选框。

以上是关于Android Studio 的调试器不会在库模块中的断点处停止的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio:是不是可以在主模块中定义库模块清单占位符?

Android Studio 打包 jar 及 aar 包

Android Studio 打包 jar 及 aar 包

Android Studio 打包 jar 及 aar 包

Android Studio 运行/调试配置错误:未指定模块

调试不适用于 Android Studio 的 C++/本机库模块(使用 Cmake)