APP打包時(shí)旨巷,在proguard-rules.pro添加以下配置,可以去除Log的日志輸出:
-assumenosideeffects class android.util.Log {
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
當(dāng)我們需要上送某個(gè)操作的執(zhí)行步驟添忘,比如借助Log的輸出采呐,用于分析、定位問題搁骑,那么使用java的觀察者方式斧吐,不失為一個(gè)好的方式。
代碼:
import java.util.Observable;
public class LogSdk extends Observable {
private LogSdk() {
}
public static LogSdk getInstance() {
return LogSdkHolder.instance;
}
private static class LogSdkHolder {
private static final LogSdk instance = new LogSdk();
}
/**
* 發(fā)布通知
*
* @param msg 被訂閱的數(shù)據(jù)
*/
public void log(Object msg) {
//標(biāo)示狀態(tài)或者內(nèi)容發(fā)生改變
setChanged();
//通知所有觀察者
notifyObservers(msg);
}
}
使用:
// 日志輸出
private void print(String tag, String msg) {
Log.e(tag, msg);
// 入?yún)⑴caddObserver update方法的arg對應(yīng)
LogSdk.getInstance().log(new String[]{tag, msg});
}
private void clickBtn() {
// 用于存儲執(zhí)行步驟
StringBuilder sb = new StringBuilder();
// 訂閱觀察
LogSdk.getInstance().addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
String[] args = (String[]) arg;
sb.append(args[0]).append(":").append(args[1]).append(System.lineSeparator());
}
});
// 模擬執(zhí)行
for (int i = 0; i < 10; i++) {
print("test", "item-" + i);
}
// 取消觀察
LogSdk.getInstance().deleteObservers();
// 拿到模擬執(zhí)行的輸出日志
Log.e("whz", sb.toString());
}
過濾whz靶病,有以下輸出:
test:item-0
test:item-1
test:item-2
test:item-3
test:item-4
test:item-5
test:item-6
test:item-7
test:item-8
test:item-9