android 去除log打印

在Android中,通過代碼自動去除Log打印,常見的有兩種主流方案

方案一:ProGuard / R8 混淆去除(推薦)

在正式版構(gòu)建時,通過混淆規(guī)則直接刪除Log代碼。

步驟:

  1. 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(...);
}
  1. 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)用。

步驟:

  1. 定義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);
        }
    }
    
    // ... 其他級別
}
  1. 使用自定義Log類:
Logger.d("TAG", "這條日志只在Debug模式下打印");
  1. 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)化掉。

注意事項

  1. 字符串拼接問題: 即使Log被移除,字符串拼接仍會執(zhí)行

    // 錯誤:字符串仍會拼接
    Log.d(TAG, "user=" + user.toString());
    
    // 正確:使用條件判斷或延遲加載
    if (BuildConfig.DEBUG) {
        Log.d(TAG, "user=" + user.toString());
    }
    
  2. 保留異常堆棧: 建議保留 Log.e() 用于記錄異常

  3. 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ā)布版本徹底移除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容