Android订阅日志输出

2023-11-08  本文已影响0人  hongzhenw

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
上一篇 下一篇

猜你喜欢

热点阅读