提交 b2b04ff9 编写于 作者: J jackjintai

android: 新增插件配置

上级 eb6042ef
......@@ -81,7 +81,7 @@ dokitExt {
slowMethod {
//0:默认模式 打印函数调用栈 需添加指定入口 默认为application onCreate 和attachBaseContext
//1:普通模式 运行时打印某个函数的耗时 全局业务代码函数插入
strategy 1
strategy 0
//函数功能开关
methodSwitch true
......
......@@ -51,7 +51,7 @@ ext {
//将urlconnection代理到okhttp
//"okhttp_urlconnection" : "com.squareup.okhttp3:okhttp-urlconnection:3.12.1",
//"okio" : "com.squareup.okio:okio:1.15.0",
"utilcode" : 'com.blankj:utilcodex:1.28.0',
"utilcode" : 'com.blankj:utilcodex:1.28.3',
"glide" : "com.github.bumptech.glide:glide:${android["glide_version"]}",
"glide_v3" : 'com.github.bumptech.glide:glide:3.8.0',
"glide_okhttp3" : "com.github.bumptech.glide:okhttp3-integration:${android["glide_version"]}",
......
package com.didichuxing.doraemonkit.plugin;
import com.android.build.gradle.AppExtension;
import com.didichuxing.doraemonkit.plugin.extension.CommExt;
import com.didichuxing.doraemonkit.plugin.extension.DoKitExt;
import com.didichuxing.doraemonkit.plugin.extension.SlowMethodExt;
import com.didichuxing.doraemonkit.plugin.transform.DokitBigImageTransform;
import com.didichuxing.doraemonkit.plugin.transform.DokitCommTransform;
import com.didichuxing.doraemonkit.plugin.transform.DokitMethodStack0Transform;
......@@ -16,7 +14,6 @@ import com.didichuxing.doraemonkit.plugin.transform.DokitUrlConnectionTransform;
import com.didiglobal.booster.gradle.BaseVariantKt;
import com.didiglobal.booster.gradle.VariantScopeKt;
import org.gradle.api.NamedDomainObjectContainer;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
......@@ -54,6 +51,8 @@ public final class DoKitPlugin implements Plugin<Project> {
}
}
isDebug = true;
//解析注册表文件
appExtension.getApplicationVariants().all(applicationVariant -> {
if (applicationVariant.getName().contains("debug")) {
......@@ -80,7 +79,7 @@ public final class DoKitPlugin implements Plugin<Project> {
//项目评估之后回调
project.afterEvaluate(partProject -> {
try {
if(isDebug){
if (isDebug) {
DoKitExt dokitExtension = partProject.getExtensions().getByType(DoKitExt.class);
System.out.println("DokitPluginExt==>" + dokitExtension.toString());
DoKitExtUtil.getInstance().init(dokitExtension, appExtension);
......
......@@ -26,11 +26,11 @@ public class MethodStackUtil {
/**
* key className&methodName
*/
private static ConcurrentHashMap<String, MethodInvokNode> ROOT_METHOD_STACKS = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String, MethodInvokNode> LEVEL1_METHOD_STACKS = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String, MethodInvokNode> LEVEL2_METHOD_STACKS = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String, MethodInvokNode> LEVEL3_METHOD_STACKS = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String, MethodInvokNode> LEVEL4_METHOD_STACKS = new ConcurrentHashMap<>();
private ConcurrentHashMap<String, MethodInvokNode> ROOT_METHOD_STACKS = new ConcurrentHashMap<>();
private ConcurrentHashMap<String, MethodInvokNode> LEVEL1_METHOD_STACKS = new ConcurrentHashMap<>();
private ConcurrentHashMap<String, MethodInvokNode> LEVEL2_METHOD_STACKS = new ConcurrentHashMap<>();
private ConcurrentHashMap<String, MethodInvokNode> LEVEL3_METHOD_STACKS = new ConcurrentHashMap<>();
private ConcurrentHashMap<String, MethodInvokNode> LEVEL4_METHOD_STACKS = new ConcurrentHashMap<>();
/**
......@@ -125,7 +125,6 @@ public class MethodStackUtil {
//打印函数调用栈
if (level == 0) {
if (methodInvokNode != null) {
toStack(classObj instanceof Application, methodInvokNode);
}
......@@ -138,8 +137,11 @@ public class MethodStackUtil {
TimeCounterManager.get().onAppAttachBaseContextEnd();
}
}
}
//移除对象
ROOT_METHOD_STACKS.remove(className + "&" + methodName);
}
} catch (Exception e) {
e.printStackTrace();
}
......
......@@ -53,4 +53,9 @@ public interface FragmentIndex {
* 健康体检
*/
int FRAGMENT_HEALTH = 27;
/**
* APP启动耗时
*/
int FRAGMENT_APP_START = 28;
}
......@@ -26,6 +26,7 @@ import com.didichuxing.doraemonkit.kit.parameter.cpu.CpuMainPageFragment;
import com.didichuxing.doraemonkit.kit.parameter.frameInfo.FrameInfoFragment;
import com.didichuxing.doraemonkit.kit.parameter.ram.RamMainPageFragment;
import com.didichuxing.doraemonkit.kit.sysinfo.SysInfoFragment;
import com.didichuxing.doraemonkit.kit.timecounter.AppStartInfoFragment;
import com.didichuxing.doraemonkit.kit.timecounter.TimeCounterFragment;
import com.didichuxing.doraemonkit.kit.weaknetwork.WeakNetworkFragment;
import com.didichuxing.doraemonkit.kit.webdoor.WebDoorDefaultFragment;
......@@ -135,6 +136,10 @@ public class UniversalActivity extends BaseActivity {
case FragmentIndex.FRAGMENT_HEALTH:
fragmentClass = HealthFragment.class;
break;
case FragmentIndex.FRAGMENT_APP_START:
fragmentClass = AppStartInfoFragment.class;
break;
default:
break;
}
......
package com.didichuxing.doraemonkit.kit.timecounter;
import android.os.Bundle;
import android.text.Html;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.PathUtils;
import com.blankj.utilcode.util.ThreadUtils;
import com.blankj.utilcode.util.TimeUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemonkit.DoraemonKit;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.aop.method_stack.MethodStackUtil;
import com.didichuxing.doraemonkit.kit.core.BaseFragment;
import com.didichuxing.doraemonkit.kit.core.SettingItem;
import com.didichuxing.doraemonkit.kit.core.SettingItemAdapter;
import com.didichuxing.doraemonkit.kit.loginfo.LogLine;
import com.didichuxing.doraemonkit.util.FileUtil;
import com.didichuxing.doraemonkit.widget.titlebar.HomeTitleBar;
import com.didichuxing.doraemonkit.widget.titlebar.TitleBar;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
/**
* @desc: Activity跳转耗时检测首页
*/
public class AppStartInfoFragment extends BaseFragment {
TextView mInfo;
@Override
protected int onRequestLayout() {
return R.layout.dk_fragment_app_start_info;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
}
private void initView() {
TitleBar titleBar = findViewById(R.id.title_bar);
titleBar.setOnTitleBarClickListener(new TitleBar.OnTitleBarClickListener() {
@Override
public void onLeftClick() {
finish();
}
@Override
public void onRightClick() {
export2File(mInfo.getText().toString());
}
});
mInfo = findViewById(R.id.app_start_info);
StringBuilder builder = new StringBuilder();
if (TextUtils.isEmpty(MethodStackUtil.STR_APP_ATTACH_BASECONTEXT)) {
builder.append("只有配置slowMethod的strategy=0模式下才能统计到启动函数调用栈");
} else {
builder.append(MethodStackUtil.STR_APP_ATTACH_BASECONTEXT);
builder.append("\n");
builder.append(MethodStackUtil.STR_APP_ON_CREATE);
}
mInfo.setText(builder.toString());
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 将启动信息保存到文件并分享
*/
private void export2File(final String info) {
if (TextUtils.isEmpty(info)) {
ToastUtils.showShort("启动信息为空");
return;
}
ToastUtils.showShort("启动信息保存中,请稍后...");
final String logPath = PathUtils.getInternalAppFilesPath() + File.separator + AppUtils.getAppName() + "_" + "app_launch.log";
final File logFile = new File(logPath);
ThreadUtils.executeByCpu(new ThreadUtils.Task<Boolean>() {
@Override
public Boolean doInBackground() throws Throwable {
try {
FileIOUtils.writeFileFromString(logFile, info, false);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
public void onSuccess(Boolean result) {
if (result) {
ToastUtils.showShort("启动信息文件保存在:" + logPath);
//分享
FileUtil.systemShare(DoraemonKit.APPLICATION, logFile);
}
}
@Override
public void onCancel() {
if (logFile.exists()) {
FileUtils.delete(logFile);
}
ToastUtils.showShort("启动信息保存失败");
}
@Override
public void onFail(Throwable t) {
if (logFile.exists()) {
FileUtils.delete(logFile);
}
ToastUtils.showShort("启动信息保存失败");
}
});
}
}
\ No newline at end of file
package com.didichuxing.doraemonkit.kit.timecounter;
import android.content.Context;
import android.content.Intent;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
......@@ -8,6 +9,9 @@ import android.view.ViewGroup;
import android.widget.TextView;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.constant.BundleKey;
import com.didichuxing.doraemonkit.constant.FragmentIndex;
import com.didichuxing.doraemonkit.kit.core.UniversalActivity;
import com.didichuxing.doraemonkit.kit.timecounter.bean.CounterInfo;
import com.didichuxing.doraemonkit.widget.recyclerview.AbsRecyclerAdapter;
import com.didichuxing.doraemonkit.widget.recyclerview.AbsViewBinder;
......@@ -16,7 +20,6 @@ import static android.text.format.DateUtils.FORMAT_SHOW_TIME;
public class TimeCounterListAdapter extends AbsRecyclerAdapter<AbsViewBinder<CounterInfo>, CounterInfo> {
public TimeCounterListAdapter(Context context) {
super(context);
}
......@@ -73,6 +76,13 @@ public class TimeCounterListAdapter extends AbsRecyclerAdapter<AbsViewBinder<Cou
public void onClick(View v) {
info.show = !info.show;
showDetail(info);
if (info.type == CounterInfo.TYPE_APP && mContext != null) {
//跳转启动耗时详情页
Intent intent = new Intent(mContext, UniversalActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(BundleKey.FRAGMENT_INDEX, FragmentIndex.FRAGMENT_APP_START);
mContext.startActivity(intent);
}
}
});
showDetail(info);
......@@ -89,6 +99,7 @@ public class TimeCounterListAdapter extends AbsRecyclerAdapter<AbsViewBinder<Cou
}
}
//显示详情
private void showDetail(CounterInfo info) {
if (info.type == CounterInfo.TYPE_APP) {
info.show = false;
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/dk_color_FFFFFF"
android:orientation="vertical">
<com.didichuxing.doraemonkit.widget.titlebar.TitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/dk_title_height"
app:dkLeftIcon="@drawable/dk_title_back"
app:dkLeftText="@string/dk_back"
app:dkRightText="@string/dk_export"
app:dkTitle="@string/dk_kit_block_time_app_start_info" />
<View style="@style/DK.Shadow.Bottom" />
<TextView
android:id="@+id/app_start_info"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dk_dp_16"
android:layout_marginRight="@dimen/dk_dp_16"
android:scrollbars="none"
android:textIsSelectable="true"
android:textSize="10dp" />
</LinearLayout>
\ No newline at end of file
......@@ -176,6 +176,7 @@
<string name="dk_view_check_info_fragment">可见Fragments:%1$s</string>
<string name="dk_back">返回</string>
<string name="dk_export">导出</string>
<string name="dk_net_monitor_title_summary">流量监控摘要</string>
<string name="dk_net_monitor_list">流量监控列表</string>
......@@ -241,6 +242,7 @@
<string name="dk_item_time_counter_switch">Activity跳转耗时</string>
<string name="dk_item_time_goto_list">查看记录</string>
<string name="dk_kit_block_time_counter_list">耗时列表</string>
<string name="dk_kit_block_time_app_start_info">启动详情</string>
<string name="dk_submit">提交</string>
<string name="dk_cancel">取消</string>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册