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


75

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

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

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

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

在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)
olik79 2015年

1
好的,我之所以这样问是因为,主要是在带有lollypop的S5中,存在一个导致这种不良行为的错误。请发布您的一些代码/ gradle文件,以便我们找出问题所在。另外,android studio版本可能会有用
droidpl 2015年

我只是在我的Sony设备上进行了测试,以确保它与模拟器无关。那里也没有用。我将在一分钟内用两个主要build.gradle文件的内容更新问题。
olik79 2015年

1
从镜像中可以看到,AS正在为库的所有配置运行构建调试。我建议您仅在gradle调试库模块中进行以下配置:minifyEnabled false debuggable true
droidpl 2015年

1
@Feantury您可以添加提示minifyEnabled false以禁用ProGuard作为答案,以便我接受吗?这提示了正确的方向,如果我做对了一切,大概会有所帮助;-)
olik79 2015年

Answers:


103

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


9
请记住,断点不适用于空行或注释。
布莱克·雷贾利亚

我已经在这个问题上浪费了几个小时。如果在Android Studio 3.3上也将useProguard设置为false,则minifyEnabled对我有用,但是默认情况下,升级到3.4 R8而不是proguard会启用R8,因此这可能是一个问题。谢谢
鲁本Viguera

我花了太多时间试图弄清楚调试器为什么不停止!您使我免于浪费更多,谢谢:)
rkachach

非常感谢。六个月后打开我的项目,花了几个小时终于找到了解决方案。
萨拉布·帕德韦卡

17

我有点解决了,尽管我还不完全了解。问题在于ProGuard仍然像@Feantury所建议的那样活跃。我不知道为什么会发生这种情况,正如我minifyEnabled false在想像中的每个build.gradle位置中所指定的那样,但似乎没有任何效果。

几分钟前发生崩溃时,我在stacktrace中看到了如下行:

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

这使ProGuard成为我的第一嫌疑人。经过一番搜索后,我发现了另一个SO问题,涉及未知源问题。我尝试了在启用ProGuard的情况下进行调试的建议解决方案,因此效果很好!

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

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

2
愿上帝保佑你,我的朋友,我花了我几天的时间来解决一个该死的问题,最后您的很好的回答使我看到了曙光:)问候
smoothumut 2015年

我的库proguard文件中已经有一个-keepattributes值,用于'Signature',为了启用断点,我将其更改为-keepattributes SourceFile,LineNumberTable,Signature,而不必添加重命名sourcefile属性。多么令人沮丧的问题!!!
Bungle先生,2015年

是的,将其添加到图书馆的proguard-rules.pro作品中(minifyEnabled false对我而言不起作用)。谢谢。
李静

12

除了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

3
如此,如此,如此,如此,如此,如此,如此,如此如此之多
tom tom

3
你救了我的命!!!!!如此如此如此如此如此如此如此如此如此如此地如此谢谢!!!!
斯科特·王

2
这样的快乐让人开心:)
smoothumut 17-10-10

2

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

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


在它运行如此之快以至于完全忽略我的代码更新之后,我放弃了Instant运行很久以前了!就个人而言,我代表OP指责Android SDK与Gradle发生冲突。
约翰·约翰(John

实际上,对我而言,它还跳过了应用程序模块的断点,而不仅仅是库。我当时不得不禁用它。它表明他们正在不断改进它。我目前正在使用Instant Run,几乎没有遇到任何问题。
vovahost

1

实际上,Android Studio中存在一个已知的问题:Gradle插件不会将调试/发布传播到依赖项。这似乎至少发生在A Studio 1.4和1.5中。

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

我建议这个对我有用的答案


直觉上,这听起来不错,我在一个旧项目和一个新的AS上遇到了困难,还是我的新项目也遭受了同样的命运,使我不得不挖掘这个旧项目?终端故障IMO,断点损坏,也可能正在使用VIM
John

0

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


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

0

就我而言,我必须将调试类型设置为Java Only

转到编辑配置。

编辑配置

将调试类型设置为仅Java

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.