Android集成SDK
SDK名称
ZZCAnalyticsSDK-Android
版本说明
当前版本:v1.0
SDK下载
集成/安装SDK
第一步:在 project 级别的 build.gradle 文件中添加依赖:
buildscript {
repositories {
jcenter()
//添加 Sensors Analytics maven 库地址
maven {
url "https://dl.bintray.com/zouyuhan/maven"
}
}
dependencies {
classpath "com.android.tools.build:gradle:2.2.3"
//添加 Sensors Analytics android-gradle-plugin 依赖
classpath "com.sensorsdata.analytics.android:android-gradle-plugin2:1.0.2"
}
}
allprojects {
repositories {
jcenter()
//添加 Sensors Analytics maven 库地址
maven {
url "https://dl.bintray.com/zouyuhan/maven"
}
}
}
第二步:在 主 module 的 build.gradle 文件中添加依赖:
apply plugin: "com.android.application"
//添加 com.sensorsdata.analytics.android 插件
apply plugin: "com.sensorsdata.analytics.android"
dependencies {
//若没有则添加
compile "com.android.support:appcompat-v7:25.1.1"
//使用从第一步编译出来的库
compile(name: "SensorsAnalyticsSDK-release", ext: "aar")
}
初始化
示例代码:
public class MyApplication extends Application {
/**
* 采集数据的地址
*/
private final static String SA_SERVER_URL = "https://za.xxx.com/za";
/**
* 配置分发的地址,没有用到
*/
private final static String SA_CONFIGURE_URL = null;
/**
* 注意关闭debug模式,其它模式不要用以免干扰
*/
private final SensorsDataAPI.DebugMode SA_DEBUG_MODE = SensorsDataAPI.DebugMode.DEBUG_OFF;
@Override
public void onCreate() {
super.onCreate();
initSensorsDataAPI();
}
/**
* 初始化 Sensors Analytics SDK
*/
private void initSensorsDataAPI() {
/**
* 初始化(**必须**)
* 会创建当前进程对应的SensorsDataAPI实例
*/
SensorsDataAPI.sharedInstance(
this,
SA_SERVER_URL,
SA_CONFIGURE_URL,
SA_DEBUG_MODE,
new TantuHttpHooker());
/**
* 基本配置(**必须**)
* 之后可以通过传入本进程的context(application或activity)即可获取上一步初始化的实例
* 在没有context的地方直接使用 ensorsDataAPI.sharedInstance() 来获取,前提是已经初始化过
*/
SensorsDataAPI.sharedInstance(this).setFlushNetworkPolicy(SensorsDataAPI.NetworkType.TYPE_WIFI); //WIFI才上报
SensorsDataAPI.sharedInstance(this).setFlushBulkSize(0); //只要有数据就上报
SensorsDataAPI.sharedInstance(this).setFlushInterval(5000); //上报检查时间间隔
SensorsDataAPI.sharedInstance(this).enableLog(BuildConfig.DEBUG); //显示错误信息
/** 设置根部字段(**必须**)
* 根部字段会自动加入到每一个上报数据的根部
*/
JSONObject rootFields = new JSONObject();
try {
commonProps.put("project", "xxx");
commonProps.put("product", "xxx");
SensorsDataAPI.sharedInstance(this).registerRootFields(rootFields);
} catch (JSONException e) {
e.printStackTrace();
}
/** 设置公共属性(**必须**)
* 公共属性会自动加入到每一个上报的事件里,合并到properties字段内
*/
JSONObject commonProps = new JSONObject();
try {
commonProps.put("lang", "cn"); //见wiki定义,不同产品使用不同value
SensorsDataAPI.sharedInstance(this).registerSuperProperties(commonProps);
} catch (JSONException e) {
e.printStackTrace();
}
/**
* 以下有需要才打开(可选)
* 打开自动采集, 并指定追踪哪些 AutoTrack 事件
*/
List<SensorsDataAPI.AutoTrackEventType> eventTypeList = new ArrayList<>();
eventTypeList.add(SensorsDataAPI.AutoTrackEventType.APP_START);
eventTypeList.add(SensorsDataAPI.AutoTrackEventType.APP_END);
eventTypeList.add(SensorsDataAPI.AutoTrackEventType.APP_VIEW_SCREEN);
eventTypeList.add(SensorsDataAPI.AutoTrackEventType.APP_CLICK);
SensorsDataAPI.sharedInstance(this).enableAutoTrack(eventTypeList);
SessionMonitor.getInstance().bindApplication(this); //必须在初始化 SensorSDK 之后才能注册调用。
}
class TantuHttpHooker implements SensorsDataAPI.HttpPostHooker {
/**
* 在这里发起HTTP POST请求,将内容 s POST给服务器,
* 这里每个客户端可以控制和定制自己的HTTP请求行为,
* 若出错,抛异常就可以了,神策SDK会使用指定的策略进行重试,post使用表单的方式
*
* Notice:公用参数的加密处理,Gzip->Base64->urlEncode
*
*/
@Override
public void post(String serverUrl, String rawMessage) throws Exception {
String gzipContent = compressForGzip(rawMessage);
String postData = "gzip=1&data_list=" + URLEncoder.encode(gzipContent, "utf-8");
okhttp3.RequestBody requestBody = okhttp3.RequestBody
.create(okhttp3.MediaType.parse("application/x-www-form-urlencoded"), postData);
okhttp3.Request.Builder builder = new okhttp3.Request.Builder()
.url(serverUrl)
.addHeader("Accept-Encoding", "gzip")
.addHeader("User-Agent", Constants.USER_AGENT) //我们的APP的User-Agent是需要的, 这里示例省略
.post(requestBody);
okhttp3.Response response = new OkHttpClient().newCall(builder.build()).execute();
if (response.code() != 200) //错误则抛出异常,SensorSDK会根据配置策略自动重试
throw new Exception("response error " + response.message());
}
}
/**
* Gzip 压缩数据
*
* @param unGzipStr
* @return
*/
public static String compressForGzip(String unGzipStr) {
if (TextUtils.isEmpty(unGzipStr)) {
return null;
}
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(baos);
gzip.write(unGzipStr.getBytes());
gzip.close();
byte[] encode = baos.toByteArray();
baos.flush();
baos.close();
return new String(Base64.encode(encode, Base64.NO_WRAP));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
完整代码见MyApplication.java,
事件/埋点
final JSONObject properties = new JSONObject();
properties.put("prop_name", "xxxx"; //要报什么,根据协议规定添加属性
SensorsDataAPI.sharedInstance(MainActivity.this).track("user_action.test", properties); //指明上报的事件名
//也可以不带context使用:SensorsDataAPI.sharedInstance().track(...)
其它
Android SDK 要求最低系统版本为 API 11(Android 3.0),特别地,AutoTrack功能要求系统最低版本为 API 14 (Android 4.0),可视化埋点功能要求最低系统版本为 API 16(Android 4.1)
如果开启了混淆,请在proguard文件中添加下边代码:
-dontwarn com.sensorsdata.analytics.android.**
-keep class com.sensorsdata.analytics.android.** {
*;
}
-keep class **.R$* {
<fields>;
}
-keep public class * extends android.content.ContentProvider
-keepnames class * extends android.view.View
-keep class * extends android.app.Fragment {
public void setUserVisibleHint(boolean);
public void onHiddenChanged(boolean);
public void onResume();
public void onPause();
}
-keep class android.support.v4.app.Fragment {
public void setUserVisibleHint(boolean);
public void onHiddenChanged(boolean);
public void onResume();
public void onPause();
}
-keep class * extends android.support.v4.app.Fragment {
public void setUserVisibleHint(boolean);
public void onHiddenChanged(boolean);
public void onResume();
public void onPause();
}
// 如果使用了 DataBinding
-dontwarn android.databinding.**
-keep class android.databinding.** { *; }
-keep class 您项目的包名.databinding.** {
<fields>;
<methods>;
}