55 votes

Désactiver complètement la sortie LogCat dans l'application Android en version finale?

Arrêter la sortie du LogCat de mon application avant de la publier sur le marché est simple. Je sais aussi comment filtrer sélectivement les messages du LogCat par étiquette et/ou par identifiant pour ma propre commodité de débogage.

Mais maintenant, je m'intéresse à quelque chose qui pourrait être beaucoup plus difficile (voire impossible?) : Désactiver toute sortie du LogCat, y compris & surtout celles provenant de services tiers comme TtsService, GoogleLoginService, etc.

Est-ce possible ?

Pour clarifier davantage : Je ne suis pas intéressé par le filtrage des messages pour moi-même. Je suis plutôt intéressé par la désactivation des messages provenant de tiers pour quiconque télécharge mon application sur le Market Android. Est-ce possible ?

2 votes

Donc vous voulez empêcher toute application sur l'appareil de l'utilisateur d'écrire une sortie LogCat?

1 votes

Voulez-vous dire les messages de journalisation de ces bibliothèques tierces que vous incluez (ou utilisez) depuis votre application ?

0 votes

@eldarerathis Non, je veux empêcher toute application qui est directement ou indirectement utilisée par mon application, d'écrire une sortie LogCat. Désolé de ne pas avoir été assez clair.

195voto

David Caunt Points 30636

Vous pouvez utiliser ProGuard pour supprimer complètement toutes les lignes où une valeur de retour n'est pas utilisée, en indiquant à ProGuard de supposer qu'il n'y aura pas de problèmes.

Le morceau de code proguard.cfg suivant indique de supprimer les appels Log.d, Log.v et Log.i.

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** w(...);
    public static *** v(...);
    public static *** i(...);
}

Le résultat final est que ces lignes de journalisation ne sont pas présentes dans votre apk de sortie, et donc tout utilisateur avec logcat ne verra pas les logs d/v/i.

1 votes

Ce conseil est incroyable. Il mérite déjà un +1. Je vais accepter la réponse après m'être assuré qu'elle produit réellement le résultat désiré dans mon application. Merci!

2 votes

ProGuard est vraiment puissant! Vous pouvez également utiliser cette astuce pour supprimer d'autres formes de code de développement, pas seulement le journal.

0 votes

Dans quels autres scénarios pourrions-nous vouloir supprimer du code ? Et sous quelles formes ?

9voto

Win Myo Htet Points 2433

Si vous n'utilisez pas proguard, vous devez gérer les journaux vous-même et dans le fichier manifeste, définissez debuggable sur false

Voici ma classe de journal personnalisée

public class Lol {

    public static final boolean ENABLE_LOG = true & MyApplication.sDebug;

    private static final boolean DEBUG = true & ENABLE_LOG;

    private static final boolean VERBOSE = true & ENABLE_LOG;

    private static final boolean TEMP = true & ENABLE_LOG;

    private static final boolean WARNING = true & ENABLE_LOG;

    private static final boolean INFO = true & ENABLE_LOG;

    private static final boolean ERROR = true & ENABLE_LOG;

    public static void obvious(String tag, String msg) {
        if (DEBUG) {
            msg = "*********************************\n" + msg
                    + "\n*********************************";
            Log.d(tag, msg);
        }
    }

    public static void d(String tag, String msg) {
        if (DEBUG)
            Log.d(tag, msg);
    }

    public static void d(boolean bool, String tag, String msg) {
        if (TEMP&bool)
            Log.d(tag, msg);
    }

    public static void i(String tag, String msg) {
        if (INFO)
            Log.i(tag, msg);
    }

    public static void e(String tag, String msg) {
        if (ERROR)
            Log.e(tag, msg);
    }

    public static void e(boolean bool, String tag, String msg) {
        if (TEMP&bool)
            Log.e(tag, msg);
    }

    public static void v(String tag, String msg) {
        if (VERBOSE)
            Log.v(tag, msg);
    }

    public static void w(String tag, String msg) {
        if (WARNING)
            Log.w(tag, msg);
    }

    public static String getStackTraceString(Exception e) {
        return Log.getStackTraceString(e);
    }

    public static void w(String tag, String msg, Exception e) {
        if (WARNING)
            Log.w(tag, msg,e);
    }
}

8 votes

Depuis SDK Tools 8, il n'est plus nécessaire de définir manuellement le drapeau android:debuggable. Cela élimine le risque d'expédier une version débogable.

5 votes

Je suis juste curieux (je suis tombé sur cette question juste maintenant), y a-t-il une raison pour laquelle vous utilisez true & ENABLE_LOG au lieu de simplement ENABLE_LOG ? Je ne vois aucune différence en termes de fonctionnalité...

0 votes

Vous essayez toujours d'appeler des fonctions et d'envoyer des arguments, ne pensez pas que c'est une bonne idée, il est juste préférable d'utiliser if (BuildConfig.DEBUG) Log.i(TAG, msg);

3voto

Mapsy Points 2195

La grande réponse fournie par David Caunt ne semble pas fonctionner pour les règles définies dans proguard-android-optimize.txt.

Au lieu d'utiliser le joker ***, les versions actuelles de ProGuard semblent attendre le qualificateur de type de retour :

-assumenosideeffects class android.util.Log {
    public static int   d(...);
    public static int   w(...);
    public static int   v(...);
    public static int   i(...);
    public static int wtf(...);
}

3voto

snehal Points 91

Dans le fichier build.gradle de l'application, définissez :

release {
    minifyEnabled true
     ……
}

dans proguard-rules.pro, mettez :

-assumenosideeffects class android.util.Log {
  public static *** v(...);
  public static *** d(...);
  public static *** i(...);
  public static *** w(...);
  public static *** e(...);
}
-ignorewarnings

Ça a fonctionné pour moi.

0voto

user25 Points 511

Je fais habituellement ce qui suit:

si (BuildConfig.DEBUG) Log.i(TAG, msg);

mais si vous avez beaucoup de dépendances (bibliothèques) et qu'elles sont mal écrites alors oui, utilisez simplement https://stackoverflow.com/a/5553290/4548520

rendant les lignes plus courtes:

private final static boolean DEBUG = BuildConfig.DEBUG;

si (DEBUG) Log.i(TAG, msg_1);

si (DEBUG) Log.e(TAG, msg_error_2);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X