Android Studio의 디버거가 라이브러리 모듈 내의 중단 점에서 중지되지 않음
현재 저는 타사 코드를 기반으로하는 Android 앱을 개발 중입니다. 코드를 이해하기 위해 중단 점을 설정하기 시작했고 곧 문제가 발생했습니다. 갑자기 중단 점에서 더 이상 Android Studio를 중지 할 수 없습니다.
onCreate
버튼 내에서 메서드 내에서 중단 점을 설정하려고 OnClickListener
했습니다. 아무것도 작동하지 않았습니다. 이제 작동하는 유일한 장소는 앱 모듈 내부라는 것을 알았습니다. 프로젝트에는 앱 모듈에 하나의 활동 클래스가 있고 다른 모든 것은 라이브러리 모듈 내에서 제공되기 때문에 실제로 전혀 디버깅 할 수 없습니다.
AndroidManifest.xml에 문제가 있거나 build.gradle 파일에 더 많은 가능성이 있다고 가정합니다. 방금 Eclipse에서 Android Studio로 전환했을 때이 모든 gradle 항목은 나에게 매우 새롭습니다.
앱이 실행되는 동안 라이브러리 중단 점 위로 마우스를 가져 가면 "... 행에 실행 코드가 없습니다."라는 메시지가 표시됩니다. 이것이 내 문제의 원인이라고 생각하지만 해결 방법에 대해 전혀 모릅니다.
build.gradle의 항목 중에 내 문제를 일으킬 수있는 "일반적인 의심"이 있습니까?
이미 프로젝트를 정리하고 성공하지 못한 채 캐시를 무효화했습니다. <activity>
내부 조각에 대한 항목을 라이브러리 모듈 내부 에 추가하라는 제안도 시도했습니다 .
편집 : 얼마 전에 존재했던 유사한 버그가 수정되어야하는 최신 버전의 Android Studio (2 월 18 일부터 버전 1.1.0)를 사용하고 있습니다.
앱 모듈의 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')
}
이 문제의 의견에서 언급했듯이 minifyEnabled false
디버그 빌드에서 설정 하는 것이 가장 좋습니다. 앱 모듈에서이 변수를 설정하면 전체 proguard 빌드 프로세스가 비활성화됩니다. 릴리스 빌드를 최적화 할 때 유용하지만 테스트 및 개발중인 경우 몇 가지 문제가 있습니다.
I kind of solved it, although I don't fully understand it yet. The problem was that ProGuard still was active like @Feantury suggested. I don't know why that was the case as I had specified minifyEnabled false
in every build.gradle position I could imagine, but it seems it didn't have any effect.
As I had a crash just a few minutes ago, I saw lines in the stacktrace that looked like so:
java.lang.NullPointerException
at com.example.MyClass(Unknown Source)
...
That made ProGuard the number one suspect for me. After some searching around, I found another SO question that deals with the Unknown Source problem. I tried the suggested solution for debugging with ProGuard enabled and voilà it worked!
Simply add the following lines to proguard-rules.txt:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
in addition to olik79's answer, I would like to add that , these two lines will make your app hit to breakpoints in fragments. otherwise it may baypass fragments
-keep public class * extends android.support.v4.** {*;}
-keep public class * extends android.app.Fragment
here is my complete edit on proguard-android.txt in 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
I had a problem with trying to debug Kotlin code. The debugger wasn't stoping at any of the breakpoints. It turns out it was an issue with Instant run. I removed all the build directories from my project then I uninstalled the app after that I disabled Instant run.
To disable Instant run go to File > Settings > Build, execution, deployment > Instant run > Uncheck Enable Instant Run
In fact, there's a known issue in Android Studio: Gradle plugin does not propagate debug/release to dependencies. It seems to happen in A Studio 1.4 and 1.5 at least.
When an app is compiled in debug, its modules are in fact compiled in release. That's why proguard may be enabled in debug.
I recommend this answer that worked for me.
I discovered the problem to be that Android Studio was in offline mode. When I changed from offline mode this allowed debugging to work effectively.
'Programing' 카테고리의 다른 글
현재 상태와 마지막 커밋 간의 차이점보기 (0) | 2020.11.18 |
---|---|
'NoneType'개체 란 무엇입니까? (0) | 2020.11.18 |
docker-compose run을 사용하여 로그 출력을 보는 방법은 무엇입니까? (0) | 2020.11.18 |
[UIImage imageNamed…]와 [UIImage imageWithData…]의 차이점은 무엇입니까? (0) | 2020.11.18 |
SQL Server에 IP 주소를 저장하는 데 가장 적합한 데이터 유형은 무엇입니까? (0) | 2020.11.18 |