美文网首页Android干货集中营Android知识Android开发
[Android黑科技]发布应用时控制log日志输出

[Android黑科技]发布应用时控制log日志输出

作者: 小池laucherish | 来源:发表于2017-05-17 14:23 被阅读182次

    在Android开发的过程中,我们使用android.util.Log来打印日志,以便观察调试信息和输出结果。但是当我们将应用发布的时候,并不希望再显示这些信息,一方面影响用户的机器性能,另一方面也会暴露我们应用的一些关键信息,对应用的安全造成威胁。所以,在正式发布应用的时候,我们会移除或者隐藏这些Log信息,以下介绍几种方法。

    方法一:在打印Log的时候进行条件判断

    if(BuildConfig.DEBUG)
      Log.i(TAG, "Debugging");
    

    如果应用中log比较少,可以选择这种方法,简单快捷有效。

    方法二:自己封装一个Log工具类,在类中设置日志显示级别

    public class LogUtils {
         public static int LOG_LEVEL = 0;
         public static int ERROR = 1;
         public static int WARN = 2;
         public static int INFO = 3;
         public static int DEBUG = 4;
         public static int VERBOS = 5;
    
         public static void e(String tag,String msg){
          if(LOG_LEVEL>ERROR)
          Log.e(tag, msg);
         }
         public static void w(String tag,String msg){
          if(LOG_LEVEL>WARN)
          Log.w(tag, msg);
         }
         public static void i(String tag,String msg){
          if(LOG_LEVEL>INFO)
          Log.i(tag, msg);
         }
         public static void d(String tag,String msg){
          if(LOG_LEVEL>DEBUG)
          Log.d(tag, msg);
         }
         public static void v(String tag,String msg){
          if(LOG_LEVEL>VERBOS)
          Log.v(tag, msg);
         }
    }
    

    这个方法也是目前比较流行的做法,自己可以随意设置需要把什么级别的日志信息显示出来。

    方法三:黑科技,通过Proguard混淆移除Log信息

    首先,将build.gradle中的minifyEnabled设置为true,开启混淆。

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
            signingConfig signingConfigs.SginConfig
        }
    }
    

    其次,在proguard-rules.pro文件中添加以下代码

    -assumenosideeffects class android.util.Log {
        public static boolean isLoggable(java.lang.String, int);
        public static int v(...);
        public static int i(...);
        public static int w(...);
        public static int d(...);
        public static int e(...);
    

    可以根据需要在发布应用时候显示的级别来决定移除哪些级别的Log(将需要移除的Log级别放在以上配置里面),同时proguard的配置中还要注意不要有-dontoptimize这个配置。

    相关文章

      网友评论

      • 天煞魔猎手:关于使用assumenosideeffects的混淆配置时,实际上只是仅仅把Log类相关方法去掉,但是如果打log方法中使用了表达式之类的话,其实是不会去掉的,比如:

        XXXLog.i("tag", "%s", aaa.toString());
        XXXLog.e("tag", new Exception("自定义Exception输出"));

        第一句代码,混淆之后会变为 aaa.toString();
        第二句代码混淆之后,会变为 new Exception(“自定义Exception输出”)

        即Log方法中的内容实际上并不会去掉,而且混淆开启时,这些表达式也不会去掉,那么就以上面两例子来说:

        第一句:我Log都去掉了,但是还执行aaa.toString()方法,实际上是没必要的
        第二句:同样,Log都去掉,是没必要new 一个Exception的,但是实际上还是会执行

        所以个人据地assumnosideeffects 的效果其实很一般

      本文标题:[Android黑科技]发布应用时控制log日志输出

      本文链接:https://www.haomeiwen.com/subject/lgsdxxtx.html