APP打包时,在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(...);
}
当我们需要上送某个操作的执行步骤,比如借助Log的输出,用于分析、定位问题,那么使用java的观察者方式,不失为一个好的方式。
代码:
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();
}
/**
* 发布通知
*
* @param msg 被订阅的数据
*/
public void log(Object msg) {
//标示状态或者内容发生改变
setChanged();
//通知所有观察者
notifyObservers(msg);
}
}
使用:
// 日志输出
private void print(String tag, String msg) {
Log.e(tag, msg);
// 入参与addObserver update方法的arg对应
LogSdk.getInstance().log(new String[]{tag, msg});
}
private void clickBtn() {
// 用于存储执行步骤
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());
}
});
// 模拟执行
for (int i = 0; i < 10; i++) {
print("test", "item-" + i);
}
// 取消观察
LogSdk.getInstance().deleteObservers();
// 拿到模拟执行的输出日志
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
网友评论