Comment faire pour supprimer tous la journalisation du débogage des appels avant la construction de la version d'une application Android?
Selon Google, je dois "désactiver tous les appels à des méthodes de Log dans le code source" avant de publier mon application Android sur Google Play. Extrait de l'article 3 de la publication de la liste de contrôle:
Assurez-vous de désactiver la journalisation et de désactiver l'option de débogage avant de vous construire votre demande de mise en liberté. Vous pouvez désactiver la journalisation en supprimant les appels aux méthodes du Journal dans vos fichiers source.
Mon projet open-source est grande et il est pénible d'avoir à le faire manuellement à chaque fois que je la libération. En outre, la suppression d'une ligne de Journal est potentiellement difficile, par exemple:
if(condition)
Log.d(LOG_TAG, "Something");
data.load();
data.show();
Si je commente la ligne du Journal, alors la condition s'applique à la ligne suivante, et les chances sont load() n'est pas appelée. Sont de telles situations assez rare pour que je puisse décider qu'il ne devrait pas exister?
Alors, est-il un meilleur niveau de code source façon de le faire? Ou peut-être quelques petits malins ProGuard syntaxe de manière efficace, mais en toute sécurité supprimer toutes les lignes du Journal?
- +1 parce que je ne me souviens pas de cela a été la publication de la liste de contrôle.
- Pour commenter une non-bloqué ligne, j'utilise ";//" au lieu de "//".
- Si vous avez besoin d'être en mesure d'annuler cette, vous aurez probablement besoin d'utiliser
sed 's_^\(\s*Log\.\)_;//'`date|tr -s \ -`'\1_g'
à la place. - Double Possible: stackoverflow.com/q/2018263/2291
- Le lien que Dimitar ajoutée ne fonctionne plus. J'ai trouvé ceci au lieu de cela source.android.com/source/code-style.html#log-sparingly.
- c'est pourquoi il est recommandé de ne pas utiliser si l'instruction sans {}, en particulier lorsque vous vous déplacez d'expression à la ligne suivante; utiliser le Sonar Luc.
- Est-il un impact sur les performances est la journalisation est ou cette remarque est sur la question de la sécurité uniquement à des fins d'?
- Probablement pour les performances, surtout de nos jours, mais sur les anciennes versions d'Android, il dispose de prestations de la sécurité de trop.
Vous devez vous connecter pour publier un commentaire.
- Je trouver un beaucoup plus simple solution consiste à oublier tous les
if
vérifie tous sur la place et il suffit d'utiliser ProGuard à dépouiller touteLog.d()
ouLog.v()
les appels de méthode lorsque nous appelons notre Fourmirelease
cible.De cette façon, nous avons toujours le debug info d'une sortie régulière construit et ne pas avoir à faire de modification de code pour la release. ProGuard pouvez également faire plusieurs passages sur le pseudo-code pour supprimer d'autres indésirables des déclarations, des blocs vides et peut automatiquement inline court méthodes, le cas échéant.
Pour exemple, voici un très de base ProGuard config pour Android:
Donc vous l'enregistrer dans un fichier, puis d'appeler ProGuard de Fourmi, de passage dans votre juste compilé POT et la plate-forme Android JAR que vous utilisez.
Voir aussi les exemples dans le ProGuard manuel.
Mise à jour (4,5 ans plus tard): aujourd'Hui, j'ai utilisé Bois pour Android journalisation.
Non seulement est-il un peu plus agréable que la valeur par défaut
Log
mise en œuvre — le journal de la balise est définie automatiquement, et il est facile de journal formaté des chaînes et des exceptions, mais vous pouvez également spécifier différentes journalisation des comportements lors de l'exécution.Dans cet exemple, l'enregistrement des déclarations ne seront écrites à logcat dans les versions de débogage de mon application:
Bois est mis en place dans mon
Application
onCreate()
méthode:Puis n'importe où ailleurs dans mon code je peux me connecter facilement:
Voir le Bois d'exemple d'application pour un exemple plus complexe, où toutes les instructions sont envoyées à logcat au cours du développement et en production, aucune des instructions de débogage sont enregistrés, mais les erreurs sont silencieusement signalé à Crashlytics.
-keepattributes
drapeau.android.app.Activity
dans cet exemple?Log.d(TAG, "some "+thing)
, sera ProGuard éliminer la chaîne de l'exploitation du bâtiment? Aussi, comment voulez-vous vérifier le journal des déclarations ont en effet été supprimés?-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
, est qu'une partie du problème? Aussi, est Raanan droit, que vous ne devriez pas inclure celui-ci dans votre propre proguard fichier?Timber.tag
.assumenosideeffects
déclaration pourTimber.x
.Application
de la classe, est-il nécessaire deuproot
il? Si oui, pourriez-vous guide de l'endroit où le déraciner doit être placé?boolean isDebug = ((getContext().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0);
veuillez consulter ceci pour plus de détails.BuildConfig.DEBUG
ne doit être appelé qu'une seule fois, au cours deApplication
création.proguard
approche est , il laisse les constantes de chaîne de journaux dans le code et faire de l'ingénierie inverse et la falsification de votreapk
plus facile pour ceux qui ont de telles intentions. Pour moi, il est également important d'enlever les chaînes à partir de la version du code, et il semble qu'il est possible de juste parif(DEBUG) {Log.d(...)}
approcheToutes les bonnes réponses, mais quand j'ai eu fini avec mon développement, je ne voulais pas utiliser si les déclarations autour de tous les appels du Journal, et je n'ai envie d'utiliser des outils externes.
Donc la solution que j'utilise est de remplacer le android.util.Journal de classe avec mon propre Journal de classe:
La seule chose que j'avais à faire dans tous les fichiers de la source était de remplacer l'importation de android.util.Journal avec ma propre classe.
Log.d("tag", someValue.toString());
qu'il est très facile d'oublier de vérifier someValue pour ne pas être null ce qui signifie qu'il pourrait jeter unNullPointerException
dans la production. Il suggère une solution sécurisée, mais elle vous tromper. Nous nousprivate static boolean DEBUG
et puisif(DEBUG)Log.d(TAG, msg);
String
. Solution complète est décrite ici. Ce qui, apparemment, a un autre inconvénient: chaque appel doit être édité (pas une seule ligne d'importation).static final boolean LOG = BuildConfig.DEBUG
et ne pas avoir à modifier ce fichier à jamais.private static final boolean IS_DEBUGGABLE = com.name.app.BuildConfig.DEBUG
.Je suggère d'avoir un static boolean quelque part indiquant si oui ou non pour vous connecter:
Alors, où que vous souhaitez vous connecter dans votre code, il suffit de faire ceci:
Maintenant, lorsque vous définissez MyDebug.JOURNAL des faux, le compilateur va foirer tout le code à l'intérieur de ces contrôles (car c'est un statique de la finale, elle sait au moment de la compilation que le code n'est pas utilisé.)
Pour les grands projets, vous pouvez commencer à avoir des booléens dans des fichiers individuels à être en mesure de facilement activer ou désactiver la journalisation là en tant que de besoin. Par exemple, ce sont les différents journalisation des constantes que nous avons dans le gestionnaire de fenêtre:
Avec code correspondant comme:
LOG = true
avecLOG = Boolean.parseBoolean("true")
Christophe Proguard est la meilleure solution, mais si pour une raison quelconque vous n'aimez pas Proguard, voici un très low-tech:
Commentaire journaux:
Décommentez les journaux:
Une contrainte est que votre journalisation des instructions ne doivent pas s'étendre sur plusieurs lignes.
(Exécuter ces lignes dans un shell UNIX à la racine de votre projet. Si vous utilisez Windows, d'obtenir une couche UNIX ou de l'utilisation de l'équivalent de commandes Windows)
//
vs;//
)Je voudrais ajouter quelques précisions sur l'utilisation de Proguard avec Android Studio et gradle, depuis que j'ai eu beaucoup de problèmes pour supprimer les lignes du journal de la finale binaire.
Afin de rendre
assumenosideeffects
dans Proguard fonctionne, il est une condition préalable.Dans votre gradle fichier, vous devez spécifier l'utilisation de la
proguard-android-optimize.txt
comme fichier par défaut.En fait, par défaut dans le
proguard-android.txt
fichier, l'optimisation est désactivé avec les deux drapeaux:La
proguard-android-optimize.txt
fichier ne pas ajouter ces lignes, alors maintenantassumenosideeffects
peut travailler.Puis, personnellement, j'utilise SLF4J, d'autant plus quand je développe un certain nombre de bibliothèques qui sont distribués à d'autres. L'avantage est que par défaut il n'y a pas de sortie. Et si l'intégrateur veut certains journal des sorties, il peut utilise Logback pour Android et activez les logs, donc, les journaux peuvent être redirigé vers un fichier ou de le LogCat.
Si j'ai vraiment besoin de dépouiller les journaux de la finale de la bibliothèque, je puis ajouter à mon Proguard fichier (après avoir activé le
proguard-android-optimize.txt
fichier de cours):Je vous suggère fortement d'utiliser du Bois de Jake Wharton
https://github.com/JakeWharton/timber
de résoudre votre problème avec l'activation/la désactivation de plus ajoute class de la balise automatiquement
juste
les journaux ne seront utilisées que dans votre debug ver, et ensuite utiliser
ou
pour imprimer
"Votre classe /msg" sans specyfing la balise
J'ai utilisé un LogUtils classe comme dans la Google IO exemple d'application. Je l'ai modifié pour utiliser une application spécifique de DÉBOGAGE constante au lieu de BuildConfig.DEBUG car BuildConfig.DEBUG n'est pas fiable. Ensuite, dans mes Classes, j'ai suivantes.
Build.DEBUG
que j'ai l'habitude d'utiliser. J'ai aussi donné avec les différents "correct" solutions de contournement et d'utiliser un style similaire solution pour vous.Je voudrais envisager d'utiliser roboguice de fonction de journalisation au lieu de l'intégré dans android.util.Journal
Leur établissement désactive automatiquement de débogage et de journaux détaillés pour la release.
De Plus, vous obtenez quelques fonctionnalités intéressantes pour le libre (par exemple, personnalisable comportement d'enregistrement, des données supplémentaires pour chaque journal et plus)
À l'aide de proguard pourrait être tout à fait une corvée et je ne voudrais pas passer par la peine de le configurer et de le rendre travail avec votre application, sauf si vous avez une bonne raison pour que (la désactivation de journaux n'est pas une bonne)
Je poste cette solution qui s'applique spécifiquement pour Android Studio utilisateurs. J'ai aussi récemment découvert Bois et ont importé avec succès dans mon application en procédant comme suit:
Mettre la dernière version de la bibliothèque dans votre build.gradle:
Puis dans Android Studios, allez dans Edit -> Find -> Remplacez le Chemin d'accès...
Type dans
Log.e(TAG,
ou cependant vous avez défini vos messages de Log dans le"Text to find"
zone de texte. Alors que vous venez de le remplacer parTimber.e(
Cliquez sur Rechercher, puis sur remplacer tout.
Android Studios allons maintenant passer en revue tous les fichiers dans votre projet et de le remplacer tous les Journaux avec des Poutres.
Le seul problème que j'ai eu avec cette méthode est que gradle ne viennent avec un million de messages d'erreur par la suite car il ne peut pas trouver de "Bois" dans les importations pour chacun de vos fichiers java. Cliquez simplement sur les erreurs et Android Studios sera automatiquement importer "Bois de construction" en java. Une fois que vous l'avez fait pour l'ensemble de vos erreurs de fichiers, gradle de compiler à nouveau.
Vous avez également besoin de mettre ce bout de code dans votre
onCreate
méthode de votreApplication
classe:Cela se traduira par l'application de journalisation uniquement lorsque vous êtes en mode de développement non en production. Vous pouvez également avoir
BuildConfig.RELEASE
pour l'enregistrement en mode release.import android\.util\.Log\;
Remplacer par:import android\.util\.Log\;\nimport timber\.log\.Timber\;
Timber.e(TAG + ": " +
serait une meilleure pratique.Par android.util.Le journal permet d'activer/désactiver le journal:
Par défaut de la méthode isLoggable(...) renvoie la valeur false, seulement après que vous setprop dans le dispositif aime ceci:
Cela signifie un journal au-dessus de niveau de DÉBOGAGE peuvent être imprimés. Référence android doc:
Afin que nous puissions utiliser de journal personnalisée util:
Si vous pouvez courir un remplacement global (une fois), et après que conserver quelques-uns convention de codage, vous pouvez suivre le modèle souvent utilisé dans Android cadre.
Au lieu d'écrire
avoir comme
Maintenant proguard pouvez supprimer le StringBuilder et toutes les chaînes et les méthodes qu'il utilise sur le chemin, à partir de la version optimisée de DEX. Utilisation
proguard-android-optimize.txt
et vous n'avez pas besoin de vous soucier de android.util.Journal dans votreproguard-rules.pro
:Avec Android Studio plugin gradle,
BuildConfig.DEBUG
est tout à fait fiables, de sorte que vous n'avez pas besoin de constantes pour contrôler le décapage.J'ai une solution très simple. J'utilise l'Ide pour le développement, de sorte que les détails varient, mais l'idée doit s'appliquer à tous les IDE.
- Je prendre à la racine de mon arbre source, cliquez-droit et sélectionnez-le pour faire "remplacer". J'ai ensuite choisir de remplacer tous les "Log". avec "//Journal.". Cela supprime tous les journaux consolidés. Pour les remettre plus tard, je répète la même remplacer mais, cette fois, remplacer tous les "//Journal." par "le Journal"..
Fonctionne très bien pour moi. N'oubliez pas de remplacer comme sensible à la casse pour éviter les accidents tels que la boîte de Dialogue".". Pour l'ajout d'assurance, vous pouvez également faire le premier pas avec "le Journal". comme la chaîne de caractères à rechercher.
Brillant.
Comme zserge commentaire suggéré,
son journal de la bibliothèque est facile à activer/désactiver le journal de l'impression de basculer comme ci-dessous.
En outre, il seulement doit changer de
import
lignes, et rien doit changer pourLog.d(...);
déclaration.Ajoutez ce qui suit à votre proguard-rules.txt fichier
C'est ce que j'ai utilisé pour faire mon android projets..
Dans Android Studio, on peut faire la même opération par Ctrl+Shift+F pour rechercher de l'ensemble du projet (Commande+Maj+F sous MacOs) et Ctrl+Maj+R pour Remplacer ((Commande+Maj+R MacOs))
J'ai amélioré sur la solution ci-dessus en fournissant un soutien pour les différents niveaux de journal, et en modifiant les niveaux de journal automatiquement selon si le code est exécuté sur un appareil ou sur l'émulateur.
ProGuard le fera pour vous sur votre communiqué de construire et maintenant, la bonne nouvelle de android.com:
http://developer.android.com/tools/help/proguard.html
Le ProGuard outil se rétrécit, optimise et dissimule votre code en supprimant code inutilisé, et de le renommer les classes, les champs et les méthodes du point de vue sémantique obscur noms. Le résultat est une taille plus petite .fichier apk qui est plus difficile à déjouer. Parce que ProGuard permet à votre application de plus difficile à désosser, il est important que vous l'utilisez lorsque votre application utilise des fonctionnalités qui sont sensibles à la sécurité, comme lorsque vous êtes à la Licence de Vos Applications.
ProGuard est intégré dans l'Android de construction du système, de sorte que vous n'avez pas à appeler manuellement. ProGuard s'exécute uniquement lorsque vous générez votre application en mode de diffusion, de sorte que vous n'avez pas à traiter avec d'obfuscation de code lorsque vous générez votre application en mode debug. Ayant ProGuard run est totalement facultatif, mais fortement recommandé.
Ce document décrit comment activer et configurer ProGuard ainsi que l'utilisation de la retracer outil pour décoder dissimulé les traces de pile
J'aime utiliser le Journal.d(TAG, une chaîne de caractères, souvent une Chaîne de caractères.format ()).
ÉTIQUETTE est toujours le nom de la classe
Transformer Journal.d(TAG, --> Logd( dans le texte de votre classe
De cette façon, lorsque vous êtes prêt à faire une version, ensemble MainClass.débogage pour de faux!
Les journaux peuvent être retirés à l'aide de bash sous linux et sed:
Travaille pour plusieurs lignes de logs. Dans cette solution, vous pouvez être sûr, que les journaux ne sont pas présents dans le code de production.
Je sais que c'est une vieille question, mais pourquoi n'avez-vous pas remplacer tous vos appels du journal avec quelque chose comme
Boolean logCallWasHere=true; //---reste de votre journal ici
Ce pour cette raison que vous savez quand vous voulez les mettre en arrière, et ils ne seront pas affecter votre si la déclaration d'appel 🙂
Pourquoi ne pas
? Pas de bibliothèques supplémentaires, pas de proguard règles qui tendent à vis du projet et de java, le compilateur va juste laisser bytecode pour pour cet appel lorsque vous effectuez une version validée.
Log.d("tag","msg");
, et aussi il est facile d'oublier l'écriture de laif(BuildConfig.DEBUG)
partie.la façon la plus simple;
utilisation
DebugLog
Tous les journaux sont désactivés par DebugLog lorsque l'application est publié.
https://github.com/MustafaFerhan/DebugLog