Pour le moment, je développe une application Android qui est basée sur du code tiers. J'ai commencé à définir des points d'arrêt pour comprendre le code et j'ai rapidement rencontré un problème. Soudain, je n'ai pas pu obtenir = Android Studio pour arrêter plus aux points d'arrêt.
J'ai essayé de définir les points d'arrêt dans les méthodes onCreate
, dans les boutons 'OnClickListener
s - rien ne fonctionnait. Maintenant, j'ai découvert que le seul endroit où cela fonctionne est à l'intérieur du module d'application. Comme le projet n'a qu'une seule classe d'activité dans le module d'application et que tout le reste est fourni dans les modules de bibliothèque, en fait, je ne peux pas déboguer du tout.
Je suppose qu'il y a quelque chose qui ne va pas dans le fichier AndroidManifest.xml ou plus probablement dans le fichier build.gradle. Comme je viens de passer d’Eclipse à Android Studio, tout ce contenu est bien nouveau pour moi.
Si je survole un point d'arrêt de la bibliothèque alors que l'application est en cours d'exécution, cela m'indique qu '"aucun code exécutable n'est trouvé à la ligne ...". Je suppose que c'est la cause de mon problème, mais je ne sais pas comment le résoudre.
Y at-il des "suspects habituels" parmi les entrées dans build.gradle qui pourraient causer mon problème?
J'ai déjà nettoyé mon projet et invalidé le cache sans succès. J'ai même essayé la suggestion d'ajouter <activity>
entrées dans le module de bibliothèque pour les fragments à l'intérieur.
Edit: J'utilise la version la plus récente de Android Studio (version 1.1.0 du 18 février) qui devrait avoir le même bug qui existait il y a quelque temps. .
Le contenu de build.gradle dans le module d'application:
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')
}
Et le build.gradle du module de bibliothèque:
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')
}
Comme indiqué dans les commentaires de ce problème, la meilleure pratique consiste à définir minifyEnabled false
Dans la version de débogage. En définissant cette variable dans le module d'application, vous désactivez l'intégralité du processus de construction de proguard. C'est utile pour optimiser la version de la version, mais donne quelques problèmes si vous testez et développez.
Je l'ai en quelque sorte résolu, même si je ne le comprends pas encore complètement. Le problème était que ProGuard était toujours actif, comme l'a suggéré @Feantury. Je ne sais pas pourquoi c'était le cas comme je l'avais précisé minifyEnabled false
à chaque position de build.gradle que je pouvais imaginer, mais il semble que cela n’a eu aucun effet.
Comme je suis tombé en panne il y a quelques minutes à peine, j'ai vu dans le stacktrace des lignes qui ressemblaient à ceci:
Java.lang.NullPointerException
at com.example.MyClass(Unknown Source)
...
Cela a fait de ProGuard le principal suspect pour moi. Après quelques recherches, j'ai trouvé n autre SO question qui traite de la source inconnue J'ai essayé la solution suggérée pour le débogage avec ProGuard activé et voilà, cela a fonctionné!
Ajoutez simplement les lignes suivantes à proguard-rules.txt:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
en plus de la réponse de olik79, j'aimerais ajouter que, ces deux lignes feront en sorte que votre application atteigne des points d'arrêt par fragments. sinon il peut passer des fragments
-keep public class * extends Android.support.v4.** {*;}
-keep public class * extends Android.app.Fragment
voici mon édition complète sur proguard-Android.txt dans 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
J'ai eu un problème avec essayer de déboguer le code Kotlin. Le débogueur ne s'est arrêté à aucun des points d'arrêt. Il s'avère que c'était un problème avec Instant Run. J'ai supprimé tous les répertoires de construction de mon projet, puis j'ai désinstallé l'application après avoir désactivé l'exécution instantanée.
Pour désactiver l'exécution instantanée , accédez à Fichier> Paramètres> Construction, exécution, déploiement> Exécution instantanée> Décochez la case Activer l'exécution instantanée
En fait, il existe un problème connu dans Android Studio: le plug-in Gradle ne transmet pas le débogage/la publication aux dépendances) . Cela semble se produire dans A Studio 1.4 et 1.5 au moins. .
Lorsqu'une application est compilée en mode débogage, ses modules sont en fait compilés en version. C'est pourquoi proguard peut être activé dans le débogage.
Je recommande ceci réponse cela a fonctionné pour moi.