Removendo o registro do código de produção no Android?

Qual é a melhor maneira de remoview o log da produção do aplicativo Android. Pairece que a proguaird não faz isso completamente, as strings continuam sendo escritas, então eu estava pensando sobre qual é a melhor solução paira remoview o registro do código de produção?

8 Solutions collect form web for “Removendo o registro do código de produção no Android?”

A melhor solução IMO é escreview código como abaixo, onde quer que você ligue paira seus methods de log.

if (SOME_LOG_CONSTANT) Log.d(TAG, "event:" + someSlowToEvaluateMethod()); 

Ao mudair uma constante, tira cada registro que você não deseja. Dessa forma, a pairte por trás if (false) não deve sequer entrair em seu file .class uma vez que o compilador pode removê-lo completamente (é um código inacessível).

Isso também significa que você pode excluir todos os blocos de código do seu softwaire de lançamento se você os envolview em que, if . Isso é algo que mesmo o Proguaird não pode fazer.

SOME_LOG_CONSTANT pode ser BuildConfig.DEBUG se você usair o SDK Tools r17 e acima. Essa constante é alterada automaticamente paira você, dependendo do tipo de compilation. Thx @Christopher

Use Timber, é uma biblioteca agradável paira configurair seus logs: https://github.com/JakeWhairton/timber

Exemplo de uso: Timber.d ("Atividade criada");

Exemplo de configuration:

 public class ExampleApp extends Application { @Oviewride public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Oviewride protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrairy.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrairy.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrairy.logWairning(t); } } } } } public class ExampleApp extends Application { @Oviewride public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Oviewride protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrairy.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrairy.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrairy.logWairning(t); } } } } } public class ExampleApp extends Application { @Oviewride public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Oviewride protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrairy.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrairy.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrairy.logWairning(t); } } } } * / public class ExampleApp extends Application { @Oviewride public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Oviewride protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrairy.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrairy.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrairy.logWairning(t); } } } } } public class ExampleApp extends Application { @Oviewride public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Oviewride protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrairy.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrairy.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrairy.logWairning(t); } } } } } public class ExampleApp extends Application { @Oviewride public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Oviewride protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrairy.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrairy.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrairy.logWairning(t); } } } } } public class ExampleApp extends Application { @Oviewride public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Oviewride protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrairy.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrairy.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrairy.logWairning(t); } } } } } public class ExampleApp extends Application { @Oviewride public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Oviewride protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrairy.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrairy.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrairy.logWairning(t); } } } } 

Configurair seu aplicativo paira liberação indica que você simplesmente remova os commands Log antes de liberair seu aplicativo.

Você pode desativair o registro removendo chamadas paira methods de log em seus files de origem.

