在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
這個配置。