在Android中,通過代碼自動去除Log打印,常見的有兩種主流方案:
方案一:ProGuard / R8 混淆去除(推薦)
在正式版構(gòu)建時,通過混淆規(guī)則直接刪除Log代碼。
步驟:
- 在
proguard-rules.pro中添加規(guī)則:
# 移除所有Log調(diào)用
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** w(...);
public static *** e(...);
public static *** wtf(...);
public static *** println(...);
}
# 如果只想保留某些級別(例如只保留e和wtf)
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** w(...);
}
- 在
build.gradle中配置:
android {
buildTypes {
release {
minifyEnabled true // 啟用混淆
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
}
優(yōu)點: 字節(jié)碼級別刪除,性能最好,Log代碼完全不存在
缺點: 混淆后堆棧信息不準(zhǔn)確(可保留行號)
方案二:BuildConfig 條件控制
通過BuildConfig字段在編譯時控制Log調(diào)用。
步驟:
- 定義Log工具類:
public class Logger {
public static void d(String tag, String msg) {
if (BuildConfig.DEBUG) {
Log.d(tag, msg);
}
}
public static void i(String tag, String msg) {
if (BuildConfig.DEBUG) {
Log.i(tag, msg);
}
}
// ... 其他級別
}
- 使用自定義Log類:
Logger.d("TAG", "這條日志只在Debug模式下打印");
- build.gradle 配置(自動生成BuildConfig.DEBUG):
android {
buildTypes {
debug {
debuggable true
// BuildConfig.DEBUG = true
}
release {
debuggable false
// BuildConfig.DEBUG = false
}
}
}
優(yōu)點: 簡單易懂,不依賴混淆
缺點: Log代碼仍在apk中,只是不執(zhí)行
推薦組合方案
public class L {
public static void d(String tag, String msg) {
if (BuildConfig.DEBUG) {
Log.d(tag, msg);
}
}
}
// proguard-rules.pro 額外添加
-assumenosideeffects class com.yourpackage.L {
public static *** d(...);
}
這樣Debug版本正常打印,Release版本連條件判斷都會被優(yōu)化掉。
注意事項
-
字符串拼接問題: 即使Log被移除,字符串拼接仍會執(zhí)行
// 錯誤:字符串仍會拼接 Log.d(TAG, "user=" + user.toString()); // 正確:使用條件判斷或延遲加載 if (BuildConfig.DEBUG) { Log.d(TAG, "user=" + user.toString()); } 保留異常堆棧: 建議保留
Log.e()用于記錄異常-
Timber庫: 推薦使用Timber,配合ProGuard規(guī)則更優(yōu)雅
implementation 'com.jakewharton.timber:timber:5.0.1' // 在Application中 if (BuildConfig.DEBUG) { Timber.plant(new Timber.DebugTree()); }
最佳實踐: 使用 ProGuard + BuildConfig 雙重保證,開發(fā)階段靈活控制,發(fā)布版本徹底移除。