Skip to content

Commit 84ba62a

Browse files
Prepare for release 1.0.1
1 parent 63e2be7 commit 84ba62a

File tree

9 files changed

+86
-134
lines changed

9 files changed

+86
-134
lines changed

README.md

Lines changed: 15 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
English | [中文](README_ZH.md)
44

5-
[![](https://www.jitpack.io/v/DylanCaiCoding/Tracker.svg)](https://www.jitpack.io/#DylanCaiCoding/Tracker)
5+
[![](https://www.jitpack.io/v/DylanCaiCoding/Tracker.svg)](https://www.jitpack.io/#DylanCaiCoding/Tracker)
66
[![](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](https://github.com/DylanCaiCoding/Tracker/blob/master/LICENSE)
77

88
Tracker is a lightweight tracking framework based on [the tracking idea of Buzzvideo](https://mp.weixin.qq.com/s/iMn--4FNugtH26G90N1MaQ).
@@ -11,13 +11,7 @@ Tracker is a lightweight tracking framework based on [the tracking idea of Buzzv
1111

1212
[Why use chain of responsibility tracking?](https://dylancaicoding.github.io/Tracker/#/zh/idea)
1313

14-
## Sample
15-
16-
This library has Kotlin and Java sample code for simulating Buzzvideo tracking requirements.
17-
18-
## Get started
19-
20-
### Gradle
14+
## Gradle
2115

2216
Add it in your root build.gradle at the end of repositories:
2317

@@ -34,31 +28,17 @@ Add dependencies:
3428

3529
```groovy
3630
dependencies {
37-
implementation 'com.github.DylanCaiCoding:Tracker:1.0.0'
31+
implementation 'com.github.DylanCaiCoding:Tracker:1.0.1'
3832
}
3933
```
4034

41-
### Usage
35+
## Usage
4236

43-
> See the documentation for [Java usage](https://dylancaicoding.github.io/Tracker/#/zh/usage).
44-
45-
#### Initialization
46-
47-
```kotlin
48-
initTracker(this, UMTrackHandler())
49-
```
37+
:pencil: **[>> Usage documentation <<](https://dylancaicoding.github.io/Tracker/#/zh/usage)**
5038

51-
```kotlin
52-
class UMTrackHandler : TrackHandler {
53-
override fun onEvent(context: Context, eventId: String, params: Map<String, String>) {
54-
MobclickAgent.onEvent(context, eventId, params) // Umeng sample
55-
}
56-
}
57-
```
58-
59-
#### Establish an in-page responsibility chain
39+
## Sample
6040

61-
Set the `trackNode` for the Activity/Fragment/View to add tracking parameters.
41+
Set a `trackNode` for the Activity/Fragment/View to add tracking parameters.
6242

6343
```kotlin
6444
trackNode = TrackNode("channel_name" to "recommend")
@@ -68,63 +48,32 @@ trackNode = TrackNode("channel_name" to "recommend")
6848
holder.itemView.trackNode = TrackNode("video_id" to item.id, "video_type" to item.type)
6949
```
7050

71-
#### Establish a page source responsibility chain
72-
73-
When starting an activity, you need to call `intent.putReferrerTrackNode(activity/fragment/view)` to set the source node.
51+
Set a referrer node and a page node to establish a chain of source responsibilities between activity.
7452

7553
```kotlin
7654
val intent = Intent(activity, DetailsActivity::class.java).putReferrerTrackNode(view)
7755
activity.startActivity(intent)
7856
```
7957

80-
Then set a `PageTrackNode` in the the activity to establish a chain of source responsibilities between activity.
81-
8258
```kotlin
83-
trackNode = PageTrackNode("page_name" to "details")
59+
activity.trackNode = PageTrackNode("page_name" to "details")
8460
```
8561

86-
`PageTrackNode` will add the parameters of all the previous nodes to the page node, and some conversion rules can be set when adding. For example, the 'page_name' of the previous page, after jumping, report 'from_page'.
62+
This creates a chain of responsibility similar to the one below.
8763

88-
```kotlin
89-
val referrerKeyMap = mapOf("page_name" to "from_page", "channel_name" to "from_channel_name")
90-
trackNode = PageTrackNode(referrerKeyMap, "page_name" to "details")
91-
```
92-
93-
#### Report tracking parameters
64+
![image](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e4056fcff5a84c75988f4fa60e7e6ab5~tplv-k3u1fbpfcp-zoom-1.image)
9465

95-
Calling `Activity/Fragment/View.postTrack(eventId)` collects parameters through the chain of responsibility and calls back to `TrackHandler`.
66+
Then it can collect and post the parameters on the responsibility chain through any view.
9667

9768
```kotlin
9869
view.postTrack("click_favorite")
9970
```
10071

101-
#### Thread node
102-
103-
In the activity, you can set up a thread node, which can share the tracking parameter between views or pages.
104-
105-
```kotlin
106-
class RecordTrackNode : TrackNode {
107-
var isRecord = false
108-
109-
override fun fillTackParams(params: TrackParams) {
110-
params.put("is_record", it)
111-
}
112-
}
113-
114-
activity.putThreadTrackNode(RecordTrackNode())
115-
```
116-
117-
You can then update the parameters of the thread node in Activity, Fragment, View.
118-
119-
```kotlin
120-
view.updateThreadTrackNode<RecordTrackNode> { isRecord = true }
121-
```
72+
This library has Kotlin and Java sample code for simulating Buzzvideo tracking requirements.
12273

123-
Declare the thread node class when reporting.
74+
## Change log
12475

125-
```kotlin
126-
view.postTrack("click_publish", RecordTrackNode::class.java)
127-
```
76+
[Releases](https://github.com/DylanCaiCoding/Tracker/releases)
12877

12978
## Author's other libraries
13079

README_ZH.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[English](https://github.com/DylanCaiCoding/Tracker) | 中文
44

5-
[![](https://www.jitpack.io/v/DylanCaiCoding/Tracker.svg)](https://www.jitpack.io/#DylanCaiCoding/Tracker)
5+
[![](https://www.jitpack.io/v/DylanCaiCoding/Tracker.svg)](https://www.jitpack.io/#DylanCaiCoding/Tracker)
66
[![](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](https://github.com/DylanCaiCoding/Tracker/blob/master/LICENSE)
77

88
Tracker 是基于[西瓜视频的责任链埋点思路](https://mp.weixin.qq.com/s/iMn--4FNugtH26G90N1MaQ)实现的轻量级埋点框架。个人理解其核心思想后进行了改进和优化,最后仅用了 200 多行代码实现,学习成本更低,并且兼顾了 Kotlin 和 Java 用法。
@@ -11,10 +11,6 @@ Tracker 是基于[西瓜视频的责任链埋点思路](https://mp.weixin.qq.com
1111

1212
[为什么使用责任链的埋点方案?](https://dylancaicoding.github.io/Tracker/#/zh/idea)
1313

14-
## 示例
15-
16-
本库有模拟西瓜视频埋点需求的示例代码,大家可以克隆项目运行 `sample-java``sample-kotlin`,点击各个位置的收藏按钮查看埋点日志。
17-
1814
## Gradle
1915

2016
在根目录的 build.gradle 添加:
@@ -32,7 +28,7 @@ allprojects {
3228

3329
```groovy
3430
dependencies {
35-
implementation 'com.github.DylanCaiCoding:Tracker:1.0.0'
31+
implementation 'com.github.DylanCaiCoding:Tracker:1.0.1'
3632
}
3733
```
3834

@@ -42,7 +38,7 @@ dependencies {
4238

4339
## 示例
4440

45-
给 Activity、Fragment、View 设置埋点节点,通过视图树的层级关系(比如:`Activity -> Fragment -> ViewHolder -> Button`就能建立节点的上下级责任链关系
41+
给 Activity、Fragment、View 设置埋点节点,通过视图树的层级关系(比如:`Activity -> Fragment -> ViewHolder -> Button`建立节点的上下级责任链关系
4642

4743
```kotlin
4844
trackNode = TrackNode("channel_name" to "recommend")
@@ -52,7 +48,7 @@ trackNode = TrackNode("channel_name" to "recommend")
5248
holder.itemView.trackNode = TrackNode("video_id" to item.id, "video_type" to item.type)
5349
```
5450

55-
通过设置来源节点和页面节点建立页面间的来源关系
51+
设置来源节点和页面节点建立页面间的来源关系
5652

5753
```kotlin
5854
val intent = Intent(activity, DetailsActivity::class.java).putReferrerTrackNode(view)
@@ -73,6 +69,12 @@ activity.trackNode = PageTrackNode("page_name" to "details")
7369
view.postTrack("click_favorite")
7470
```
7571

72+
本库有模拟西瓜视频埋点需求的示例代码,大家可以克隆项目运行 `sample-java``sample-kotlin`,点击各个位置的收藏按钮查看埋点日志。
73+
74+
## 更新日志
75+
76+
[Releases](https://github.com/DylanCaiCoding/Tracker/releases)
77+
7678
## 反馈
7779

7880
有问题可以提 [issues](https://github.com/DylanCaiCoding/Tracker/issues) 或加个人微信 `DylanCaiCoding`直接反馈。

docs/README.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,12 @@
44
[![](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](https://github.com/DylanCaiCoding/Tracker/blob/master/LICENSE)
55
[![GitHub Repo stars](https://img.shields.io/github/stars/DylanCaiCoding/Tracker?style=social)](https://github.com/DylanCaiCoding/Tracker)
66

7-
Tracker 是基于[西瓜视频责任链的埋点思路](https://mp.weixin.qq.com/s/iMn--4FNugtH26G90N1MaQ)实现的轻量级埋点框架。个人理解其核心思想后进行了改进和优化,最后仅用了 200 多行代码实现,学习成本更低,并且兼顾了 Kotlin 和 Java 用法。
7+
Tracker 是基于[西瓜视频的责任链埋点思路](https://mp.weixin.qq.com/s/iMn--4FNugtH26G90N1MaQ)实现的轻量级埋点框架。个人理解其核心思想后进行了改进和优化,最后仅用了 200 多行代码实现,学习成本更低,并且兼顾了 Kotlin 和 Java 用法。
88

99
## 埋点思路
1010

1111
[为什么使用责任链的埋点方案?](/zh/idea)
1212

13-
## 示例
14-
15-
本库有模拟西瓜视频埋点需求的示例代码,大家可以克隆项目运行 `sample-java``sample-kotlin`,点击各个位置的收藏按钮查看埋点日志。
16-
1713
## Gradle
1814

1915
在根目录的 build.gradle 添加:
@@ -31,10 +27,18 @@ allprojects {
3127

3228
```groovy
3329
dependencies {
34-
implementation 'com.github.DylanCaiCoding:Tracker:1.0.0'
30+
implementation 'com.github.DylanCaiCoding:Tracker:1.0.1'
3531
}
3632
```
3733

34+
## 示例
35+
36+
本库有模拟西瓜视频埋点需求的示例代码,大家可以克隆项目运行 `sample-java``sample-kotlin`,点击各个位置的收藏按钮查看埋点日志。
37+
38+
## 更新日志
39+
40+
[Releases](https://github.com/DylanCaiCoding/Tracker/releases)
41+
3842
## 反馈
3943

4044
有问题可以提 [issues](https://github.com/DylanCaiCoding/Tracker/issues) 或加个人微信 `DylanCaiCoding`直接反馈。

docs/zh/idea.md

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,9 @@
6060
- 单例的数据可能被多个位置写入,且一旦被覆盖就没法恢复,导致埋点参数上报错误;
6161
- 存放和清理的时机难以控制,清理早了会导致埋点参数缺失,忘记清理可能导致后面的埋点获取不到参数;
6262

63-
### 无埋点
63+
### 全埋点/无埋点
6464

65-
无埋点是业界流行的一种埋点方案,所谓的“无埋点”、“全埋点”,是指埋点 SDK 通过编译时插桩、运行时反射或动态代理的方式,自动进行埋点事件的触发和上报,理论上能够搜集到所有页面、视图的曝光、点击等事件,无须客户端工程师手动进行埋点开发工作。
66-
67-
有这么好的事?为什么字节没有广泛使用?此方案的缺陷在于:
65+
指埋点 SDK 通过编译时插桩、运行时反射或动态代理的方式,自动进行埋点事件的触发和上报,理论上能够搜集到所有页面、视图的曝光、点击等事件,无须客户端工程师手动进行埋点开发工作。理想很丰满,现实很骨感,看似很完美的方案也是有些弊端:
6866

6967
- 仅能上报有限的简单事件类型,无法完成复杂事件的上报;
7068
- 全场景的数据上报,可能产生大量的无用数据,消耗大量传输、存储、计算资源;
@@ -84,7 +82,17 @@
8482

8583
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e4056fcff5a84c75988f4fa60e7e6ab5~tplv-k3u1fbpfcp-zoom-1.image)
8684

87-
所以我们需要的埋点上下文参数,理论上都可以通过节点的关系找到。
85+
所以我们需要的埋点上下文参数,理论上都可以通过节点的关系找到,然后通过责任链能很方便地收集到埋点参数。
86+
87+
## 各方案的优缺点
88+
89+
现有的三种埋点方案都有明显的缺点,全埋点或无埋点看似很美好,却只是个半自动方案,能自动上报的只有简单事件,复杂的事件只能手动处理,这又回到了直接传参或单例传参。
90+
91+
个人不推荐单例传参,因为不太可控,可能会被覆盖,清理时机不好把控,清早了丢数据。
92+
93+
直接传参是最稳的,但是会有大量的重复代码,并且嵌套过深可能会漏传参数。
94+
95+
而西瓜视频的责任链方案是直接传参的一种升级版,也是会传递参数,不过通过视图树和跳转链路建立的责任链自动收集埋点参数,代码量远比直接传参少很多。该方案也能作为全埋点或者无埋点的一种补充。
8896

8997
## 参考文章
9098

docs/zh/usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#### **Kotlin**
1010

1111
```kotlin
12-
initTracker(this, UMTrackHandler())
12+
initTracker(UMTrackHandler())
1313
```
1414

1515
```kotlin

library/src/main/java/com/dylanc/tracker/TrackNode.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
@file:Suppress("unused", "UNCHECKED_CAST", "FunctionName")
17+
@file:Suppress("unused", "FunctionName")
1818

1919
package com.dylanc.tracker
2020

@@ -33,14 +33,15 @@ fun Activity.PageTrackNode(vararg params: Pair<String, String>): TrackNode =
3333
fun Activity.PageTrackNode(referrerKeyMap: Map<String, String>, vararg params: Pair<String, String>): TrackNode =
3434
PageTrackNode(referrerKeyMap) { it.putAll(mapOf(*params)) }
3535

36+
@Suppress("UNCHECKED_CAST")
3637
fun Activity.PageTrackNode(referrerKeyMap: Map<String, String> = emptyMap(), trackNode: TrackNode = TrackNode { }): TrackNode {
3738
val referrerParams = intent.getSerializableExtra(KEY_TRACK_PARAMS) as? Map<String, Any>
38-
window.decorView.setTag(R.id.tag_thread_node_names, intent.getStringArrayExtra(KEY_TRACK_THREAD_NODES)?.toMutableList())
39+
val threadNodeSet = intent.getStringArrayExtra(KEY_TRACK_THREAD_NODES)?.map { allThreadNodes[it] }?.toMutableSet()
40+
window.decorView.setTag(R.id.tag_thread_nodes, threadNodeSet)
3941
return TrackNode { params ->
4042
referrerParams?.forEach {
4143
params.put(referrerKeyMap.getOrElse(it.key) { it.key }, it.value)
42-
}?.let {
43-
trackNode.fillTackParams(params)
4444
}
45+
trackNode.fillTackParams(params)
4546
}
4647
}

0 commit comments

Comments
 (0)