/* * ** * @(#)LogPrinter.java 2016-01-19 * * Copyright 2000-2016 by Koudai Corporation. * * All rights reserved. * * This software is the confidential and proprietary information of * Koudai Corporation ("Confidential Information"). You * shall not disclose such Confidential Information and shall use * it only in accordance with the terms of the license agreement * you entered into with Koudai. * * * */ package com.weidian.blockcanary; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; import android.util.Log; import android.util.Printer; /** * Created by fengcunhan on 16/1/19. */ public class LogPrinter implements Printer { public static final String ACTION_BLOCK="com.weidian.blockcannary"; public static final String EXTRA_START_TIME="block_happen_time"; public static final String EXTRA_FINISH_TIME="block_finish_time"; private static final String TAG="LogPrinter"; private Context mContext; private static final String START_TAG=">>>>> Dispatching to"; private static final String FINISH_TAG="<<<<< Finished to"; private static final int START=0; private static final int FINISH=1; private static final int UNKONW=2; private boolean mStartedPrinting=false; private long mStartTimeMillis; private long mStartThreadTimeMillis; private long mBlockThresholdMillis=500; private StackInfoCatcher mStackInfoCatcher; public LogPrinter(Context context){ this.mContext=context; mStackInfoCatcher=new StackInfoCatcher(context); mStackInfoCatcher.start(); } @Override public void println(String x) { switch (isStart(x)){ case START: mStartTimeMillis = System.currentTimeMillis(); mStartThreadTimeMillis = SystemClock.currentThreadTimeMillis(); mStartedPrinting = true; break; case FINISH: final long endTime = System.currentTimeMillis(); mStartedPrinting = false; if (isBlock(endTime)) { notifyBlockEvent(endTime,mStartTimeMillis); } break; default: } } private int isStart(String x){ //Log.e(TAG,x+""); if(!TextUtils.isEmpty(x)){ if(x.startsWith(START_TAG)){ return START; }else if(x.startsWith(FINISH_TAG)){ return FINISH; } } return UNKONW; } private boolean isBlock(long endTime) { return endTime - mStartTimeMillis > mBlockThresholdMillis; } private void notifyBlockEvent(long endTime,long startTime){ Log.e(TAG,"block time:"+(endTime-startTime)); LocalBroadcastManager manager= LocalBroadcastManager.getInstance(mContext); Intent intent=new Intent(ACTION_BLOCK); intent.putExtra(EXTRA_START_TIME,startTime); intent.putExtra(EXTRA_FINISH_TIME,endTime); manager.sendBroadcast(intent); } public void stop(){ if(null!=mStackInfoCatcher){ mStackInfoCatcher.stopTrace(); } } }