提交 8ccddf11 编写于 作者: J jackjintai

modify:

1、add dokit sdk v3.0.0
上级 67606422
......@@ -4,17 +4,17 @@ if (rootProject.ext.config["applyPlugin"]) {
// 这里引用正常库
dependencies {
//外部平台依赖
debugImplementation project(":doraemonkit")
debugImplementation project(":doraemonkit-leakcanary")
debugImplementation project(":doraemonkit-weex")
releaseImplementation project(":doraemonkit-no-op")
releaseImplementation project(":doraemonkit-weex-no-op")
// debugImplementation project(":doraemonkit")
// debugImplementation project(":doraemonkit-leakcanary")
// debugImplementation project(":doraemonkit-weex")
// releaseImplementation project(":doraemonkit-no-op")
// releaseImplementation project(":doraemonkit-weex-no-op")
//新版线上包
// debugImplementation "com.didichuxing.doraemonkit:doraemonkit:${rootProject.ext.android["jcenterArchivesVersionName"]}"
// debugImplementation "com.didichuxing.doraemonkit:doraemonkit-leakcanary:${rootProject.ext.android["jcenterArchivesVersionName"]}"
// releaseImplementation "com.didichuxing.doraemonkit:doraemonkit-no-op:${rootProject.ext.android["jcenterArchivesVersionName"]}"
// debugImplementation "com.didichuxing.doraemonkit:doraemonkit-weex:${rootProject.ext.android["jcenterArchivesVersionName"]}"
// releaseImplementation "com.didichuxing.doraemonkit:doraemonkit-weex-no-op:${rootProject.ext.android["jcenterArchivesVersionName"]}"
debugImplementation "com.didichuxing.doraemonkit:doraemonkit:${rootProject.ext.android["jcenterArchivesVersionName"]}"
debugImplementation "com.didichuxing.doraemonkit:doraemonkit-leakcanary:${rootProject.ext.android["jcenterArchivesVersionName"]}"
releaseImplementation "com.didichuxing.doraemonkit:doraemonkit-no-op:${rootProject.ext.android["jcenterArchivesVersionName"]}"
debugImplementation "com.didichuxing.doraemonkit:doraemonkit-weex:${rootProject.ext.android["jcenterArchivesVersionName"]}"
releaseImplementation "com.didichuxing.doraemonkit:doraemonkit-weex-no-op:${rootProject.ext.android["jcenterArchivesVersionName"]}"
}
} else {
......
......@@ -4,10 +4,10 @@ buildscript {
repositories {
google()
jcenter()
maven {
//本地插件地址
url uri(rootProject.ext.config["localRepoURL"])
}
// maven {
// //本地插件地址
// url uri(rootProject.ext.config["localRepoURL"])
// }
//北京maven库
maven { url 'http://artifactory.intra.xiaojukeji.com/artifactory/public/' }
maven { url 'https://www.jitpack.io' }
......@@ -16,8 +16,8 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
classpath 'com.novoda:bintray-release:0.9.2'
// classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.0_beta3'
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:1000.0.2'
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.0.0'
//classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:1000.0.2'
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
......@@ -28,10 +28,10 @@ allprojects {
repositories {
google()
jcenter()
maven {
//本地插件地址
url uri(rootProject.ext.config["localRepoURL"])
}
// maven {
// //本地插件地址
// url uri(rootProject.ext.config["localRepoURL"])
// }
//北京maven库
maven { url 'http://artifactory.intra.xiaojukeji.com/artifactory/public/' }
maven { url 'https://www.jitpack.io' }
......
......@@ -17,9 +17,9 @@ ext {
//app版本号
versionCode : 224,
//dokit 插件版本号
pluginVersionName : "3.0_beta3",
pluginVersionName : "3.0.0",
//jcenter dokit版本号 打包上传时 dokit的版本名字
jcenterArchivesVersionName: "3.0_beta3",
jcenterArchivesVersionName: "3.0.0",
//didi内部仓库版本号
didiArchivesVersionName : "1000.0.21",
versionName : "2.2.4",
......
......@@ -6,6 +6,7 @@ import com.didichuxing.doraemonkit.plugin.transform.DokitCommTransform;
import com.didichuxing.doraemonkit.plugin.transform.DokitSlowMethodTransform;
import com.didichuxing.doraemonkit.plugin.transform.DokitUrlConnectionTransform;
import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
......@@ -36,6 +37,15 @@ public final class DoKitPlugin implements Plugin<Project> {
}
}
project.afterEvaluate(new Action<Project>() {
//项目评估之后回调
@Override
public void execute(Project project1) {
DokitExtension dokitExtension = project1.getExtensions().getByType(DokitExtension.class);
DokitExtUtil.getInstance().init(dokitExtension, appExtension);
}
});
//普通的插装
appExtension.registerTransform(new DokitCommTransform(project), Collections.EMPTY_LIST);
......
......@@ -3,7 +3,6 @@ package com.didichuxing.doraemonkit.plugin;
import com.android.build.gradle.AppExtension;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
......@@ -15,82 +14,76 @@ import java.util.List;
* 修订历史:
* ================================================
*/
public class SlowMethodUtil {
private boolean showMethodSwitch = true;
private final List<String> packageNames = Collections.synchronizedList(new ArrayList<String>());
public class DokitExtUtil {
private String mApplicationId;
/**
* 单位为500ms
* dokit 插件开关 字段权限必须为public 否则无法进行赋值
*/
private int thresholdTime = 500;
private boolean mDokitPluginSwitch = true;
/**
* 慢函数开关
*/
private boolean mSlowMethodSwitch = true;
/**
* 单位为ms 默认500ms
*/
private int mThresholdTime = 500;
private List<String> mPackageNames = new ArrayList<>();
public boolean isShowMethodSwitch() {
return showMethodSwitch;
public boolean isDokitPluginSwitch() {
return mDokitPluginSwitch;
}
public List<String> getPackageNames() {
return packageNames;
public boolean isSlowMethodSwitch() {
return mSlowMethodSwitch;
}
public int getThresholdTime() {
return thresholdTime;
return mThresholdTime;
}
public List<String> getPackageNames() {
return mPackageNames;
}
/**
* 静态内部类单例
*/
private static class Holder {
private static SlowMethodUtil INSTANCE = new SlowMethodUtil();
private static DokitExtUtil INSTANCE = new DokitExtUtil();
}
public static SlowMethodUtil getInstance() {
public static DokitExtUtil getInstance() {
return Holder.INSTANCE;
}
public boolean needInit(DokitExtension dokitExtension) {
if (!dokitExtension.dokitPluginSwitch) {
showMethodSwitch = false;
return false;
}
if (!dokitExtension.slowMethodSwitch) {
showMethodSwitch = false;
return false;
}
if (dokitExtension.packageNames.isEmpty()) {
return true;
}
if (dokitExtension.packageNames.size() != packageNames.size() || dokitExtension.slowMethodSwitch != showMethodSwitch || dokitExtension.thresholdTime != thresholdTime) {
return true;
}
showMethodSwitch = false;
return false;
}
public void init(AppExtension appExtension, DokitExtension dokitExtension) {
List<String> innerPackageNames = new ArrayList<>();
//需要将applicationId中的 .替换为/ 因为字节码中会把.转化为/
String applicationId = appExtension.getDefaultConfig().getApplicationId().replaceAll("\\.", "/");
/**
* 初始化
*
* @param dokitExtension
* @param appExtension
*/
public void init(DokitExtension dokitExtension, AppExtension appExtension) {
if (dokitExtension != null) {
showMethodSwitch = dokitExtension.slowMethodSwitch;
innerPackageNames.addAll(dokitExtension.packageNames);
thresholdTime = dokitExtension.thresholdTime;
if (innerPackageNames.isEmpty() && !StringUtils.isEmpty(applicationId)) {
innerPackageNames.add(applicationId);
this.mDokitPluginSwitch = dokitExtension.dokitPluginSwitch;
this.mSlowMethodSwitch = dokitExtension.slowMethodSwitch;
this.mThresholdTime = dokitExtension.thresholdTime;
mPackageNames.clear();
for (String packageName : dokitExtension.packageNames) {
mPackageNames.add(packageName.replaceAll("\\.", "/"));
}
}
if (packageNames.size() == innerPackageNames.size()) {
return;
}
packageNames.clear();
for (String packageName : innerPackageNames) {
packageName = packageName.replaceAll("\\.", "/");
packageNames.add(packageName);
if (appExtension != null) {
String applicationId = appExtension.getDefaultConfig().getApplicationId().replaceAll("\\.", "/");
if (mPackageNames.isEmpty()) {
mPackageNames.add(applicationId);
}
}
}
public boolean ignorePackageNames(String className) {
boolean isMatched = false;
for (String packageName : ignorePackageNames) {
......
......@@ -6,14 +6,14 @@ import java.util.ArrayList;
import java.util.List;
/**
* Created by Quinn on 07/10/2018.
* Created by jint on 07/10/2018.
*/
public class DokitExtension {
public RunVariant runVariant = RunVariant.DEBUG;
public boolean duplcatedClassSafeMode = false;
/**
* dokit 插件开关
* dokit 插件开关 字段权限必须为public 否则无法进行赋值
*/
public boolean dokitPluginSwitch = true;
/**
......@@ -21,9 +21,10 @@ public class DokitExtension {
*/
public boolean slowMethodSwitch = true;
/**
* 单位为us 默认200us
* 单位为ms 默认500ms
*/
public int thresholdTime = 500;
public List<String> packageNames = new ArrayList<>();
......
package com.didichuxing.doraemonkit.plugin.bytecode;
import com.android.build.gradle.AppExtension;
import com.didichuxing.doraemonkit.plugin.DokitExtension;
import com.didichuxing.doraemonkit.plugin.StringUtils;
import com.didichuxing.doraemonkit.plugin.DokitExtUtil;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.FrescoMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.GlideMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.GlideV3MethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.ImageLoaderMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.PicassoMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.AmapLocationMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.ApplicationOnCreateMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.BaiduLocationMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.FlagMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.OkHttpMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.PlatformHttpMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.TencentLocationMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.TencentLocationSingleMethodAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
......@@ -35,16 +24,12 @@ public final class DokitBigImageClassAdapter extends ClassVisitor {
* 当前类的父类 假如存在的话
*/
private String superName;
private DokitExtension dokitExtension;
/**
* @param cv cv
* @param appExtension appExtension
* @param dokitExtension dokitExtension
*/
public DokitBigImageClassAdapter(final ClassVisitor cv, AppExtension appExtension, DokitExtension dokitExtension) {
public DokitBigImageClassAdapter(final ClassVisitor cv) {
super(Opcodes.ASM7, cv);
this.dokitExtension = dokitExtension;
}
@Override
......@@ -76,7 +61,7 @@ public final class DokitBigImageClassAdapter extends ClassVisitor {
//从传进来的ClassWriter中读取MethodVisitor
MethodVisitor mv = cv.visitMethod(access, methodName, desc, signature, exceptions);
//开关被关闭 不插入代码
if (!dokitExtension.dokitPluginSwitch) {
if (!DokitExtUtil.getInstance().isDokitPluginSwitch()) {
return mv;
}
//Glide v4字节码替换
......
package com.didichuxing.doraemonkit.plugin.bytecode;
import com.android.build.gradle.AppExtension;
import com.didichuxing.doraemonkit.plugin.DokitExtension;
import com.didichuxing.doraemonkit.plugin.StringUtils;
import com.didichuxing.doraemonkit.plugin.DokitExtUtil;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.AmapLocationMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.ApplicationOnCreateMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.BaiduLocationMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.FlagMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.OkHttpMethodAdapter;
......@@ -30,16 +27,12 @@ public final class DokitCommClassAdapter extends ClassVisitor {
* 当前类的父类 假如存在的话
*/
private String superName;
private DokitExtension dokitExtension;
/**
* @param cv cv
* @param appExtension appExtension
* @param dokitExtension dokitExtension
*/
public DokitCommClassAdapter(final ClassVisitor cv, AppExtension appExtension, DokitExtension dokitExtension) {
public DokitCommClassAdapter(final ClassVisitor cv) {
super(Opcodes.ASM7, cv);
this.dokitExtension = dokitExtension;
}
@Override
......@@ -73,7 +66,7 @@ public final class DokitCommClassAdapter extends ClassVisitor {
//从传进来的ClassWriter中读取MethodVisitor
MethodVisitor mv = cv.visitMethod(access, methodName, desc, signature, exceptions);
//开关被关闭 不插入代码
if (!dokitExtension.dokitPluginSwitch) {
if (!DokitExtUtil.getInstance().isDokitPluginSwitch()) {
return mv;
}
//开发者变量字节码替换
......
......@@ -2,8 +2,7 @@ package com.didichuxing.doraemonkit.plugin.bytecode;
import com.android.build.gradle.AppExtension;
import com.didichuxing.doraemonkit.plugin.DokitExtension;
import com.didichuxing.doraemonkit.plugin.SlowMethodUtil;
import com.didichuxing.doraemonkit.plugin.StringUtils;
import com.didichuxing.doraemonkit.plugin.DokitExtUtil;
import com.didichuxing.doraemonkit.plugin.bytecode.method.slow.SlowMethodAdapter;
import org.objectweb.asm.ClassVisitor;
......@@ -11,11 +10,6 @@ import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* Created by jint on 13/12/2019.
* 类访问器
......@@ -34,24 +28,11 @@ public final class DokitSlowMethodClassAdapter extends ClassVisitor {
private String className;
private boolean matchedMethod = false;
private AppExtension appExtension;
private DokitExtension dokitExtension;
/**
* 单位为500ms
* @param cv cv 传进来的是 ClassWriter
*/
private int thresholdTime = 500;
/**
* @param cv cv 传进来的是 ClassWriter
* @param appExtension appExtension
* @param dokitExtension dokitExtension
*/
public DokitSlowMethodClassAdapter(final ClassVisitor cv, AppExtension appExtension, DokitExtension dokitExtension) {
public DokitSlowMethodClassAdapter(final ClassVisitor cv) {
super(Opcodes.ASM7, cv);
this.appExtension = appExtension;
this.dokitExtension = dokitExtension;
}
/**
......@@ -78,36 +59,8 @@ public final class DokitSlowMethodClassAdapter extends ClassVisitor {
if (isInterface) {
return;
}
//插件开关被关闭
if (!dokitExtension.dokitPluginSwitch) {
return;
}
this.className = className;
try {
if (SlowMethodUtil.getInstance().needInit(dokitExtension)) {
SlowMethodUtil.getInstance().init(appExtension, dokitExtension);
}
if (SlowMethodUtil.getInstance().isShowMethodSwitch()) {
if (SlowMethodUtil.getInstance().ignorePackageNames(className)) {
matchedMethod = false;
return;
}
for (String packageName : SlowMethodUtil.getInstance().getPackageNames()) {
if (className.contains(packageName)) {
matchedMethod = true;
thresholdTime = SlowMethodUtil.getInstance().getThresholdTime();
System.out.println("DokitSlowMethod==className===>" + className + " thresholdTime==>" + SlowMethodUtil.getInstance().getThresholdTime());
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
......@@ -134,12 +87,37 @@ public final class DokitSlowMethodClassAdapter extends ClassVisitor {
//从传进来的ClassWriter中读取MethodVisitor
MethodVisitor mv = cv.visitMethod(access, methodName, desc, signature, exceptions);
try {
if (matchedMethod && !("<init>").equals(methodName)) {
return mv == null ? null : new SlowMethodAdapter(mv, className, thresholdTime, access, methodName, desc);
//插件开关被关闭
if (!DokitExtUtil.getInstance().isDokitPluginSwitch()) {
return mv;
}
if (!DokitExtUtil.getInstance().isSlowMethodSwitch()) {
return mv;
}
if (DokitExtUtil.getInstance().ignorePackageNames(className)) {
return mv;
}
if (("<init>").equals(methodName)) {
return mv;
}
boolean matchedMethod = false;
for (String packageName : DokitExtUtil.getInstance().getPackageNames()) {
if (className.contains(packageName)) {
matchedMethod = true;
break;
}
}
if (matchedMethod) {
System.out.println("DokitSlowMethod==className===>" + className + " methodName===>" + methodName + " thresholdTime==>" + DokitExtUtil.getInstance().getThresholdTime());
return mv == null ? null : new SlowMethodAdapter(mv, className, DokitExtUtil.getInstance().getThresholdTime(), access, methodName, desc);
}
} catch (Exception e) {
// e.printStackTrace();
}
return mv;
......
package com.didichuxing.doraemonkit.plugin.bytecode;
import com.android.build.gradle.AppExtension;
import com.didichuxing.doraemonkit.plugin.DokitExtUtil;
import com.didichuxing.doraemonkit.plugin.DokitExtension;
import com.didichuxing.doraemonkit.plugin.StringUtils;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.AmapLocationMethodAdapter;
......@@ -24,21 +25,16 @@ import org.objectweb.asm.Type;
*/
public final class DokitUrlConnectionClassAdapter extends ClassVisitor {
private DokitExtension dokitExtension;
/**
* 当前类型
*/
private String className;
/**
*
* @param cv cv 传进来的是 ClassWriter
* @param appExtension appExtension
* @param dokitExtension dokitExtension
*/
public DokitUrlConnectionClassAdapter(final ClassVisitor cv, AppExtension appExtension, DokitExtension dokitExtension) {
public DokitUrlConnectionClassAdapter(final ClassVisitor cv) {
super(Opcodes.ASM7, cv);
this.dokitExtension = dokitExtension;
}
......@@ -70,11 +66,11 @@ public final class DokitUrlConnectionClassAdapter extends ClassVisitor {
//从传进来的ClassWriter中读取MethodVisitor
MethodVisitor mv = cv.visitMethod(access, methodName, desc, signature, exceptions);
//开关被关闭 不插入代码
if (!dokitExtension.dokitPluginSwitch) {
if (!DokitExtUtil.getInstance().isDokitPluginSwitch()) {
return mv;
}
//过滤所有类中当前方法中所有的字节码
return mv == null ? null : new UrlConnectionMethodAdapter(className,methodName,access, desc, mv);
return mv == null ? null : new UrlConnectionMethodAdapter(className, methodName, access, desc, mv);
}
......
......@@ -38,6 +38,6 @@ public class DokitBigImageWeaver extends BaseWeaver {
@Override
protected ClassVisitor wrapClassWriter(ClassWriter classWriter) {
//返回指定的ClassVisitor
return new DokitBigImageClassAdapter(classWriter, appExtension, dokitExtension);
return new DokitBigImageClassAdapter(classWriter);
}
}
......@@ -37,6 +37,6 @@ public class DokitCommWeaver extends BaseWeaver {
@Override
protected ClassVisitor wrapClassWriter(ClassWriter classWriter) {
//返回指定的ClassVisitor
return new DokitCommClassAdapter(classWriter, appExtension, dokitExtension);
return new DokitCommClassAdapter(classWriter);
}
}
......@@ -37,6 +37,6 @@ public class DokitSlowMethodWeaver extends BaseWeaver {
@Override
protected ClassVisitor wrapClassWriter(ClassWriter classWriter) {
//返回指定的ClassVisitor
return new DokitSlowMethodClassAdapter(classWriter, appExtension, dokitExtension);
return new DokitSlowMethodClassAdapter(classWriter);
}
}
......@@ -38,6 +38,6 @@ public class DokitUrlConnectionWeaver extends BaseWeaver {
@Override
protected ClassVisitor wrapClassWriter(ClassWriter classWriter) {
//返回指定的ClassVisitor
return new DokitUrlConnectionClassAdapter(classWriter, appExtension, dokitExtension);
return new DokitUrlConnectionClassAdapter(classWriter);
}
}
......@@ -47,6 +47,10 @@ public class MethodCostUtil {
if (methods[1].equals("onCreate")) {
TimeCounterManager.get().onAppCreateStart();
}
if (methods[1].equals("attachBaseContext")) {
TimeCounterManager.get().onAppAttachBaseContextStart();
}
}
}
} catch (Exception e) {
......@@ -90,6 +94,9 @@ public class MethodCostUtil {
if (methods[1].equals("onCreate")) {
TimeCounterManager.get().onAppCreateEnd();
}
if (methods[1].equals("attachBaseContext")) {
TimeCounterManager.get().onAppAttachBaseContextEnd();
}
}
//printApplicationStartTime(methodName);
} else if (classObj instanceof Activity) {
......
......@@ -2,11 +2,13 @@ package com.didichuxing.doraemonkit.datapick;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.DeviceUtils;
import com.blankj.utilcode.util.LanguageUtils;
import com.blankj.utilcode.util.TimeUtils;
import com.didichuxing.doraemonkit.BuildConfig;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import java.util.List;
import java.util.Locale;
/**
* ================================================
......@@ -38,6 +40,10 @@ public class DataPickBean {
*/
private String appId;
private String dokitVersion;
/**
* app 或者系统语言
*/
private String language;
private List<EventBean> events;
DataPickBean() {
......@@ -50,8 +56,10 @@ public class DataPickBean {
this.phoneMode = DeviceUtils.getModel();
this.time = "" + TimeUtils.getNowMills();
this.systemVersion = DeviceUtils.getSDKVersionName();
this.language = Locale.getDefault().getDisplayLanguage();
}
void setEvents(List<EventBean> events) {
this.events = events;
}
......@@ -87,5 +95,21 @@ public class DataPickBean {
}
}
@Override
public String toString() {
return "DataPickBean{" +
"platform='" + platform + '\'' +
", pId='" + pId + '\'' +
", time='" + time + '\'' +
", phoneMode='" + phoneMode + '\'' +
", systemVersion='" + systemVersion + '\'' +
", appName='" + appName + '\'' +
", appId='" + appId + '\'' +
", dokitVersion='" + dokitVersion + '\'' +
", language='" + language + '\'' +
", events=" + events +
'}';
}
}
......@@ -7,8 +7,7 @@ package com.didichuxing.doraemonkit.kit.methodtrace;
public class AppHealthMethodCostBean {
private String functionName;
private String costTime = "0";
private String threadId;
private String threadName;
public String getFunctionName() {
return functionName;
......@@ -26,29 +25,12 @@ public class AppHealthMethodCostBean {
this.costTime = costTime;
}
public String getThreadId() {
return threadId;
}
public void setThreadId(String threadId) {
this.threadId = threadId;
}
public String getThreadName() {
return threadName;
}
public void setThreadName(String threadName) {
this.threadName = threadName;
}
@Override
public String toString() {
return "AppHealthMethodCostBean{" +
"functionName='" + functionName + '\'' +
", costTime='" + costTime + '\'' +
", threadId='" + threadId + '\'' +
", threadName='" + threadName + '\'' +
'}';
}
}
......@@ -40,15 +40,28 @@ public class TimeCounterManager {
private AppCounter mAppCounter = new AppCounter();
private ActivityCounter mActivityCounter = new ActivityCounter();
/**
* App attachBaseContext
*/
public void onAppAttachBaseContextStart() {
mAppCounter.attachStart();
}
/**
* App attachBaseContext
*/
public void onAppAttachBaseContextEnd() {
mAppCounter.attachEnd();
}
/**
* App 启动
*/
public void onAppCreateStart() {
mAppCounter.start();
//MethodCost.APPLICATION = application;
//Log.i(TAG, "=========onAppCreateStart=========");
//MethodCost.startMethodTracing("appStart");
}
/**
......@@ -58,77 +71,20 @@ public class TimeCounterManager {
mAppCounter.end();
CounterInfo counterInfo = getAppSetupInfo();
List<AppHealthMethodCostBean> appHealthMethodCostBeans = new ArrayList<>();
AppHealthMethodCostBean appHealthMethodCostBean = new AppHealthMethodCostBean();
appHealthMethodCostBean.setCostTime("-1");
appHealthMethodCostBean.setFunctionName("no functionName");
appHealthMethodCostBean.setThreadId("-1");
appHealthMethodCostBean.setThreadName("-1");
appHealthMethodCostBeans.add(appHealthMethodCostBean);
AppHealthMethodCostBean onCreate = new AppHealthMethodCostBean();
onCreate.setCostTime(mAppCounter.getStartCountTime() + "ms");
onCreate.setFunctionName("Application onCreate");
appHealthMethodCostBeans.add(onCreate);
AppHealthMethodCostBean onAttach = new AppHealthMethodCostBean();
onAttach.setCostTime(mAppCounter.getAttachCountTime() + "ms");
onAttach.setFunctionName("Application attachBaseContext");
appHealthMethodCostBeans.add(onAttach);
AppHealthMethodCostBeanWrap appHealthMethodCostBeanWrap = new AppHealthMethodCostBeanWrap();
appHealthMethodCostBeanWrap.setTitle("no detail infos");
appHealthMethodCostBeanWrap.setTitle("App启动耗时");
appHealthMethodCostBeanWrap.setData(appHealthMethodCostBeans);
AppHealthInfoUtil.getInstance().setAppStartInfo(counterInfo.totalCost, GsonUtils.toJson(appHealthMethodCostBeanWrap), new ArrayList<AppHealthInfo.DataBean.AppStartBean.LoadFuncBean>());
//Log.i(TAG, "=========onAppCreateEnd=========");
// MethodCost.stopMethodTracingAndPrintLog("appStart", new MethodCostCallback() {
// @Override
// public void onCall(String filePath, ArrayList<OrderBean> orderBeans) {
// try {
// CounterInfo counterInfo = getAppSetupInfo();
// List<AppHealthMethodCostBean> appHealthMethodCostBeans = new ArrayList<>();
// for (OrderBean orderBean : orderBeans) {
// long costTime = orderBean.getCostTime();
// //过滤掉小于l ms的
// if (costTime < 1000) {
// continue;
// }
// //详细信息调用函数
// AppHealthMethodCostBean appHealthMethodCostBean = new AppHealthMethodCostBean();
// 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);
//
// }
//
// if (appHealthMethodCostBeans.isEmpty()) {
// AppHealthMethodCostBean appHealthMethodCostBean = new AppHealthMethodCostBean();
// appHealthMethodCostBean.setCostTime("-1");
// appHealthMethodCostBean.setFunctionName("has no method costTime greater than 1000 ms");
// appHealthMethodCostBean.setThreadId("-1");
// appHealthMethodCostBean.setThreadName("-1");
// appHealthMethodCostBeans.add(appHealthMethodCostBean);
// }
//
// AppHealthMethodCostBeanWrap appHealthMethodCostBeanWrap = new AppHealthMethodCostBeanWrap();
// appHealthMethodCostBeanWrap.setTrace(filePath);
// appHealthMethodCostBeanWrap.setData(appHealthMethodCostBeans);
//
// AppHealthInfoUtil.getInstance().setAppStartInfo(counterInfo.totalCost, GsonUtils.toJson(appHealthMethodCostBeanWrap), new ArrayList<AppHealthInfo.DataBean.AppStartBean.LoadFuncBean>());
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// }
//
// @Override
// public void onError(String message, String filePath) {
// CounterInfo counterInfo = getAppSetupInfo();
// List<AppHealthMethodCostBean> appHealthMethodCostBeans = new ArrayList<>();
// AppHealthMethodCostBean appHealthMethodCostBean = new AppHealthMethodCostBean();
// appHealthMethodCostBean.setCostTime("-1");
// appHealthMethodCostBean.setFunctionName("error===>" + message + " filePath===>" + filePath);
// appHealthMethodCostBean.setThreadId("-1");
// appHealthMethodCostBean.setThreadName("-1");
// appHealthMethodCostBeans.add(appHealthMethodCostBean);
// AppHealthMethodCostBeanWrap appHealthMethodCostBeanWrap = new AppHealthMethodCostBeanWrap();
// appHealthMethodCostBeanWrap.setTrace(filePath);
// appHealthMethodCostBeanWrap.setData(appHealthMethodCostBeans);
// AppHealthInfoUtil.getInstance().setAppStartInfo(counterInfo.totalCost, GsonUtils.toJson(appHealthMethodCostBeanWrap), new ArrayList<AppHealthInfo.DataBean.AppStartBean.LoadFuncBean>());
// }
// });
}
public void onActivityPause() {
......
......@@ -8,15 +8,43 @@ import com.didichuxing.doraemonkit.kit.timecounter.bean.CounterInfo;
public class AppCounter {
private long mStartTime;
private long mStartCountTime;
private long mAttachTime;
private long mAttachCountTime;
public long getStartCountTime() {
return mStartCountTime;
}
public long getAttachCountTime() {
return mAttachCountTime;
}
private CounterInfo mCounterInfo = new CounterInfo();
public void start() {
mStartTime = System.currentTimeMillis();
}
public void attachStart() {
mAttachTime = System.currentTimeMillis();
}
public void attachEnd() {
mAttachCountTime = System.currentTimeMillis() - mAttachTime;
}
public void end() {
mStartCountTime = System.currentTimeMillis() - mStartTime;
account();
}
public void account() {
mCounterInfo.title = "App Setup Cost";
mCounterInfo.totalCost = System.currentTimeMillis() - mStartTime;
mCounterInfo.totalCost = mAttachCountTime + mStartCountTime;
mCounterInfo.type = CounterInfo.TYPE_APP;
mCounterInfo.time = System.currentTimeMillis();
}
......
#Tue Feb 25 18:43:01 CST 2020
#Wed Mar 25 15:15:37 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
......
DoraemonKit-Android releases
===
## 3.0.0
1.优化dokit 慢函数代码插件性能
2.优化大图检测实现方式,不再需要手动注入代码(支持Glide4.0+、Fresco、Picasso、ImageLoader)
3.优化安卓端启动性能
4.其他功能优化
## 3.0_beta3
1.优化dokit插件
......
......@@ -5,8 +5,8 @@
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:3.0_beta3'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.0_beta3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:3.0.0'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.0.0'
}
```
......@@ -14,7 +14,7 @@ dependencies {
假如你无法通过 jcenter 下载到依赖库并报了以下的错误
```
ERROR: Failed to resolve: com.didichuxing.doraemonkit:doraemonkit:3.0_beta3
ERROR: Failed to resolve: com.didichuxing.doraemonkit:doraemonkit:3.0.0
```
建议你可以尝试挂载VPN或通过命令行重试(以Mac系统为例 项目根目录下)
......@@ -38,8 +38,8 @@ DoraemonKit目前已支持Weex工具,包括
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex:3.0_beta3'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex-no-op:3.0_beta3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex:3.0.0'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex-no-op:3.0.0'
}
```
......@@ -49,7 +49,7 @@ dependencies {
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-leakcanary:3.0_beta3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-leakcanary:3.0.0'
}
```
......@@ -91,7 +91,7 @@ AOP包括以下几个功能:
buildscript {
dependencies {
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.0_beta3'
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
......
......@@ -5,8 +5,8 @@
```
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:3.0_beta3'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.0_beta3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:3.0.0'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.0.0'
}
```
......@@ -45,7 +45,7 @@ Add a dependency in `build.gradle` in root of host project as following.
buildscript {
dependencies {
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.0_beta3'
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
......
# Release Notes
### 3.0.0
1、新增两款平台工具,"健康体检"和"数据Mock"
2.提升DoKit SDK稳定性以及性能优化
### 3.0_beta1
1、新增两款平台工具,“健康体检”和“数据Mock”
1、新增两款平台工具,"健康体检"和"数据Mock"
2、新增“应用设置”、“NSUserDefault”、“模拟弱网”、“UI层级检查”
“UI结构”、“启动耗时”等工具
2、新增"应用设置"、"NSUserDefault"、"模拟弱网"、"UI层级检查"
"UI结构"、"启动耗时"等工具
3、解决社区和用户反馈的一些问题,用户体验优化
......
......@@ -5,13 +5,13 @@
#### 1.1: cocoapods依赖
```
pod 'DoraemonKit/Core', '~> 2.0.0', :configurations => ['Debug'] //必选
pod 'DoraemonKit/WithLogger', '~> 2.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithGPS', '~> 2.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithLoad', '~> 2.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithWeex', '~> 2.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithDatabase', '~> 2.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithMLeaksFinder', '2.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/Core', '~> 3.0.0', :configurations => ['Debug'] //必选
pod 'DoraemonKit/WithLogger', '~> 3.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithGPS', '~> 3.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithLoad', '~> 3.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithWeex', '~> 3.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithDatabase', '~> 3.0.0', :configurations => ['Debug'] //可选
pod 'DoraemonKit/WithMLeaksFinder', '3.0.0', :configurations => ['Debug'] //可选
```
Core subspec作为核心,必须引入。
......@@ -47,9 +47,9 @@ Core subspec作为核心,必须引入。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#ifdef DEBUG
//默认
//默认
[[DoraemonManager shareInstance] install];
// 或者使用传入位置,解决遮挡关键区域,减少频繁移动
// 或者使用传入位置,解决遮挡关键区域,减少频繁移动
//[[DoraemonManager shareInstance] installWithStartingPosition:CGPointMake(66, 66)];
#endif
}
......@@ -60,7 +60,7 @@ Core subspec作为核心,必须引入。
### 三、添加自定义测试模块到Doraemon面板中(非必要)
比如我们要在Doraemon面板中添加一个环境切换的功能。
第一步:新建一个类,实现DoraemonPluginProtocol协议中的pluginDidLoad方法,该方法就是以后点击Doraemon工具面板中“环境切换”按钮触发的事件。
第一步:新建一个类,实现DoraemonPluginProtocol协议中的pluginDidLoad方法,该方法就是以后点击Doraemon工具面板中"环境切换"按钮触发的事件。
比如以代驾司机端为例,点击按钮之后会进入环境切换页面。
......@@ -74,7 +74,7 @@ Core subspec作为核心,必须引入。
```
第二步:在Doraemon初始化的地方添加第一步中添加的“环境切换”插件
第二步:在Doraemon初始化的地方添加第一步中添加的"环境切换"插件
调用DoraemonManager的以下方法:
......
......@@ -2,10 +2,10 @@
### 1: Use Cocoapods to Get latest version of DoraemonKit
```
pod 'DoraemonKit/Core', '~> 1.1.7', :configurations => ['Debug']
pod 'DoraemonKit/WithLogger', '~> 1.1.7', :configurations => ['Debug']
pod 'DoraemonKit/WithGPS', '~> 1.1.7', :configurations => ['Debug']
pod 'DoraemonKit/WithLoad', '~> 1.1.7', :configurations => ['Debug']
pod 'DoraemonKit/Core', '~> 3.0.0', :configurations => ['Debug']
pod 'DoraemonKit/WithLogger', '~> 3.0.0', :configurations => ['Debug']
pod 'DoraemonKit/WithGPS', '~> 3.0.0', :configurations => ['Debug']
pod 'DoraemonKit/WithLoad', '~> 3.0.0', :configurations => ['Debug']
```
### 2: Access method using DoraemonKit's built-in toolset
......@@ -16,7 +16,7 @@ Add code when the app starts.
#ifdef DEBUG
[[DoraemonManager shareInstance] install];
// or custom position
// [DoraemonManager shareInstance] installWithStartingPosition:CGPointMake(66, 66)];
// [DoraemonManager shareInstance] installWithStartingPosition:CGPointMake(66, 66)];
#endif
}
```
......
<div align="center">
<img src="https://javer.oss-cn-shanghai.aliyuncs.com/doraemon/github/DoraemonKit_github.png" width = "150" height = "150" alt="DoraemonKit" align=left />
<img src="https://img.shields.io/github/license/didi/DoraemonKit.svg" align=left />
<img src="https://img.shields.io/badge/Android-3.0_beta3-blue.svg" align=left />
<img src="https://img.shields.io/badge/iOS-3.0_beta1-yellow.svg" align=left />
<img src="https://img.shields.io/badge/Android-3.0.0-blue.svg" align=left />
<img src="https://img.shields.io/badge/iOS-3.0.0-yellow.svg" align=left />
<img src="https://img.shields.io/badge/miniapp-0.0.1-red.svg" align=left />
<img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" align=left />
</div>
......
<div align="center">
<img src="https://javer.oss-cn-shanghai.aliyuncs.com/doraemon/github/DoraemonKit_github.png" width = "150" height = "150" alt="DoraemonKit" align=left />
<img src="https://img.shields.io/github/license/didi/DoraemonKit.svg" align=left />
<img src="https://img.shields.io/badge/Android-3.0_beta3-blue.svg" align=left />
<img src="https://img.shields.io/badge/iOS-3.0_beta1-yellow.svg" align=left />
<img src="https://img.shields.io/badge/Android-3.0.0-blue.svg" align=left />
<img src="https://img.shields.io/badge/iOS-3.0.9-yellow.svg" align=left />
<img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" align=left />
</div>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册