Отладчик Android Studio не останавливается на контрольных точках в библиотечных модулях
В настоящее время я разрабатываю приложение для Android, основанное на стороннем коде. Я начал устанавливать точки останова для понимания кода и вскоре столкнулся с проблемой. Внезапно я не смог заставить Android Studio остановиться на контрольных точках больше.
Я попытался установить точки останова в методах onCreate
, в пределах кнопок OnClickListener
- ничего не работало. Теперь я узнал, что единственное место, где он работает, находится внутри модуля приложения. Поскольку проект имеет только один класс активности в модуле приложения, а все остальное предоставляется в библиотечных модулях, я вообще не могу отлаживать.
Я предполагаю, что что-то не так в AndroidManifest.xml или, скорее всего, в файле build.gradle. Поскольку я только что переключился с Eclipse на Android Studio, весь этот материал gradle стал для меня совершенно новым.
Если я нахожусь над точкой прерывания библиотеки во время работы приложения, он сообщает мне, что "нет исполняемого кода [найден] в строке...". Я предполагаю, что это причина моей проблемы, но я понятия не имею, как ее исправить.
Существуют ли какие-либо "обычные подозреваемые" среди записей в build.gradle, которые могут вызвать мою проблему?
Я уже очистил свой проект и сделал недействительным кеш без успеха. Я даже попробовал предложить добавить <activity>
записи внутри библиотечного модуля для фрагментов внутри.
Изменить. Я использую самую последнюю версию Android Studio (версия 1.1.0 с 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:[email protected]') {
exclude group: 'com.android.support', module: 'support-v4'
}
// Croping images
compile('com.soundcloud.android:android-crop:[email protected]') {
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]()
Ответы
Ответ 1
Как указано в комментариях к этой проблеме, настройка minifyEnabled false
в сборке отладки - лучшая практика. Установив эту переменную в модуле приложения, вы отключите весь процесс сборки proguard. Это полезно при оптимизации сборки релиза, но дает некоторые проблемы, если вы тестируете и разрабатываете.
Ответ 2
Я как бы решил это, хотя я еще не совсем понял это. Проблема заключалась в том, что ProGuard все еще активно, как предположил @Feantury. Я не знаю, почему это было так, поскольку я указал minifyEnabled false
в каждой позиции build.gradle, которую я мог себе представить, но, похоже, это не имело никакого эффекта.
Как только я столкнулся всего несколько минут назад, я увидел строки в стеке, которые выглядели так:
java.lang.NullPointerException
at com.example.MyClass(Unknown Source)
...
Это сделало ProGuard номером один подозрительным для меня. После некоторого поиска я нашел еще один вопрос, который касается проблемы Неизвестного источника. Я попробовал предлагаемое решение для отладки с включенным ProGuard и работал с ним!
Просто добавьте следующие строки в proguard-rules.txt:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Ответ 3
в дополнение к ответу olik79, я хотел бы добавить, что эти две строки заставят ваше приложение попадать в точки прерывания фрагментами. в противном случае он может обходить фрагменты
-keep public class * extends android.support.v4.** {*;}
-keep public class * extends android.app.Fragment
вот мое полное редактирование на proguard-android.txt в sdk\tools\proguard
# 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
На самом деле в Android Studio есть известная проблема: Gradle плагин не распространяет отлаживание/выпуск на зависимости. Кажется, это происходит в Studio 1.4 и 1.5 по крайней мере.
Когда приложение скомпилировано в debug, его модули фактически скомпилированы в версии.
Вот почему proguard может быть включен при отладке.
Я рекомендую этот ответ, который работал у меня.
Ответ 5
У меня возникла проблема с попыткой отладки кода Котлина. Отладчик не останавливался ни на одной из точек останова. Оказывается, это была проблема с Instant run. Я удалил все каталоги сборки из моего проекта, после чего я удалил приложение после того, как отключил Мгновенный запуск.
Чтобы отключить мгновенный запуск, перейдите в меню "Файл"> "Настройки"> "Сборка", "Выполнение", "развертывание"> "Мгновенный запуск"> "Отменить".