/* * Created by LuaView. * Copyright (c) 2017, Alibaba Group. All rights reserved. * * This source code is licensed under the MIT. * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree. */ package com.taobao.luaview.util; import android.content.Context; import android.os.Debug; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import com.taobao.luaview.global.LuaViewConfig; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * Log Util * * @author song */ public class LogUtil { private static final String DEFAULT_PREFIX = "[LuaView]"; private static long time = 0; //平均数 private static Map<String, Map> mAvgTime = new HashMap<String, Map>(); private static final String LAST_TIME = "last_time"; private static final String TOTAL_TIME = "total_time"; private static final String PRINT_INTERVAL = "print_interval"; private static final String TIMES = "times"; /** * 统计平均数值 * * @param tag * @param msg */ public static void avgTimeStart(String tag, long printInterval, Object... msg) { if (LuaViewConfig.isDebug()) { Map map = mAvgTime.get(tag); if (map == null) {//没开始 map = new HashMap<String, Object>(); map.put(TOTAL_TIME, 0l); map.put(PRINT_INTERVAL, printInterval); map.put(TIMES, 0l); mAvgTime.put(tag, map); } map.put(LAST_TIME, Debug.threadCpuTimeNanos());//每次都更新最新时间 } } /** * 统计平均时常 * * @param tag * @param msg */ public static void avgTimeEnd(String tag, Object... msg) { if (LuaViewConfig.isDebug()) { Map map = mAvgTime.get(tag); if (map != null) {//已经开始 long lastTime = Long.valueOf(String.valueOf(map.get(LAST_TIME))); long totalTime = Long.valueOf(String.valueOf(map.get(TOTAL_TIME))) + Debug.threadCpuTimeNanos() - lastTime; map.put(TOTAL_TIME, totalTime);//总时间 long printInterval = Long.valueOf(String.valueOf(map.get(PRINT_INTERVAL))); long times = Long.valueOf(String.valueOf(map.get(TIMES))) + 1;//总次数 if (times >= printInterval) {//可以打印 Log.d(DEFAULT_PREFIX, tag + " end " + (double) totalTime / printInterval + " " + getMsg(msg)); mAvgTime.put(tag, null); } else { map.put(TIMES, times);//总次数 } } } } /** * log time start, must used with timeEnd */ public static void timeStart(Object... msg) { if (LuaViewConfig.isDebug()) { time = Debug.threadCpuTimeNanos(); Log.d(DEFAULT_PREFIX, "[start] " + getMsg(msg)); } } /** * log time end, must used with timeStart */ public static void timeEnd(Object... msg) { if (LuaViewConfig.isDebug()) { Log.d(DEFAULT_PREFIX, "[end] " + (Debug.threadCpuTimeNanos() - time) / 1000000 + " " + (Debug.threadCpuTimeNanos() - time) + " " + getMsg(msg)); } } /** * log a info message * * @param msg */ public static void i(Object... msg) { if (LuaViewConfig.isDebug()) { Log.i(DEFAULT_PREFIX, getMsg(msg)); } } /** * log a debug message * * @param msg */ public static void d(Object... msg) { if (LuaViewConfig.isDebug()) { Log.d(DEFAULT_PREFIX, getMsg(msg)); } } /** * log a debug message * * @param msg */ public static void e(Object... msg) { if (LuaViewConfig.isDebug()) { Log.e(DEFAULT_PREFIX, getMsg(msg)); } } /** * log a debug message to file * * @param filePath * @param msg */ public static void fd(String filePath, Object... msg) { if (LuaViewConfig.isDebug()) { toFile(filePath, msg); } } /** * show a toast * * @param context * @param msg */ public static void toast(Context context, Object... msg) { if (LuaViewConfig.isDebug()) { Toast.makeText(context, getMsg(msg), Toast.LENGTH_SHORT).show(); } } /** * get message * * @param msg * @return */ private static String getMsg(Object... msg) { StringBuffer sb = new StringBuffer(); if (msg != null) { for (Object s : msg) { sb.append(s).append(" "); } } return sb.toString(); } /** * log something to file * * @param filePath * @param msg */ private static void toFile(String filePath, Object... msg) { File logFile = null; try { logFile = createFile(filePath, true); } catch (IOException e) { e.printStackTrace(); } if (logFile != null) { try { BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); buf.append(getMsg(msg)); buf.newLine(); buf.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * create file * * @param filepath * @param recursion * @return * @throws java.io.IOException */ private static File createFile(String filepath, boolean recursion) throws IOException { File f = null; if (!TextUtils.isEmpty(filepath)) f = new File(filepath); if (f != null && !f.exists()) { try { f.createNewFile(); } catch (IOException e) { if (!recursion) { throw e; } File parent = f.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } try { f.createNewFile(); } catch (IOException e1) { throw e1; } } } return f; } }