在Release版本中如何关闭Debug版本中的log
2011-12-26 23:06
399 查看
之前在程序中有打了很多的log,当初打log的方式也没有统一,删掉肯定不行,统一修改也挺麻烦的。今天在stackoverflow上面看到有对这个的讨论
主要有以下三种方式关闭log信息http://stackoverflow.com/questions/2446248/deactivate-any-calls-to-log-before-publishing-are-there-tools-to-do-this
方法一:
方法二:
I find a far easier solution is to forget all the
all over the place and just use ProGuard to
strip out any
calls when we call our Ant
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:
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 the
examples 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:
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.
还看到一种方法,但是没有明白到底怎么使用:http://www.quietlycoding.com/?p=9
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
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 here for
more details about the Logging capabilities on Android.
备注:对于我们的程序来说,代码量庞大,第二中方式是比较好的选择
主要有以下三种方式关闭log信息http://stackoverflow.com/questions/2446248/deactivate-any-calls-to-log-before-publishing-are-there-tools-to-do-this
方法一:
if(condition) Log.d(LOG_TAG, "Something");缺点:每打log都要做判断
方法二:
I find a far easier solution is to forget all the
ifchecks
all over the place and just use ProGuard to
strip out any
Log.d()or
Log.v()method
calls when we call our Ant
releasetarget.
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:
-dontskipnonpubliclibraryclasses -dontobfuscate -forceprocessing -optimizationpasses 5 -keep class * extends android.app.Activity -assumenosideeffects class android.util.Log { public static *** d(...); public static *** v(...); }
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 the
examples 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:
public class Log { static final boolean LOG = false; public static void i(String tag, String string) { if (LOG) android.util.Log.i(tag, string); } public static void e(String tag, String string) { if (LOG) android.util.Log.e(tag, string); } public static void d(String tag, String string) { if (LOG) android.util.Log.d(tag, string); } public static void v(String tag, String string) { if (LOG) android.util.Log.v(tag, string); } public static void w(String tag, String string) { if (LOG) android.util.Log.w(tag, string); } }
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.
还看到一种方法,但是没有明白到底怎么使用:http://www.quietlycoding.com/?p=9
import android.util.Log; public class MyLog { public static void d(String tag, String msg) { if (Log.isLoggable(tag, Log.DEBUG)) { Log.d(tag, msg); } } public static void i(String tag, String msg) { if (Log.isLoggable(tag, Log.INFO)) { Log.i(tag, msg); } } public static void e(String tag, String msg) { if (Log.isLoggable(tag, Log.ERROR)) { Log.e(tag, msg); } } public static void v(String tag, String msg) { if (Log.isLoggable(tag, Log.VERBOSE)) { Log.v(tag, msg); } } public static void w(String tag, String msg) { if (Log.isLoggable(tag, Log.WARN)) { Log.w(tag, msg); } } }
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 here for
more details about the Logging capabilities on Android.
备注:对于我们的程序来说,代码量庞大,第二中方式是比较好的选择
相关文章推荐
- 【Android】在Release版本中如何关闭Debug版本中的log
- 在Release版本中如何关闭Debug版本中的log
- 在Release版本中如何关闭Debug版本中的log
- 在Release版本中如何关闭Debug版本中的log
- 如何写一个可以设置等级的打印log,类似于 Debug版本 和release版本。
- 如何让debug版本和release版本的签名一致
- VS2008 如何将Release版本设置可以调试的DEBUG版本
- C#如何生成release版本的程序,生成debug版本的程序
- 在PCH中定制自己的LOG打印日志,分别在DEBUG 与 RELEASE的状态下处理,及如何把PCH引入到项目中
- VS2008 如何将Release版本设置可以调试的DEBUG版本
- C#.NET常见问题(FAQ)-如何生成release版本的程序,生成debug版本的程序
- VC6.0如何编译生成Release或Debug版本?
- VS2008 如何将Release版本设置可以调试的DEBUG版本
- C#.NET常见问题(FAQ)-如何生成release版本的程序,生成debug版本的程序
- 如何debug部署到客户环境里面的release版本的产品
- VC6.0如何编译生成Release或Debug版本?
- Debug和Release版本--打印log
- Android中Log.d和Log.v如何实现在release版本不输出
- iOS开发debug跟release版本log屏蔽方法
- 编译as3时如何区分debug和Release版本