Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DiDi
DoraemonKit
提交
b2b04ff9
D
DoraemonKit
项目概览
DiDi
/
DoraemonKit
11 个月 前同步成功
通知
166
Star
19623
Fork
3062
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
DoraemonKit
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b2b04ff9
编写于
4月 29, 2020
作者:
J
jackjintai
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
android: 新增插件配置
上级
eb6042ef
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
215 addition
and
14 deletion
+215
-14
Android/app/build.gradle
Android/app/build.gradle
+1
-1
Android/config.gradle
Android/config.gradle
+1
-1
Android/doraemonkit-plugin/src/main/groovy/com/didichuxing/doraemonkit/plugin/DoKitPlugin.java
...roovy/com/didichuxing/doraemonkit/plugin/DoKitPlugin.java
+3
-4
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil.java
...chuxing/doraemonkit/aop/method_stack/MethodStackUtil.java
+9
-7
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/constant/FragmentIndex.java
...a/com/didichuxing/doraemonkit/constant/FragmentIndex.java
+5
-0
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/core/UniversalActivity.java
...m/didichuxing/doraemonkit/kit/core/UniversalActivity.java
+5
-0
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/timecounter/AppStartInfoFragment.java
...ing/doraemonkit/kit/timecounter/AppStartInfoFragment.java
+146
-0
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/timecounter/TimeCounterListAdapter.java
...g/doraemonkit/kit/timecounter/TimeCounterListAdapter.java
+12
-1
Android/doraemonkit/src/main/res/layout/dk_fragment_app_start_info.xml
...monkit/src/main/res/layout/dk_fragment_app_start_info.xml
+31
-0
Android/doraemonkit/src/main/res/values/strings.xml
Android/doraemonkit/src/main/res/values/strings.xml
+2
-0
未找到文件。
Android/app/build.gradle
浏览文件 @
b2b04ff9
...
...
@@ -81,7 +81,7 @@ dokitExt {
slowMethod
{
//0:默认模式 打印函数调用栈 需添加指定入口 默认为application onCreate 和attachBaseContext
//1:普通模式 运行时打印某个函数的耗时 全局业务代码函数插入
strategy
1
strategy
0
//函数功能开关
methodSwitch
true
...
...
Android/config.gradle
浏览文件 @
b2b04ff9
...
...
@@ -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
"]}"
,
...
...
Android/doraemonkit-plugin/src/main/groovy/com/didichuxing/doraemonkit/plugin/DoKitPlugin.java
浏览文件 @
b2b04ff9
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
);
...
...
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/aop/method_stack/MethodStackUtil.java
浏览文件 @
b2b04ff9
...
...
@@ -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
();
}
...
...
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/constant/FragmentIndex.java
浏览文件 @
b2b04ff9
...
...
@@ -53,4 +53,9 @@ public interface FragmentIndex {
* 健康体检
*/
int
FRAGMENT_HEALTH
=
27
;
/**
* APP启动耗时
*/
int
FRAGMENT_APP_START
=
28
;
}
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/core/UniversalActivity.java
浏览文件 @
b2b04ff9
...
...
@@ -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
;
}
...
...
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/timecounter/AppStartInfoFragment.java
0 → 100644
浏览文件 @
b2b04ff9
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
Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/timecounter/TimeCounterListAdapter.java
浏览文件 @
b2b04ff9
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
;
...
...
Android/doraemonkit/src/main/res/layout/dk_fragment_app_start_info.xml
0 → 100644
浏览文件 @
b2b04ff9
<?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
Android/doraemonkit/src/main/res/values/strings.xml
浏览文件 @
b2b04ff9
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录