博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Release版本中如何关闭Debug版本中的log
阅读量:4920 次
发布时间:2019-06-11

本文共 3814 字,大约阅读时间需要 12 分钟。

之前在程序中有打了很多的log,当初打log的方式也没有统一,删掉肯定不行,统一修改也挺麻烦的。今天在stackoverflow上面看到有对这个的讨论

主要有以下三种方式关闭log信息

方法一:

 

[html] 
 
  1. if(condition)  
  2.   Log.d(LOG_TAG, "Something");  

缺点:每打log都要做判断

 

方法二:

 

I find a far easier solution is to forget all the if checks all over the place and just use  to strip out any Log.d() or Log.v() method calls when we call our Ant release target.

That way, we always have the debug info being output for regular builds and don't have to make any code changes for release builds. ProGuard can also do multiple passes over the bytecode to remove other undesired statements, empty blocks and can automatically inline short methods where appropriate.

For example, here's a very basic ProGuard config for Android:

 

[html] 
 
  1. -dontskipnonpubliclibraryclasses  
  2. -dontobfuscate  
  3. -forceprocessing  
  4. -optimizationpasses 5  
  5.   
  6. -keep class * extends android.app.Activity  
  7. -assumenosideeffects class android.util.Log {  
  8.     public static *** d(...);  
  9.     public static *** v(...);  
  10. }  

 

So you would save that to a file, then call ProGuard from Ant, passing in your just-compiled JAR and the Android platform JAR you're using.

See also  in the ProGuard manual.

缺点:需要借助第三方的工具

方法三:

 

All good answers, but when I was finished with my development I didn´t want to either use if statements around all the Log calls, nor did I want to use external tools.

So the solution I`m using is to replace the android.util.Log class with my own Log class:

 

[html] 
 
  1. public class Log {  
  2. static final boolean LOG = false;  
  3.   
  4. public static void i(String tag, String string) {  
  5.     if (LOG) android.util.Log.i(tag, string);  
  6. }  
  7. public static void e(String tag, String string) {  
  8.     if (LOG) android.util.Log.e(tag, string);  
  9. }  
  10. public static void d(String tag, String string) {  
  11.     if (LOG) android.util.Log.d(tag, string);  
  12. }  
  13. public static void v(String tag, String string) {  
  14.     if (LOG) android.util.Log.v(tag, string);  
  15. }  
  16. public static void w(String tag, String string) {  
  17.     if (LOG) android.util.Log.w(tag, string);  
  18. }  
  19. }  

 

The only thing I had to do in all the source files was to replace the import of android.util.Log with my own class.

缺点:The only problem with this approach is that, if you do Log.d("tag", "Processed: " + new ItemCounter(blabla) + " items "), even if this log message does not appear in your released version, a StringBuilder is used to create the message, which could be expensive to create.

还看到一种方法,但是没有明白到底怎么使用:

 

[html] 
 
  1. import android.util.Log;  
  2.   
  3. public class MyLog {  
  4.   
  5. public static void d(String tag, String msg) {  
  6. if (Log.isLoggable(tag, Log.DEBUG)) {  
  7. Log.d(tag, msg);  
  8. }  
  9. }  
  10.   
  11. public static void i(String tag, String msg) {  
  12. if (Log.isLoggable(tag, Log.INFO)) {  
  13. Log.i(tag, msg);  
  14. }  
  15. }  
  16.   
  17. public static void e(String tag, String msg) {  
  18. if (Log.isLoggable(tag, Log.ERROR)) {  
  19. Log.e(tag, msg);  
  20. }  
  21. }  
  22.   
  23. public static void v(String tag, String msg) {  
  24. if (Log.isLoggable(tag, Log.VERBOSE)) {  
  25. Log.v(tag, msg);  
  26. }  
  27. }  
  28.   
  29. public static void w(String tag, String msg) {  
  30. if (Log.isLoggable(tag, Log.WARN)) {  
  31. Log.w(tag, msg);  
  32. }  
  33. }  
  34. }  

 

To summarize the preceding code, the MyLog class is simply wrapping the calls to the android Log class. The rest of your application can simply reference MyLog.d(“MyApp”, “Sample debug message”); and if the device/emulator running the app has the log level set to debug the message will appear. The benefit here is you won’t have to worry about removing print lines or maintaining variables for levels that you might forget to change before building your release apk.

Changing the log level on device is actually very simple. Simply run adb shell setprop log.tag.<YOUR_LOG_TAG> <LEVEL>

There you have it, this is only a small sample of what you can do meant to get you started. This code is compatible with Android since API Level 1. I recommend reading through the Log javadoc  for more details about the Logging capabilities on Android.

 

原文:

转载于:https://www.cnblogs.com/veins/p/3924779.html

你可能感兴趣的文章
Django表单
查看>>
ini 文件操作记要(2): 使用 TMemIniFile
查看>>
(第3篇)HDFS是什么?HDFS适合做什么?我们应该怎样操作HDFS系统?
查看>>
隐藏 DataGrid 中 DataSource 为 DataTable 的 DataColumn (Visual C#)
查看>>
【译 】Solr in Action 第一章
查看>>
计算几何初步模板
查看>>
POJ 数据结构(2)
查看>>
HDU 3869 Color the Simple Cycle (Polya计数法)
查看>>
String字符串常用方法
查看>>
猴子们的研究
查看>>
[Python]小甲鱼Python视频第027课(集合:在我的世界里,你就是唯一)课后题及参考解答...
查看>>
sed
查看>>
关系数据库-----SQL标准语言
查看>>
java设计模式----中介模式
查看>>
常用通用JS函数
查看>>
第一章 读后心得体会
查看>>
windows下命令行cmder工具
查看>>
【深度学习大讲堂】首期第一讲:人工智能的ABCDE 第二部分:简谈当前AI技术与发展趋势...
查看>>
pandas 3 设置值
查看>>
pip无法更新
查看>>