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>;
}

© 2011-2020 zuzuche.com. All Rights Reserved.  广州力挚网络科技有限公司  版权所有  营业执照   粤ICP备11007328号   粤公网安备 44010602000444号