提交 17458740 编写于 作者: J jackjintai

modify:

1、bug fix
上级 08aa759b
......@@ -29,7 +29,7 @@ public class App extends Application {
super.onCreate();
List<IKit> kits = new ArrayList<>();
kits.add(new DemoKit());
DoraemonKit.install(this, kits,"a49842eeebeb1989b3f9565eb12c276b");
DoraemonKit.install(this, kits, "a49842eeebeb1989b3f9565eb12c276b");
//是否显示入口icon
//DoraemonKit.setAwaysShowMainIcon(false);
DoraemonKit.disableUpload();
......
......@@ -4,9 +4,9 @@ ext {
// 线上包不会接入DoraemonKit,测试包会自动接入
applyPlugin : true,
//上传到远程仓库时需要打开
uploadArchives : false,
uploadArchives : true,
//是否发布插件到远程仓库
publishPluginToRemote: false
publishPluginToRemote: true
]
android = [compileSdkVersion : 28,
suppotrSdkVersion : "27.1.1",
......@@ -20,7 +20,7 @@ ext {
//jcenter dokit版本号
jcenterArchivesVersionName: "2.2.4",
//didi内部仓库版本号
didiArchivesVersionName : "1000.0.13",
didiArchivesVersionName : "1000.0.17",
//打包上传时 dokit的版本名字
versionName : "2.2.4",
glide : "4.8.0",
......
......@@ -273,7 +273,6 @@ public final class HeapAnalyzer {
retainedSize = leakingInstance.getTotalRetainedSize();
// TODO: check O sources and see what happened to android.graphics.Bitmap.mBuffer
if (SDK_INT <= N_MR1) {
listener.onProgressUpdate(AnalyzerProgressListener.Step.COMPUTING_BITMAP_SIZE);
retainedSize += computeIgnoredBitmapRetainedSize(snapshot, leakingInstance);
......
......@@ -144,7 +144,6 @@ public class OrderBean implements Comparable<OrderBean> {
@Override
public int compareTo(OrderBean o) {
// TODO Auto-generated method stub
//return 0;
return (int) (order - o.order);
}
......
......@@ -156,8 +156,6 @@ public class CallStackReconstructor {
// top level call.
exitMethod(mTopLevelCallId, 0, 0, mTopLevelCalls);
// TODO: use global / thread times to infer context switches
// Build calls from their respective builders
// Now that we've added the top level call, there should be only 1 top level call
assert mTopLevelCalls.size() == 1;
......
......@@ -107,7 +107,6 @@ public class VmTraceData {
public static TimeUnit getDefaultTimeUnits() {
// The traces from the VM currently use microseconds.
// TODO: figure out if this can be obtained/inferred from the trace itself
return TimeUnit.MICROSECONDS;
}
......
......@@ -152,6 +152,8 @@ class DoraemonKitReal {
//OkHttp 拦截器 注入
OkHttpHook.installInterceptor();
LogHelper.i(TAG, "IS_HOOK====>" + IS_HOOK);
//赋值全局变量
DokitConstant.IS_HOOK = IS_HOOK;
//注册全局的activity生命周期回调
app.registerActivityLifecycleCallbacks(new DokitActivityLifecycleCallbacks());
DokitConstant.KIT_MAPS.clear();
......@@ -185,25 +187,19 @@ class DoraemonKitReal {
tool.add(new CrashCaptureKit());
tool.add(new LogInfoKit());
tool.add(new DataCleanKit());
if (IS_HOOK) {
tool.add(new WeakNetworkKit());
}
tool.add(new WeakNetworkKit());
tool.add(new DbDebugKit());
//添加性能监控kit
performance.add(new FrameInfoKit());
performance.add(new CpuKit());
performance.add(new RamKit());
if (IS_HOOK) {
performance.add(new NetworkKit());
}
performance.add(new NetworkKit());
performance.add(new BlockMonitorKit());
performance.add(new TimeCounterKit());
performance.add(new MethodCostKit());
performance.add(new UIPerformanceKit());
if (IS_HOOK) {
performance.add(new LargePictureKit());
}
performance.add(new LargePictureKit());
try {
//动态添加leakcanary
......@@ -227,11 +223,9 @@ class DoraemonKitReal {
ui.add(new AlignRulerKit());
ui.add(new ViewCheckerKit());
ui.add(new LayoutBorderKit());
if (IS_HOOK && !TextUtils.isEmpty(DokitConstant.PRODUCT_ID)) {
//新增数据mock工具 由于Dokit管理平台还没完善 所以暂时关闭入口
platform.add(new MockKit());
platform.add(new HealthKit());
}
//新增数据mock工具 由于Dokit管理平台还没完善 所以暂时关闭入口
platform.add(new MockKit());
platform.add(new HealthKit());
//增加浮标模式
floatMode.add(new FloatModeKit());
......@@ -301,9 +295,9 @@ class DoraemonKitReal {
/**
* 单个文件的阈值为1M
*/
// private static long FILE_LENGTH_THRESHOLD = 1 * 1024 * 1024;
private static long FILE_LENGTH_THRESHOLD = 1 * 1024 * 1024;
//todo 测试时为1k 对外时需要修改回来
private static long FILE_LENGTH_THRESHOLD = 1024;
//private static long FILE_LENGTH_THRESHOLD = 1024;
private static void traverseFile(File rootFileDir) {
if (rootFileDir == null) {
......
......@@ -26,6 +26,11 @@ import java.util.Map;
* ================================================
*/
public class DokitConstant {
public static boolean IS_HOOK = false;
/**
* 产品id
*/
public static String PRODUCT_ID = "";
/**
......
......@@ -24,36 +24,32 @@ import java.util.Locale;
*/
public class BlockInfo {
public static final String SEPARATOR = "\r\n";
public static final String KV = " = ";
public static final SimpleDateFormat TIME_FORMATTER =
private static final String KV = " = ";
private static final SimpleDateFormat TIME_FORMATTER =
new SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.CHINESE);
public static final String NEW_INSTANCE_METHOD = "newInstance: ";
public static final String KEY_TIME_COST = "time";
public static final String KEY_THREAD_TIME_COST = "thread-time";
public static final String KEY_TIME_COST_START = "time-start";
public static final String KEY_TIME_COST_END = "time-end";
public static final String KEY_STACK = "stack";
private static final String KEY_TIME_COST = "time";
private static final String KEY_THREAD_TIME_COST = "thread-time";
private static final String KEY_TIME_COST_START = "time-start";
private static final String KEY_TIME_COST_END = "time-end";
private static final String KEY_STACK = "stack";
// Per Block Info fields
public long timeCost;
public long threadTimeCost;
private long threadTimeCost;
public long time;
public String timeStart;
public String timeEnd;
private String timeEnd;
public ArrayList<String> threadStackEntries = new ArrayList<>();
private StringBuilder timeSb = new StringBuilder();
private StringBuilder stackSb = new StringBuilder();
public String concernStackString;
public BlockInfo() {
}
public static BlockInfo newInstance() {
BlockInfo blockInfo = new BlockInfo();
return blockInfo;
......
......@@ -113,7 +113,7 @@ public class BlockMonitorManager {
String activityName = ActivityUtils.getTopActivity().getClass().getCanonicalName();
AppHealthInfo.DataBean.BlockBean blockBean = new AppHealthInfo.DataBean.BlockBean();
blockBean.setPage(activityName);
blockBean.setBlockTime("" + TimeUtils.getNowMills());
blockBean.setBlockTime(blockInfo.timeCost);
blockBean.setDetail(blockInfo.toString());
AppHealthInfoUtil.getInstance().addBlockInfo(blockBean);
} catch (Exception e) {
......
......@@ -57,7 +57,7 @@ public class AppHealthInfoUtil {
baseInfoBean.setCaseName(caseName);
baseInfoBean.setAppName(AppUtils.getAppName());
baseInfoBean.setAppVersion(AppUtils.getAppVersionName());
baseInfoBean.setDokitVersion(BuildConfig.VERSION_NAME);
baseInfoBean.setDokitVersion(BuildConfig.DOKIT_VERSION);
baseInfoBean.setPlatform("Android");
baseInfoBean.setPhoneMode(DeviceUtils.getModel());
baseInfoBean.setTime(TimeUtils.getNowString());
......@@ -72,7 +72,7 @@ public class AppHealthInfoUtil {
* @param costTime
* @param costDetail
*/
public void setAppStartInfo(String costTime, String costDetail, List<AppHealthInfo.DataBean.AppStartBean.LoadFuncBean> loadFunc) {
public void setAppStartInfo(long costTime, String costDetail, List<AppHealthInfo.DataBean.AppStartBean.LoadFuncBean> loadFunc) {
AppHealthInfo.DataBean.AppStartBean appStartBean = new AppHealthInfo.DataBean.AppStartBean();
appStartBean.setCostTime(costTime);
appStartBean.setCostDetail(costDetail);
......
......@@ -125,7 +125,7 @@ public class HealthFragmentChild0 extends BaseFragment {
} else {
new AlertDialog.Builder(getActivity())
.setTitle("健康体检")
.setMessage("确认是否开始执行健康体检?")
.setMessage("是否确认开始执行健康体检?")
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
......
package com.didichuxing.doraemonkit.kit.health;
import android.content.Context;
import android.text.TextUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import com.didichuxing.doraemonkit.constant.FragmentIndex;
import com.didichuxing.doraemonkit.kit.AbstractKit;
import com.didichuxing.doraemonkit.kit.Category;
......@@ -32,6 +35,15 @@ public class HealthKit extends AbstractKit {
@Override
public void onClick(Context context) {
if (!DokitConstant.IS_HOOK) {
ToastUtils.showShort("需要引入doraemonkit-plugin插件以后才能使用该功能");
return;
}
if (TextUtils.isEmpty(DokitConstant.PRODUCT_ID)) {
ToastUtils.showShort("需要到www.dokit.cn上注册pId才能使用该功能");
return;
}
startUniversalActivity(context, FragmentIndex.FRAGMENT_HEALTH);
}
......
......@@ -265,15 +265,15 @@ public class AppHealthInfo {
* loadFunc : [{"className":"ClassA","costTime":"15"},{"className":"ClassB","costTime":"30"}]
*/
private String costTime;
private long costTime;
private String costDetail;
private List<LoadFuncBean> loadFunc;
public String getCostTime() {
public long getCostTime() {
return costTime;
}
public void setCostTime(String costTime) {
public void setCostTime(long costTime) {
this.costTime = costTime;
}
......@@ -493,7 +493,7 @@ public class AppHealthInfo {
*/
private String page;
private String blockTime;
private long blockTime;
private String detail;
public String getPage() {
......@@ -504,11 +504,11 @@ public class AppHealthInfo {
this.page = page;
}
public String getBlockTime() {
public long getBlockTime() {
return blockTime;
}
public void setBlockTime(String blockTime) {
public void setBlockTime(long blockTime) {
this.blockTime = blockTime;
}
......
......@@ -2,7 +2,9 @@ package com.didichuxing.doraemonkit.kit.largepicture;
import android.content.Context;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import com.didichuxing.doraemonkit.constant.FragmentIndex;
import com.didichuxing.doraemonkit.kit.AbstractKit;
import com.didichuxing.doraemonkit.kit.Category;
......@@ -34,6 +36,10 @@ public class LargePictureKit extends AbstractKit {
@Override
public void onClick(Context context) {
if (!DokitConstant.IS_HOOK) {
ToastUtils.showShort("需要引入doraemonkit-plugin插件以后才能使用该功能");
return;
}
startUniversalActivity(context,FragmentIndex.FRAGMENT_LARGE_PICTURE);
}
......
......@@ -4,7 +4,7 @@ package com.didichuxing.doraemonkit.kit.methodtrace;
/**
* Created by hasee on 2017/4/20.
*/
public class AppHealthMethodCostBean {
public class AppHealthMethodCostBean {
private String functionName;
private String costTime = "0";
private String threadId;
......
......@@ -11,7 +11,10 @@ public class OrderBean implements Comparable<OrderBean> {
private String functionName;
private boolean isXit;
private String content;
private String costTime = "0";
/**
* 单位为微秒 us
*/
private long costTime = 0;
private String entTime;
private String threadId;
private String threadName;
......@@ -58,11 +61,11 @@ public class OrderBean implements Comparable<OrderBean> {
this.content = content;
}
public String getCostTime() {
public long getCostTime() {
return costTime;
}
public void setCostTime(String costTime) {
public void setCostTime(long costTime) {
this.costTime = costTime;
}
......@@ -144,7 +147,6 @@ public class OrderBean implements Comparable<OrderBean> {
@Override
public int compareTo(OrderBean o) {
// TODO Auto-generated method stub
//return 0;
return (int) (order - o.order);
}
......
......@@ -18,6 +18,7 @@ import java.util.Stack;
/**
* 文件扫描
* wiki:https://github.com/zjw-swun/AppMethodOrder
*/
class TraceScanner {
private static final String TAG = "TraceScanner";
......@@ -111,7 +112,7 @@ class TraceScanner {
OrderBean peek = stackMap.get(orderBean.getThreadId()).peek();
if (peek.getFunctionName().equals(orderBean.getFunctionName())) {
OrderBean pop = stackMap.get(orderBean.getThreadId()).pop();
String costTime = "" + Math.abs(Long.parseLong(orderBean.getTime()) - Long.parseLong(pop.getTime()));
long costTime = Math.abs(Long.parseLong(orderBean.getTime()) - Long.parseLong(pop.getTime()));
pop.setCostTime(costTime);
}
}
......
package com.didichuxing.doraemonkit.kit.network;
import android.content.Context;
import android.text.TextUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import com.didichuxing.doraemonkit.constant.FragmentIndex;
import com.didichuxing.doraemonkit.kit.AbstractKit;
import com.didichuxing.doraemonkit.kit.Category;
......@@ -32,7 +35,16 @@ public class MockKit extends AbstractKit {
@Override
public void onClick(Context context) {
startUniversalActivity(context,FragmentIndex.FRAGMENT_NETWORK_MOCK);
if (!DokitConstant.IS_HOOK) {
ToastUtils.showShort("需要引入doraemonkit-plugin插件以后才能使用该功能");
return;
}
if (TextUtils.isEmpty(DokitConstant.PRODUCT_ID)) {
ToastUtils.showShort("需要到www.dokit.cn上注册pId才能使用该功能");
return;
}
startUniversalActivity(context, FragmentIndex.FRAGMENT_NETWORK_MOCK);
}
@Override
......
......@@ -2,7 +2,9 @@ package com.didichuxing.doraemonkit.kit.network;
import android.content.Context;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import com.didichuxing.doraemonkit.constant.FragmentIndex;
import com.didichuxing.doraemonkit.kit.AbstractKit;
import com.didichuxing.doraemonkit.kit.Category;
......@@ -31,6 +33,10 @@ public class NetworkKit extends AbstractKit {
@Override
public void onClick(Context context) {
if (!DokitConstant.IS_HOOK) {
ToastUtils.showShort("需要引入doraemonkit-plugin插件以后才能使用该功能");
return;
}
startUniversalActivity(context,FragmentIndex.FRAGMENT_NETWORK_MONITOR);
}
......
......@@ -64,7 +64,6 @@ public class HttpUrlConnectionProxy extends HttpURLConnection {
@Override
public void disconnect() {
// TODO Auto-generated method stub
if (DEBUG) {
Log.d(TAG, "disconnect. ");
}
......
......@@ -79,7 +79,6 @@ public class HttpsUrlConnectionProxy extends HttpsURLConnection {
@Override
public void disconnect() {
// TODO Auto-generated method stub
if (DEBUG) {
Log.d(TAG, "disconnect. ");
}
......
......@@ -4,6 +4,7 @@ import android.app.Application;
import android.os.Looper;
import android.util.Log;
import com.blankj.utilcode.util.ConvertUtils;
import com.blankj.utilcode.util.GsonUtils;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import com.didichuxing.doraemonkit.kit.health.AppHealthInfoUtil;
......@@ -17,7 +18,10 @@ import com.didichuxing.doraemonkit.kit.timecounter.counter.ActivityCounter;
import com.didichuxing.doraemonkit.kit.timecounter.counter.AppCounter;
import com.didichuxing.doraemonkit.ui.base.DokitIntent;
import com.didichuxing.doraemonkit.ui.base.DokitViewManager;
import com.didichuxing.doraemonkit.util.FormatUtil;
import com.didichuxing.doraemonkit.util.LogHelper;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
......@@ -26,8 +30,10 @@ import java.util.List;
* @desc: App启动、Activity跳转的耗时统计类
*/
public class TimeCounterManager {
//private static final String TAG = "TimeCounterManager";
private boolean mIsRunning;
private static class Holder {
private static TimeCounterManager INSTANCE = new TimeCounterManager();
}
......@@ -45,7 +51,6 @@ public class TimeCounterManager {
* @param application
*/
public void onAppCreateStart(Application application) {
// Log.i("APP_STAR","=====onAppCreateStart======");
mAppCounter.start();
MethodCost.APPLICATION = application;
MethodCost.startMethodTracing("appStart");
......@@ -57,42 +62,38 @@ public class TimeCounterManager {
* @param application
*/
public void onAppCreateEnd(Application application) {
// Log.i("APP_STAR","=====onAppCreateEnd======");
mAppCounter.end();
MethodCost.stopMethodTracingAndPrintLog("appStart", new MethodCostCallback() {
@Override
public void onCall(ArrayList<OrderBean> orderBeans) {
try {
CounterInfo counterInfo = getAppSetupInfo();
// List<AppHealthInfo.DataBean.AppStartBean.LoadFuncBean> loads = new ArrayList<>();
List<AppHealthMethodCostBean> appHealthMethodCostBeans = new ArrayList<>();
for (OrderBean orderBean : orderBeans) {
long costTime = Long.parseLong(orderBean.getCostTime());
long costTime = orderBean.getCostTime();
//过滤掉小于l ms的
if (costTime < 1000) {
continue;
}
//详细信息调用函数
AppHealthMethodCostBean appHealthMethodCostBean = new AppHealthMethodCostBean();
appHealthMethodCostBean.setCostTime(orderBean.getCostTime());
appHealthMethodCostBean.setCostTime(String.format("%.2f", orderBean.getCostTime() / 1000.00f) + "ms");
appHealthMethodCostBean.setFunctionName(orderBean.getFunctionName());
appHealthMethodCostBean.setThreadId(orderBean.getThreadId());
appHealthMethodCostBean.setThreadName(orderBean.getThreadName());
appHealthMethodCostBeans.add(appHealthMethodCostBean);
// AppHealthInfo.DataBean.AppStartBean.LoadFuncBean loadFuncBean = new AppHealthInfo.DataBean.AppStartBean.LoadFuncBean();
// loadFuncBean.setClassName(orderBean.getFunctionName());
// loadFuncBean.setCostTime(orderBean.getCostTime());
// loads.add(loadFuncBean);
}
if (appHealthMethodCostBeans.isEmpty()) {
AppHealthMethodCostBean appHealthMethodCostBean = new AppHealthMethodCostBean();
appHealthMethodCostBean.setCostTime("-1");
appHealthMethodCostBean.setFunctionName("has no method costTime greater than 1000");
appHealthMethodCostBean.setFunctionName("has no method costTime greater than 1000 ms");
appHealthMethodCostBean.setThreadId("-1");
appHealthMethodCostBean.setThreadName("-1");
appHealthMethodCostBeans.add(appHealthMethodCostBean);
}
AppHealthInfoUtil.getInstance().setAppStartInfo("" + counterInfo.totalCost, GsonUtils.toJson(appHealthMethodCostBeans), new ArrayList<AppHealthInfo.DataBean.AppStartBean.LoadFuncBean>());
AppHealthInfoUtil.getInstance().setAppStartInfo(counterInfo.totalCost, GsonUtils.toJson(appHealthMethodCostBeans), new ArrayList<AppHealthInfo.DataBean.AppStartBean.LoadFuncBean>());
} catch (Exception e) {
e.printStackTrace();
}
......
......@@ -13,6 +13,9 @@ public class CounterInfo {
public long time;
public int type;
public String title;
/**
* 单位为ms
*/
public long totalCost;
public long pauseCost;
public long launchCost;
......
......@@ -2,14 +2,16 @@ package com.didichuxing.doraemonkit.kit.weaknetwork;
import android.content.Context;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import com.didichuxing.doraemonkit.constant.FragmentIndex;
import com.didichuxing.doraemonkit.kit.AbstractKit;
import com.didichuxing.doraemonkit.kit.Category;
/**
* 模拟弱网
*
* <p>
* Created by xiandanin on 2019/5/7 19:05
*/
public class WeakNetworkKit extends AbstractKit {
......@@ -30,7 +32,11 @@ public class WeakNetworkKit extends AbstractKit {
@Override
public void onClick(Context context) {
startUniversalActivity(context,FragmentIndex.FRAGMENT_WEAK_NETWORK);
if (!DokitConstant.IS_HOOK) {
ToastUtils.showShort("需要引入doraemonkit-plugin插件以后才能使用该功能");
return;
}
startUniversalActivity(context, FragmentIndex.FRAGMENT_WEAK_NETWORK);
}
@Override
......
......@@ -151,9 +151,7 @@ public class TableMeasurer<T> {
int width = column.getDrawFormat().measureWidth(column, position);
measureRowHeight(lineHeightArray, column, currentPosition, position);
currentPosition += 1;
/**
*Todo 为了解决合并单元宽度过大问题
*/
//为了解决合并单元宽度过大问题
if (rangeCells != null) {
Cell cell = rangeCells[position][columnPos];
if (cell != null) {
......
......@@ -97,7 +97,6 @@ public class CaptureActivity extends Activity implements Callback {
inactivityTimer.onActivity();
playBeepSoundAndVibrate();
String resultString = result.getText();
//FIXME
if (TextUtils.isEmpty(resultString)) {
Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show();
} else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册