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

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

我试图设置onCreate方法内的断点,在button的OnClickListener – 没有任何工作。 现在我发现它唯一的作用是在应用程序模块中。 由于该项目在应用程序模块中只有一个单独的活动类,其他所有内容都在库模块中提供,实际上我根本无法进行debugging。

我假设在AndroidManifest.xml中有错误,或者更可能在build.gradle文件中。 正如我刚刚从Eclipse切换到Android Studio,所有这些gradle的东西对我来说都是新鲜事物。

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

build.gradle中有没有任何“通常的嫌疑人”可能会导致我的问题?

我已经做了清理我的项目,并没有成功使caching失效。 我什至试图build议在库模块里面添加<activity>条目。

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

应用程序模块中的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') } 

在这里输入图像说明

正如在这个问题的评论中指出的,在debugging版本中设置minifyEnabled false是最好的做法。 通过在应用程序模块中设置此variables,您将禁用整个proguard构build过程。 在优化版本构build时非常有用,但如果您正在testing和开发,则会出现一些问题。

我有点解决了,尽pipe我还没有完全理解它。 问题是ProGuard仍然像@Feantury所build议的那样活跃。 我不知道为什么这样,因为我已经指定了minifyEnabled false在每个build.gradle的位置,我可以想像,但它似乎没有任何效果。

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

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

这使得ProGuard成为我的头号嫌疑犯。 经过一番search后,我发现另一个SO问题 ,处理未知源问题。 我尝试了启用ProGuard进行debugging的build议解决scheme,并且它工作正常!

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

 -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable 

除了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插件不会将debugging/发布传播给依赖项 。 这似乎发生在A Studio 1.4和1.5以上。

当一个应用程序在debugging中编译时,其模块实际上是在发行版中编译的。 这就是为什么proguard可能在debugging中启用。

我推荐这个对我有效的答案 。