Actuellement, je développe une application Android basée sur un 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 ne pouvais plus arrêter Android Studio.
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ù il fonctionne est à l’intérieur du module d’application. Comme le projet ne contient qu’une seule classe d’activité dans le module d’application et que tout le rest est fourni dans les modules de bibliothèque, je ne peux pas du tout déboguer.
Je suppose que quelque chose 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 truc de gradle est assez nouveau pour moi.
Si je survole un point d’arrêt de la bibliothèque pendant que l’application est en cours d’exécution, il me dit qu’aucun “code exécutable [est] trouvé à la ligne …”. Je suppose que c’est la cause de mon problème, mais je n’ai aucune idée de la manière de le réparer.
Y at-il des “suspects habituels” parmi les entrées de 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é de suggérer d’append des entrées dans le module de bibliothèque pour les fragments à l’intérieur.
Edit : J’utilise la version la plus récente d’Android Studio (version 1.1.0 du 18 février) qui devrait avoir le même bogue qu’il y a un certain temps.
Le contenu de build.gradle dans le module d’application:
apply plugin: 'com.android.application' android { comstackSdkVersion 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 { comstack fileTree(dir: 'libs', include: ['*.jar']) comstack project(':firebase_plugin') }
Et le build.gradle du module bibliothèque:
apply plugin: 'com.android.library' android { comstackSdkVersion 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 comstack project(':facebook') // Used for SsortingngUtils comstack files('libs/commons-lang3-3.3.2.jar') // Bug tracking comstack files('libs/bugsense-3.6.1.jar') comstack fileTree(include: ['*.jar'], dir: 'libs') //Google Play Services - For Google Maps comstack('com.google.android.gms:play-services:5.0.89') { exclude group: 'com.google.android', module: 'support-v4' } // Support Library. comstack 'com.android.support:support-v13:18.0.+' comstack('com.android.support:appcompat-v7:19.1.0') { exclude group: 'com.google.android', module: 'support-v4' } // Volley - Networking library from google. comstack('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. comstack('de.greenrobot:greendao:1.3.0') { exclude group: 'com.google.android', module: 'support-v4' } // Firebase comstack('com.firebase:firebase-simple-login:1.4.2') { exclude group: 'com.android.support', module: 'support-v4' } // Super Toast comstack('com.github.johnpersano:supertoasts:1.3.4@aar') { exclude group: 'com.android.support', module: 'support-v4' } // Croping images comstack('com.soundcloud.android:android-crop:0.9.10@aar') { exclude group: 'com.android.support', module: 'support-v4' } comstack('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 { comstack fileTree(dir: 'libs', include: ['*.jar']) comstack project(':firebase_plugin') }
Comme indiqué dans les commentaires de ce problème, définir la valeur minifyEnabled false
dans la version de débogage est la meilleure pratique. En définissant cette variable dans le module d’application, vous désactivez l’intégralité du processus de génération de proguard. C’est utile lors de l’optimisation de la version, mais cela pose des problèmes si vous testez et développez.
Je l’ai en quelque sorte résolu, bien que je ne le comprenne pas encore complètement. Le problème était que ProGuard était toujours actif comme @Feantury suggéré. Je ne sais pas pourquoi c’était le cas, car j’avais spécifié minifyEnabled false
dans toutes les positions de build.gradle que je pouvais imaginer, mais il semble que cela n’ait eu aucun effet.
Comme j’ai eu un crash il y a quelques minutes, j’ai vu des lignes dans la trace de stack qui ressemblaient à ceci:
java.lang.NullPointerException at com.example.MyClass(Unknown Source) ...
Cela a fait de ProGuard le suspect numéro un pour moi. Après quelques recherches, j’ai trouvé une autre question SO qui concerne le problème de la source inconnue . J’ai essayé la solution suggérée pour le débogage avec ProGuard activé et le tour est joué!
Ajoutez simplement les lignes suivantes à proguard-rules.txt:
-renamesourcefileatsortingbute SourceFile -keepatsortingbutes SourceFile,LineNumberTable
En plus de la réponse de olik79, j’aimerais append que ces deux lignes feront que votre application atteindra des points d’arrêt en 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 -renamesourcefileatsortingbute SourceFile -keepatsortingbutes SourceFile,LineNumberTable -keep public class * extends android.support.v4.** {*;} -keep public class * extends android.app.Fragment
En fait, il existe un problème connu dans Android Studio: le plug-in Gradle ne propage pas le débogage / la libération sur les dépendances . Cela semble se produire dans A Studio 1.4 et 1.5 au moins.
Lorsqu’une application est compilée dans debug, ses modules sont en fait compilés dans la version. C’est pourquoi proguard peut être activé dans le débogage.
Je recommande cette réponse qui a fonctionné pour moi.
J’ai eu un problème avec le débogage du code Kotlin. Le débogueur ne s’arrêtait à aucun des points d’arrêt. Il s’est avéré que c’était un problème avec l’ exécution instantanée . 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> Construire, exécuter et déployer> Exécution instantanée> Décochez Activer l’ exécution instantanée.