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

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

我尝试在 onCreate方法中设置断点,在按钮的 OnClickListener中设置断点——没有任何效果。现在我发现它只能在应用程序模块里工作。由于该项目只有一个单一的活动类在应用程序模块和其他一切都在库模块中提供,实际上我不能调试所有。

我假设 AndroidManifest.xml 或 build.gradle 文件中有问题。当我刚从 Eclipse 切换到 Android Studio 时,所有这些分级的东西对我来说都是全新的。

当应用程序运行时,如果我将鼠标悬停在一个库断点上,它会告诉我“在 line... ... 没有找到可执行代码... ...”。我想这就是我的问题所在,但我不知道如何解决它。

在 build.gradle 的条目中,有没有什么“常见的疑点”可能导致我的问题?

我已经清理了我的项目,并且没有成功地使缓存失效。我甚至尝试了在库模块中为其中的片段添加 <activity>条目的建议。

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

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')
}

enter image description here

62145 次浏览

我算是解开了,虽然我还没完全弄明白。问题是 ProGuard 仍然像@Feantury 建议的那样活跃。我不知道为什么会出现这种情况,因为我已经在我能想象的每个 build. gradle 位置都指定了 minifyEnabled false,但似乎没有任何效果。

就在几分钟前,我发生了一次事故,我看到堆栈跟踪中的行看起来是这样的:

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

所以职业警卫队成了我的头号嫌疑犯。经过一番搜索,我发现 另一个 SO 问题处理 未知来源的问题。我尝试了建议的解决方案,调试与 ProGuard 启用,瞧,它的工作!

只需将以下代码行添加到 proGuard-rules. txt:

-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

如本问题的注释所述,在调试构建中设置 minifyEnabled false是最佳实践。通过在应用程序模块中设置此变量,可以禁用整个前卫构建过程。它在优化版本构建时非常有用,但是如果您正在测试和开发,它会给您带来一些问题。

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

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

当一个应用程序在调试中编译时,它的模块实际上是在发行版中编译的。 这就是为什么前卫可以在调试中启用。

我推荐这个 回答为我工作。

我在调试 Kotlin 代码时遇到了问题。调试器不会在任何断点停止。原来是 马上跑的问题。我从项目中删除了所有的构建目录,然后卸载了应用程序,禁用了 Instant run。

要禁用 马上跑,请转到 文件 > 设置 > 构建、执行、部署 > 即时运行 > < em > 取消选中 Enable Instant Run

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