Android Studio 的调试器不会在库模块中的断点处停止
Android Studio's debugger not stopping at breakpoints within library modules
目前我正在开发一个基于第三方代码的 Android 应用程序。我开始为理解代码设置断点,很快 运行 陷入了一个问题。突然我无法让 Android Studio 在断点处停止了。
我试图在 onCreate
方法中,在按钮的 OnClickListener
中设置断点 - 没有任何效果。现在我发现它唯一起作用的地方是在 app 模块内。由于该项目只有一个 activity class 在应用程序模块中,而其他所有内容都在库模块中提供,实际上我根本无法调试。
我假设 AndroidManifest.xml 或更可能是 build.gradle 文件中有问题。因为我刚从 Eclipse 切换到 Android Studio,所有这些 gradle 东西对我来说都是全新的。
如果我在应用程序 运行 时将鼠标悬停在库断点上,它会告诉我 "no executable code [is] found at line ..."。我认为这是我的问题的原因,但我不知道如何解决它。
build.gradle 中的条目中是否有任何 "usual suspects" 可能导致我的问题?
我已经清理了我的项目并使缓存无效,但没有成功。我什至尝试了在库模块中为里面的片段添加 <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')
}
我有点解决了,虽然我还没有完全理解它。问题是 ProGuard 仍然像@Feantury 建议的那样处于活动状态。我不知道为什么会这样,因为我在我能想象到的每个 build.gradle 位置都指定了 minifyEnabled false
,但它似乎没有任何效果。
由于几分钟前我遇到了一次崩溃,我在堆栈跟踪中看到如下所示的行:
java.lang.NullPointerException
at com.example.MyClass(Unknown Source)
...
这让 ProGuard 成为我的头号嫌疑犯。经过一番搜索,我发现 another SO question 可以解决 Unknown Source 问题。我在启用 ProGuard 的情况下尝试了建议的调试解决方案,结果成功了!
只需将以下行添加到 proguard-rules.txt:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
如本期评论所述,在调试版本中设置 minifyEnabled false
是最佳实践。通过在应用程序模块中设置此变量,您将禁用整个 proguard 构建过程。它在优化发布版本时很有用,但在测试和开发时会出现一些问题。
除了 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 plugin does not propagate debug/release to dependencies。它似乎至少在 A Studio 1.4 和 1.5 中发生。
当应用程序在调试中编译时,其模块实际上是在发布时编译的。
这就是为什么可以在调试中启用混淆器的原因。
我推荐这个 answer 对我有用。
我在尝试调试 Kotlin 代码时遇到了问题。调试器没有在任何断点处停止。事实证明这是 Instant 运行 的问题。我从项目中删除了所有构建目录,然后在禁用 Instant 运行.
之后卸载了应用程序
要禁用 Instant 运行 转到 File > Settings > Build, execution, deployment > Instant 运行 > 取消选中启用即时 运行
我发现问题是 Android Studio 处于离线模式。当我从离线模式更改时,这允许调试有效地工作。
目前我正在开发一个基于第三方代码的 Android 应用程序。我开始为理解代码设置断点,很快 运行 陷入了一个问题。突然我无法让 Android Studio 在断点处停止了。
我试图在 onCreate
方法中,在按钮的 OnClickListener
中设置断点 - 没有任何效果。现在我发现它唯一起作用的地方是在 app 模块内。由于该项目只有一个 activity class 在应用程序模块中,而其他所有内容都在库模块中提供,实际上我根本无法调试。
我假设 AndroidManifest.xml 或更可能是 build.gradle 文件中有问题。因为我刚从 Eclipse 切换到 Android Studio,所有这些 gradle 东西对我来说都是全新的。
如果我在应用程序 运行 时将鼠标悬停在库断点上,它会告诉我 "no executable code [is] found at line ..."。我认为这是我的问题的原因,但我不知道如何解决它。
build.gradle 中的条目中是否有任何 "usual suspects" 可能导致我的问题?
我已经清理了我的项目并使缓存无效,但没有成功。我什至尝试了在库模块中为里面的片段添加 <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')
}
我有点解决了,虽然我还没有完全理解它。问题是 ProGuard 仍然像@Feantury 建议的那样处于活动状态。我不知道为什么会这样,因为我在我能想象到的每个 build.gradle 位置都指定了 minifyEnabled false
,但它似乎没有任何效果。
由于几分钟前我遇到了一次崩溃,我在堆栈跟踪中看到如下所示的行:
java.lang.NullPointerException
at com.example.MyClass(Unknown Source)
...
这让 ProGuard 成为我的头号嫌疑犯。经过一番搜索,我发现 another SO question 可以解决 Unknown Source 问题。我在启用 ProGuard 的情况下尝试了建议的调试解决方案,结果成功了!
只需将以下行添加到 proguard-rules.txt:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
如本期评论所述,在调试版本中设置 minifyEnabled false
是最佳实践。通过在应用程序模块中设置此变量,您将禁用整个 proguard 构建过程。它在优化发布版本时很有用,但在测试和开发时会出现一些问题。
除了 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 plugin does not propagate debug/release to dependencies。它似乎至少在 A Studio 1.4 和 1.5 中发生。
当应用程序在调试中编译时,其模块实际上是在发布时编译的。 这就是为什么可以在调试中启用混淆器的原因。
我推荐这个 answer 对我有用。
我在尝试调试 Kotlin 代码时遇到了问题。调试器没有在任何断点处停止。事实证明这是 Instant 运行 的问题。我从项目中删除了所有构建目录,然后在禁用 Instant 运行.
之后卸载了应用程序要禁用 Instant 运行 转到 File > Settings > Build, execution, deployment > Instant 运行 > 取消选中启用即时 运行
我发现问题是 Android Studio 处于离线模式。当我从离线模式更改时,这允许调试有效地工作。