Отладчик Android Studio не останавливается на точках останова в модулях библиотеки

В настоящий момент я разрабатываю приложение для Android, основанное на стороннем коде. Я начал устанавливать точки останова для понимания кода и вскоре столкнулся с проблемой. Внезапно я больше не мог заставить Android Studio останавливаться на точках останова.

Я попытался установить точки останова в onCreate методах, в OnClickListeners кнопок - ничего не сработало. Теперь я обнаружил, что единственное место, где он работает, - это модуль приложения. Поскольку у проекта есть только один класс активности в модуле приложения, а все остальное предоставляется в модулях библиотеки, я вообще не могу отлаживать.

Я предполагаю, что что-то не так в 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: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')
}

введите описание изображения здесь


person olik79    schedule 03.03.2015    source источник
comment
Нет, я в основном использую симулятор (genymotion)   -  person olik79    schedule 03.03.2015
comment
Хорошо, я спрашивал об этом, потому что в основном в S5 с lollypop есть ошибка, которая приводит к такому плохому поведению. Пожалуйста, опубликуйте часть вашего кода / файла градиента, чтобы мы могли выяснить, что не так. Также может быть полезна версия студии Android   -  person droidpl    schedule 03.03.2015
comment
Я только что протестировал свое устройство Sony, чтобы убедиться, что оно не связано с симулятором. Там тоже не сработало. Я обновлю вопрос содержимым двух основных файлов build.gradle через минуту.   -  person olik79    schedule 03.03.2015
comment
Попробуйте установить для параметра «debuggable» значение true. Установка значения false предотвращает отладку проекта в модуле вашего приложения. Если это сработает для вас, я отправлю вам ответ, чтобы вы его приняли   -  person droidpl    schedule 03.03.2015
comment
Вы имеете в виду тот, что в верхнем файле, верно? Я его поменял, но это не помогло. Я не учел это, так как это внутри модуля приложения и внутри конфигурации выпуска. Поэтому я подумал, что это будет иметь значение только в том, чтобы я запустил (^ R) вместо «отладки» (^ D). Но даже если бы он был применен в режиме отладки, разве это не сделало бы модуль приложения недоступным для исправления ошибок вместо библиотеки? Спасибо за помощь!   -  person olik79    schedule 03.03.2015
comment
Вы частично правы. Запуск в eclipse не такой, как в AS. Когда вы работаете в режиме отладки, происходит только то, что вы подключаете отладчик к своему устройству. Это не означает, что вам необходимо запустить отладочную сборку, это зависит от конфигурации вашей AS. Обеспечьте фиксацию значений, которые у вас есть на вкладке вариантов сборки (она находится в нижней левой границе)   -  person droidpl    schedule 03.03.2015
comment
Я также вижу, что у вас есть minifyEnabled в библиотеке отладки. Это также плохая практика, поскольку ваши трассировки стека в библиотеке будут запутаны proguard, и если ваша конфигурация proguard неверна, это может привести к такого рода проблемам с отладчиком.   -  person droidpl    schedule 03.03.2015
comment
Ах, я понимаю, я автоматически подумал о картинах затмений. Я обновлю пост, добавив снимки экрана с вариантами сборки.   -  person olik79    schedule 03.03.2015
comment
Как видно из изображения, AS выполняет отладку сборки для всех конфигураций вашей библиотеки. Я рекомендую вам только следующую конфигурацию в вашем модуле библиотеки отладки gradle: minifyEnabled false debuggable true   -  person droidpl    schedule 04.03.2015
comment
Я добавил параметры в обе конфигурации отладочной сборки (app и sdk), к сожалению, это не помогло. Однако я обнаружил кое-что еще: я могу перейти от своего объекта Application к коду инициализации внутри библиотечного модуля. Я также могу установить там точки останова, и они сразу же будут достигнуты. Теперь я полностью запутался, так как это означает, что это не связано с модулем, а не с файлом build.gradle. Похоже, я могу попасть в точки останова только на пути выполнения, доступном из Application.onCreate().   -  person olik79    schedule 04.03.2015
comment
@Feantury, не могли бы вы добавить подсказку с minifyEnabled false, чтобы отключить ProGuard в качестве ответа, чтобы я мог с ней согласиться? Это подсказка, которая ведет в правильном направлении и, вероятно, помогла бы, если бы я все сделал правильно ;-)   -  person olik79    schedule 04.03.2015


Ответы (7)


Как указано в комментариях к этой проблеме, установка minifyEnabled false в отладочной сборке является наилучшей практикой. Устанавливая эту переменную в модуле приложения, вы отключаете весь процесс сборки Proguard. Это полезно при оптимизации сборки выпуска, но вызывает некоторые проблемы при тестировании и разработке.

