Android中的日志工具类Log(android.util.Log),这个类提供了如下几个方法来提供我们打印:
1.Log.v();
这个方法用于打印那些最为琐碎的,意义最小的日志信息。对应的级别verbose,是Android日志里面级别最低的一中。
2.Log.d();
这个方法是打印一些调试信息,这些信息对你调试程序和分析问题应该有帮助的。对应的级别是debug,比verbose高一级。
3.Log.i();
这个方法是用于打印一些比较重要的数据,这些数据应该是你非常想看的。可以帮助你分析用户行为的那种。对应级别是info,比debug高一级。
4.Log.w();
这个方法用于打印一些警告信息,提示程序在这个地方可能存在潜在的风险,最好去修复一下这些出现的警告的地方。对应的级别warm,比info高一级。
5.Log.e();
这个方法是打印程序中的错误信息,比如程序中的catch语句当中,有错误信息打印的时候。对应的级别是error,比warm高一级
现在我们了解了Android的打印数据的级别,当时有这写在项目中应用还是不够的,这样在项目上线之前我们还要一个一个的将项目中的日志打印代码删除,来保护一些机密诗句不被泄露或者提高运行效率,现在我们就来设计一个既不用删除代码并且能够随意切换日志级别与是否打印的自定义的日志工具类。
package *; import android.text.TextUtils; import android.util.Log; /** * * 日志打印工具 */ public class LogUtil { /** * level 决定日志的显示级别, * VERBOSE显示所有级别日志 * 显示中间个个级别的日志 * NOTHING不是显示任何日志 */ private static final int VERBOSE = 1; private static final int DEBUG = 2; private static final int INFO = 3; private static final int WARN = 4; private static final int ERROR = 5; private static final int NOTHING = 6; /** * 控制打印级别 * 是否打印日志 */ private static final int LEVEL = VERBOSE; //本项目默认tag private static final String defaultTag = "zonglv"; public static void v(String msg){ v(null, msg); } public static void v(String tag, String meg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= VERBOSE){ Log.v(tag,meg); } } public static void d(String msg){ d(null, msg); } public static void d(String tag, String msg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= DEBUG){ Log.d(tag, msg); } } public static void i(String msg){ i(null, msg); } public static void i(String tag, String msg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= INFO){ Log.i(tag, msg); } } public static void w(String msg){ w(null,msg); } public static void w(String tag, String msg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= WARN){ Log.w(tag, msg); } } public static void e(String msg){ e(null, msg); } public static void e(String tag, String msg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= ERROR){ Log.e(tag, msg); } } }
这个日志打印流程,在咖啡过程中是方便了很多。但是每到打包的时候,我没都要修改配置文件。流程繁琐容易遗忘,那我们继续优化一下。
android { compileSdkVersion 23 buildToolsVersion '25.0.0' defaultConfig { applicationId "gggggggggggg" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" buildConfigField "boolean", "LOG_DEBUG", "true" buildConfigField "String", "BASE_URL", "\"ggggggggggggggggggggggggggg\"" }
在gradle文件的Android中的default中添加 debug = false
buildConfigField "boolean", "LOG_DEBUG", "true"
在gradle文件中的buildType中的debug中同样添加debug = true
buildTypes { release { //混淆 minifyEnabled true //Zipalign优化 zipAlignEnabled true // 移除无用的resource文件 shrinkResources true //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //签名 signingConfig signingConfigs.release } debug { buildConfigField "String", "BASE_URL", "\"http://192.168.122.38:8080/hhhh/\"" buildConfigField "boolean", "LOG_DEBUG", "true" zipAlignEnabled true minifyEnabled false shrinkResources false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.debug } }
在我们的工具类中添加 level&&debug 的条件,直接运行会debug 配置会覆盖release中的配置。打包的流程不会执行debug配置。
我们的正式环境就不用担心会有日志输出了。开发环境中会正常的输出日志
debug与release会自动生成到BuildConfig文件中的静态类中。
public class LogUtils { /** * level 决定日志的显示级别, * VERBOSE显示所有级别日志 * 显示中间个个级别的日志 * NOTHING不是显示任何日志 */ private static final int VERBOSE = 1; private static final int DEBUG = 2; private static final int INFO = 3; private static final int WARN = 4; private static final int ERROR = 5; private static final int NOTHING = 6; /** * 控制打印级别 * 是否打印日志 */ private static final int LEVEL = VERBOSE;//显示所有级别日志 // private static final int LEVEL = NOTHING;//屏蔽所有日志 //本项目默认tag private static final String defaultTag = "zhuangjian";//默认过滤器 public static void v(String msg){ v(null, msg); } public static void v(String tag, String meg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= VERBOSE && BuildConfig.DEBUG){ Log.v(tag,meg); } } public static void d(String msg){ d(null, msg); } public static void d(String tag, String msg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= DEBUG && BuildConfig.DEBUG){ Log.d(tag, msg); } } public static void i(String msg){ i(defaultTag, msg); } public static void i(String tag, String msg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if( LEVEL <= INFO && BuildConfig.DEBUG){ Log.i(tag, msg); } } public static void w(String msg){ w(null,msg); } public static void w(String tag, String msg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= WARN && BuildConfig.DEBUG){ Log.w(tag, msg); } } public static void e(String msg){ e(null, msg); } public static void e(String tag, String msg){ if(TextUtils.isEmpty(tag)){ tag = defaultTag; } if(LEVEL <= ERROR && BuildConfig.DEBUG){ Log.e(tag, msg); } } }