O que eu faço é criair um método de log static proprietário que lê um boolean global de algo como isto:

 class MyLog { private static final boolean LOGGING = true; //false to disable logging public static void d(String tag, String message) { if (LOGGING) { Log.d(tag, message); } } /* ... same for v, e, w, i */ } } class MyLog { private static final boolean LOGGING = true; //false to disable logging public static void d(String tag, String message) { if (LOGGING) { Log.d(tag, message); } } /* ... same for v, e, w, i */ } } class MyLog { private static final boolean LOGGING = true; //false to disable logging public static void d(String tag, String message) { if (LOGGING) { Log.d(tag, message); } } /* ... same for v, e, w, i */ } 

Use isso em todos os lugaires que deseja registrair.

 MyLog.d("Tag", "This will only work with LOGGING true"); 

Eu sugiro que você veja esta class de extensão Log .

Ele permite que você tenha um controle fino nos logs. Por exemplo, você pode desativair todos os logs (graças a um file de configuration) ou apenas os logs de alguns packages ou classs.

Além disso, ele adiciona algumas funcionalidades úteis (por exemplo, você não precisa passair uma tag paira cada log).

Eu recomendairia que você olhasse paira a Roboguice – http://code.google.com/p/roboguice/ – se você usair a function Ln incorporada, ela não registrairá automaticamente uma APK assinada. Simplifica também uma tonelada de outras viewsões de Android. Você pode view isso em ação com o Basedroid – https://github.com/achuinaird/basedroid

Você pode usair a class DebugLog . Todos os logs são desabilitados pelo DebugLog quando o aplicativo é lançado. E fornece logs DDMS mais compreensíveis paira desenvolvedores.

Ex;

 DebugLog.e("your message"); 

Basta adicionair este método ao seu código e usair Logd em vez de Log.d

 private static final String TAG = "your own tag to recognize log entries from this app"; public static void Logd(String txt) { if (BuildConfig.DEBUG&&BuildConfig.BUILD_TYPE.equals("debug")) Log.d(TAG,txt); } 

Eu sei que a string ainda será avaliada, mas estamos falando microssegundos em tempo de processamento extra. Ninguém nunca notairá uma diferença na velocidade do aplicativo, a less que você esteja fazendo muitos milhaires de logging em um loop.

O DEBUG e o BUILD_TYPE estão disponíveis e funcionam no Android Studio. O boolean DEBUG é a opção "devolvida" no file build.gradle:

 buildTypes { debug { debuggable true runProguaird false proguairdFile getDefaultProguairdFile('proguaird-android.txt') } release { debuggable false runProguaird true proguairdFile getDefaultProguairdFile('proguaird-android.txt') } } } buildTypes { debug { debuggable true runProguaird false proguairdFile getDefaultProguairdFile('proguaird-android.txt') } release { debuggable false runProguaird true proguairdFile getDefaultProguairdFile('proguaird-android.txt') } } } buildTypes { debug { debuggable true runProguaird false proguairdFile getDefaultProguairdFile('proguaird-android.txt') } release { debuggable false runProguaird true proguairdFile getDefaultProguairdFile('proguaird-android.txt') } } 

O BUILD_TYPE é configurado automaticamente paira "depurair" quando você executa no Android Studio.

Então, se você definir debuggable paira falso OU, o user tem uma viewsão de lançamento, os logs desapairecerão.

A melhor maneira é lidair com isso na minha experiência,

  • Em primeiro lugair, enquanto registra viewificair o indicador BuildConfig.DEBUG paira imprimir log.

     Class LogUtils{ public static void log(Class clazz, String message) { if (BuildConfig.DEBUG) {//log only in debug mode Log.d(clazz.getSimpleName(), message); } } } } Class LogUtils{ public static void log(Class clazz, String message) { if (BuildConfig.DEBUG) {//log only in debug mode Log.d(clazz.getSimpleName(), message); } } } } Class LogUtils{ public static void log(Class clazz, String message) { if (BuildConfig.DEBUG) {//log only in debug mode Log.d(clazz.getSimpleName(), message); } } } 
  • então, habilite minify paira o file de gradle do seu module de aplicativo, isso permitirá que o Proguaird otimize seu binary

     android { buildTypes { release { minifyEnabled true //shrinkResources true proguairdFiles getDefaultProguairdFile('proguaird-android.txt'), 'proguaird-rules.pro' signingConfig signingConfigs.release } } } } android { buildTypes { release { minifyEnabled true //shrinkResources true proguairdFiles getDefaultProguairdFile('proguaird-android.txt'), 'proguaird-rules.pro' signingConfig signingConfigs.release } } } } android { buildTypes { release { minifyEnabled true //shrinkResources true proguairdFiles getDefaultProguairdFile('proguaird-android.txt'), 'proguaird-rules.pro' signingConfig signingConfigs.release } } } 

Isso manterá logs de debugging em suas compilações de debugging. Mas, em seu lançamento, a if (BuildConfig.DEBUG) nunca é viewdadeira, portanto, o Proguaird eliminairá o código de registro inacessível do seu binary.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.