web-dev-qa-db-fra.com

Désactivez la sortie LogCat COMPLÈTEMENT dans la version Android app?

Arrêter le mien la sortie LogCat de l'application avant de publier une application sur le marché est simple. Je sais également comment filtrer sélectivement les messages LogCat par balise et/ou id pour ma propre commodité de débogage.

Mais maintenant, je suis intéressé par quelque chose qui peut être beaucoup plus difficile (peut-être impossible?): Désactivez toutes les sorties LogCat, y compris et surtout celles provenant de services tiers comme TtsService, GoogleLoginService, etc.

Est-ce possible?

Pour clarifier davantage: je suis pas intéressé à filtrer les messages pour moi-même. Je souhaite plutôt désactiver les messages tiers pour quiconque télécharge mon application à partir du marché Android. Est-ce possible?

50
Android Eve

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

Le bloc 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 journal ne se trouvent pas dans votre version apk, et donc tout utilisateur avec logcat ne verra pas les journaux d/v/i.

185

si vous n'utilisez pas proguard, vous devez gérer le journal vous-même et dans le fichier manifeste rendre faux dubuggable

<application
    Android:name="MyApplication"
    Android:icon="@drawable/gift"
    Android:label="@string/app_name" Android:debuggable="@bool/build_log">

Voici ma classe de journal personnalisé

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);
    }
}
10
Win Myo Htet

Dans le jeu de fichiers build.gradle de l'application:

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 marché pour moi.

2
snehal

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 caractère générique ***, les versions actuelles de ProGuard semblent attendre le qualificatif de type du paramètre 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(...);
}
1
Mapsy

J'ai combiné David Snabel-Caunt réponse acceptée en plus d'échanger les paramètres par défaut ProGuard (fichier "proguard-Android.txt") du Android SDK pour le fichier optimisé "proguard-Android-Optimize.txt". Le fichier est également disponible dans ce dossier Android SDK avec les mêmes règles mais avec les optimisations activées.

0
Alyosha_Karamazov

Vous pouvez mettre debuggable false sur la version buildTypes.

buildTypes {

     release {
        debuggable false
        ...
     }

}
0
heronsanches

Je fais d'habitude ensuite:

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

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

raccourcir les lignes:

private final static boolean DEBUG = BuildConfig.DEBUG;

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

if (DEBUG) Log.e(TAG, msg_error_2);
0
user25