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?
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.
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);
}
}
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.
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(...);
}
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.
Vous pouvez mettre debuggable false sur la version buildTypes.
buildTypes {
release {
debuggable false
...
}
}
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);