person droidpl    schedule 04.03.2015
comment
Имейте в виду, что точки останова не работают для пустых строк или комментариев. - person Blake Regalia; 25.12.2015
comment
Я потерял часы на этом вопросе. minifyEnabled работал у меня, если также установил для useProguard false в Android Studio 3.3, но после обновления до 3.4 R8 включен по умолчанию вместо proguard, поэтому это может быть проблемой. Спасибо - person Rubén Viguera; 23.04.2019
comment
Я потратил слишком много часов, пытаясь понять, почему отладчик не останавливается !!! вы спасли меня от гораздо большего, спасибо :) - person rkachach; 16.05.2019
comment
Большое вам спасибо. Открыл мой проект через 6 месяцев, потратил несколько часов и, наконец, нашел ваше решение. - person Saurabh Padwekar; 01.03.2020

Я вроде как решил, хотя еще не до конца понимаю. Проблема заключалась в том, что 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
person olik79    schedule 04.03.2015
comment
Храни тебя Бог мой друг, я потратил свои f ... дни, чтобы решить чертову проблему, и, наконец, твой очень хороший вопрос и ответ помог мне увидеть свет на горизонте :) С уважением - person smoothumut; 28.07.2015
comment
У меня уже было значение -keepattributes в файле proguard моей библиотеки, которое предназначалось для «Подпись», чтобы включить точки останова, я изменил его на -keepattributes SourceFile, LineNumberTable, Signature, и мне не нужно было добавлять атрибут renamesourcefile. Какая досадная проблема !!! - person Mr. Bungle; 05.12.2015
comment
Да, добавить это к proguard-rules.pro работам библиотеки (а minifyEnabled false у меня не работает). Спасибо. - person Jing Li; 14.11.2016

В дополнение к ответу 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
person smoothumut    schedule 29.07.2015
comment
спасибо, так, так, так, так, так, так, так, так много - person tom; 17.04.2016
comment
Вы спасли мою жизнь!!!!! Спасибо вам так, так так так так так так, так много !!!! - person Scott Wang; 27.09.2017
comment
такая радость делать людей счастливыми :) - person smoothumut; 10.10.2017

У меня возникла проблема с попыткой отладки кода Kotlin. Отладчик не останавливался ни на одной из точек останова. Оказалось, что это была проблема с мгновенным запуском. Я удалил все каталоги сборки из своего проекта, затем удалил приложение, после чего отключил Instant run.

Чтобы отключить мгновенный запуск, перейдите в Файл> Настройки> Сборка, выполнение, развертывание> Мгновенный запуск> Снимите флажок Включить мгновенный запуск.

person vovahost    schedule 15.01.2018
comment
Я давно отказался от Instant run после того, как он запускался так быстро, что полностью игнорировал обновления моего кода! Лично и от имени ОП я виню столкновение Android SDK с Gradle. - person John; 10.06.2018
comment
На самом деле для меня это также было пропуском точек останова для модулей приложения, а не только для библиотек. Пришлось тогда отключить. Кажется, они постоянно его улучшают. Сейчас я использую Instant run и почти не сталкиваюсь с какими-либо проблемами. - person vovahost; 11.06.2018

Фактически, в Android Studio есть известная проблема: плагин Gradle не распространяется отладка / выпуск зависимостей. По крайней мере, это происходит в A Studio 1.4 и 1.5.

Когда приложение компилируется в отладке, его модули фактически компилируются в выпуске. Поэтому в отладке может быть включен proguard.

Я рекомендую этот ответ, который сработал для меня.

person Hartok    schedule 22.02.2016
comment
Интуитивно это звучит правильно, у меня проблемы со старым проектом и новым AS, или мой новый проект тоже постигла та же участь и заставила меня откопать этот старый? Ошибка терминала IMO, сломанные точки останова, также могут использоваться VIM - person John; 10.06.2018

Я обнаружил, что проблема в том, что Android Studio находится в автономном режиме. Когда я перешел из автономного режима, это позволило отладке работать эффективно.

person Wiley    schedule 17.09.2019
comment
Автономный режим: Файл ›Настройки (Ctrl-Alt-S)› Сборка, Выполнение, Развертывание ›Gradle Под Global gradle settings: Offline work флажок. - person TT--; 23.11.2019

В моем случае мне пришлось установить тип отладки на Только Java.

Зайдите в Edit Configurations.

Изменить конфигурации

Установите для типа отладки значение Только Java.

введите описание изображения здесь

person Anggrayudi H    schedule 30.07.2020
comment
Почему голосование против? Если это сработает для меня, я не могу гарантировать, что это сработает для вас. Вы знаете, что у проблемы может быть много обходных путей. - person Anggrayudi H; 10.06.2021