最新版本: 0.1.0-SNAPSHOT
Varys - 监控平台
Whisper - 移动端的数据收集 SDK
运维场景 (APM)
- 业务上
- 用户画像
- 灰度包、A/B 测试结果 收集
- App 包监控:稳定性、性能体验、用户舆情、核心业务
- 开发支持
- 版本修复 (Hotfix 支持等)
- 监控报警 (Crash 平台)
- 性能指标记录
Whisper 是用作埋点的客户端 lib / SDK。
- 数据定义
- 数据存储
- 特定数据收集
- 设备信息
- Business code
- 数据定期发送
- Crash 信息收集
- 现在使用的是固定 Token 放在 Http 头中做验证,需要改进
- 需要在应用中显式调用,没有实现自动埋点
app module 的 build.gradle
中引入
repositories {
maven {
url "https://oss.sonatype.org/content/groups/public/"
}
}
dependencies {
compile 'io.buzznerd:whisper:0.1.0-SNAPSHOT'
}
在 AndroidManifest.xml
中添加
<!-- whisper server address -->
<meta-data
android:name="WHISPER_SERVER_ADDRESS"
android:value="https://120.76.128.139:8463/device/"/>
使用了第三方的开源库: Realm、Retrofit
工程的 build.gradle
中引入
buildscript {
dependencies {
classpath "io.realm:realm-gradle-plugin:2.1.1"
}
}
在 AAR 中包含有 proguard 文件,会自动集成到项目中。所以不需要单独指定 proguard 配置.
1) 初始化
在使用前使用 Whisper.Builder
初始化 Whisper,并调用 init(context) 完成初始化,之后就可以直接使用。
最通常的做法是在 Application 的 OnCreate
方法中完成。
Whisper.Builder whisperBuilder = new Whisper.Builder();
if (!BuildConfig.DEBUG) {
whisperBuilder.setLogLevel(Whisper.LogLevel.NONE);
}
Whisper whisper = whisperBuilder.build();
whisper.init(this);
- 记录日志
预定义的事件:
Whisper.getDefaultInstance().logAppStart(); // app start
Whisper.getDefaultInstance().logUserLogin(userName); // login
Whisper.getDefaultInstance().logUserLogout(userName); // logout
// best is put in base activity onResume and onPause method, to track page viewing events
Whisper.getDefaultInstance().logOnResume(context); // page show
Whisper.getDefaultInstance().logOnPause(context); // page hide
// self-defined session, can only start one at the same time
Whisper.getDefaultInstance().startSession(context, userName); // start session
Whisper.getDefaultInstance().endSession(); // end session
// log business code, code definition refer to Handover code definition
Whisper.getDefaultInstance().logOkchemBizInApplication(String okchemBizHitCode); // none session
Whisper.getDefaultInstance().logOkchemBizInSession(String okchemBizHitCode));
// self-defined log info
Whisper.getDefaultInstance().logApplicationEvent(String target, String action, int actionType, String extra); // none session event
Whisper.getDefaultInstance().logSessionEvent(String target, String action, int actionType, String extra); // current session event
其他调用:
// 同步数据,默认会过段时间自动同步
Whisper.getDefaultInstance().doUpload(null); // 立即发送本地log, 实现参数可以处理返回结果.
-
记录查看
web 端可以查看统计 -
数据定义 ActionType Code
/**
* default hit action type
*/
public static final int ACTION_TYPE_NORMAL = 0;
/**
* hit action: app start
*/
public static final int ACTION_TYPE_START_APP = 100;
/**
* hit action: page resume
*/
public static final int ACTION_PAGE_RESUME = 101;
/**
* hit action: page pause
*/
public static final int ACTION_PAGE_PAUSE = 102;
/**
* hit action: start a new session
*/
public static final int ACTION_START_SESSION = 103;
/**
* hit action: end current session
*/
public static final int ACTION_END_SESSION = 104;
/**
* hit action: user login
*/
public static final int ACTION_USER_LOGIN = 105;
/**
* hit action: user logout
*/
public static final int ACTION_USER_LOGOUT = 106;
/**
* hit action: okchem biz event
*/
public static final int ACTION_OKCHEM_HIT = 200;
/**
* hit action: exception caught
*/
public static final int ACTION_EXCEPTION = 400;
由于依赖 realm,包含 .so 文件后,应用打包之后会有 6.7mb
解决:
在 app 模块中 build.gradle 中指定 .so 种类,去除几种。可以降到 3.3mb (如果再去掉 x86, 可降到 2.1mb)
android {
buildTypes {
release {
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a', 'x86'
// available option: 'x86_64', 'mips', 'mips64'
}
}
}
}
现在自动屏蔽了 Https 的验证,方便快速使用
解决:server 地址使用真正的 Https 然后客户端 Whisper 去掉屏蔽。
当应用添加有推送时,Whisper 会同时调用两次 init
- Retrofit
- Realm Android
参考/借鉴了