全部产品
云市场

Android接入

更新时间:2018-08-28 17:53:49

1. SDK集成

  • 修改文件位置:项目根目录的build.gradle;
  • 修改文件内容:allprojects.repositories中配置maven仓库地址用于拉取相关SDK。

  • build.gradle中添加Maven仓库地址:

  1. allprojects {
  2. repositories {
  3. maven {
  4. url "http://nexus-ce.emas-poc.com/repository/maven-public/"
  5. credentials {
  6. //SDK中心仓库账号密码
  7. username = "xxx"
  8. password = "xxx"
  9. }
  10. }
  11. }
  12. }
  • gradle中添加依赖:
  1. compile('com.alibaba.android.emas:emas-man:1.0.0')
  2. compile('com.taobao.android:ut-analytics:1.1.0.1-open@aar') { transitive true }
  3. compile('com.taobao.android:utdid4all:1.1.5.3_proguard@jar') { transitive true }
  4. // 如果同时集成高可用产品,下述的exclude内容可注释掉
  5. compile('com.alibaba.ha:alihatbadapter:1.1.0.3-open@aar') {
  6. transitive true
  7. exclude group: 'com.taobao.android', module: 'tlog_native'
  8. exclude group: 'com.taobao.android', module: 'tlog_protocol'
  9. exclude group: 'com.taobao.android', module: 'tlog_uploader_oss'
  10. exclude group: 'com.taobao.android', module: 'tlog_message_rpc'
  11. exclude group: 'com.taobao.android', module: 'taobao_onlinemonitor'
  12. exclude group: 'com.taobao.android', module: 'telescopesdk'
  13. exclude group: 'com.taobao.android', module: 'telescopebase'
  14. exclude group: 'com.taobao.android', module: 'crashreporter'
  15. exclude group: 'com.taobao.android', module: 'bizerrorreporter'
  16. exclude group: 'com.taobao.android', module: 'watch'
  17. }
  18. compile('com.alibaba:fastjson:1.1.54.android@jar') { transitive true }
  19. compile('com.squareup.okhttp3:okhttp:3.4.1@jar')
  20. compile('com.squareup.okio:okio:1.9.0@jar')
  21. compile('com.aliyun.dpa:oss-android-sdk:2.4.2@aar')

2. SDK使用

2.1 SDK初始化

  • 传入appKeyappSecret初始化数据分析SDK。
  • 调用该接口初始化SDK前,先完成EMAS高可用相关的配置,可参考文档:EMAS Android SDK快速集成,查看对应配置项含义,也可以参考下面的示例代码。
  1. void init(Application application, String appKey, String appSecret);
  • 示例代码:
  1. private EMASMANService manService;
  2. private final String kAppKey = "xxx";
  3. private final String kAppSecret = "xxx";
  4. private final String kUploadHost = "xxx";
  5. // 打开调试日志
  6. AliHaAdapter.getInstance().openDebug(true);
  7. // 设置上报网关地址
  8. AliHaAdapter.getInstance().changeHost(kUploadHost);
  9. AliHaAdapter.getInstance().startWithPlugin(buildAliHaConfig(), Plugin.ut);
  10. AliHaAdapter.getInstance().utAppMonitor.changeSampling(Sampling.All);
  11. AliHaAdapter.getInstance().start(buildAliHaConfig());
  12. AliHaAdapter.getInstance().openHttp(true);
  13. manService = EMASMANServiceFactory.getMANService();
  14. manService.init(application, kAppKey, kAppSecret);
  15. private AliHaConfig buildAliHaConfig() {
  16. AliHaConfig config = new AliHaConfig();
  17. config.isAliyunos = false;
  18. config.appKey = kAppKey;
  19. config.appVersion = BuildConfig.VERSION_NAME;
  20. config.application = this;
  21. config.context = this;
  22. return config;
  23. }

2.2 日志开关

  • 打开/关闭日志,默认是关闭,需在SDK初始化前调用才能生效。
  1. void enableLog(boolean enable);
  • 示例代码:
  1. // 打开调试日志
  2. manService.enableLog(true);
  3. manService.init(application, kAppKey, kAppSecret);

2.3 App版本号

  • 设置App版本号。
  1. void setAppVersion(String appVersion);
  • 示例代码:
  1. manService.setAppVersion("1.2.3");

2.4 App渠道

  • 设置App渠道。
  1. void setChannel(String channel);
  • 示例代码:
  1. manService.setChannel("aliyun");

2.5 用户注册

  • 用户注册。
  1. void userRegister(String userNick);
  • 示例代码:
  1. manService.userRegister("testUserNick");

2.6 用户登录

  • 用户登录。
    • userNick对应2.5节用户注册的用户名;
    • userId为用户名对应的ID。
  1. void userLogin(String userNick, String userId);
  • 示例代码:
  1. manService.userLogin("testUserNick", "testUserId");

2.7 上报埋点日志

  • 上报日志数据。
  1. void send(Map<String, String> properties);
  • 示例代码:
  1. // 上报页面事件埋点
  2. EMASMANPageHitBuilder pageHitBuilder = new EMASMANPageHitBuilder("testPage");
  3. ...
  4. pageHitBuilder.setProperty("pageKey1", "pageValue1");
  5. manService.send(pageHitBuilder.build());
  6. // 上报自定义事件埋点
  7. EMASMANCustomHitBuilder customHitBuilder = new EMASMANCustomHitBuilder("testEvent");
  8. ...
  9. customHitBuilder.setProperty("key1", "value1");
  10. manService.send(customHitBuilder.build());

2.8 页面辅助埋点

使用EMASMANPageHitHelper可以进行Activity级别的页面埋点,可自动完成页面名称(默认获取Activity名称,并去除后缀Activity)、来源页面和页面停留事件的统计上报。如需使用更为灵活的页面埋点方案,可使用EMASMANPageHitBuilder页面基础埋点,详情见2.9节。

  • 页面进入:
    • 进入页面时调用,不会触发日志上报;
    • 调用时机:Activity生命周期onResume
    • 需要配合pageDisAppear使用。
  1. void pageAppear(Activity activity);
  • 页面离开:
    • 离开页面时调用,触发日志上报;
    • Activity生命周期onPause
    • 需要配合pageAppear使用。
  1. void pageDisAppear(Activity activity);
  • 设置页面扩展参数:
    • 设置页面扩展参数;
    • 调用时机:调用pageDisAppear前;
    • 非必须调用。
  1. void updatePageProperties(Map<String, String> properties);

示例代码:

  1. // 基础类BaseActivity
  2. public class BaseActivity extends Activity {
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. }
  7. @Override
  8. protected void onResume() {
  9. super.onResume();
  10. EMASMANPageHitHelper.getInstance().pageAppear(this);
  11. }
  12. @Override
  13. protected void onPause() {
  14. super.onPause();
  15. EMASMANPageHitHelper.getInstance().pageDisAppear(this);
  16. }
  17. }
  18. // TestPageActivity继承自BaseActivity
  19. public class TestPageActivity extends BaseActivity {
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_test_page);
  24. Map<String, String> properties = new HashMap<>();
  25. properties.put("pageKey1", "pageValue1");
  26. properties.put("pageKey2", "pageValue2");
  27. EMASMANPageHitHelper.getInstance().updatePageProperties(properties);
  28. }
  29. }

2.9 页面基础埋点

2.6节所述的EMASMANPageHitHelper只适用于Activity级别的页面,其不能满足一些场景的页面事件。如果需要对非Activity页面,如Fragment进行埋点,或者需要灵活把控页面埋点上报信息,如修改上报页面信息、对页面停留时长做特殊处理等,可以使用页面基础埋点EMASMANPageHitBuilder的方式,最后构造出页面事件的日志,最终通过调用日志上报接口。

  • 设置页面名:
    • 设置页面名称,pageName为非空;
    • 页面名称是页面事件的基础,必须设置。
  1. EMASMANPageHitBuilder setReferPage(String referPageName);
  • 设置来源页面名:
    • 设置当前页面的来源页面。
  1. EMASMANPageHitBuilder setReferPage(String referPageName);
  • 设置页面停留时间:
    • 记录从进入到离开页面的停留时间,单位:毫秒。
  1. EMASMANPageHitBuilder setDurationOnPage(long duration);
  • 设置页面扩展参数:
    • 添加页面扩展参数,其中key不能为PAGE/EVENTID/ARG1/ARG2/ARG3/ARGS
  1. EMASMANPageHitBuilder setProperty(String key, String value);
  2. EMASMANPageHitBuilder setProperties(Map<String, String> properties);
  • 页面日志构建:
    • 构建生成页面埋点日志,可调用2.7节日志上报接口将其上报。
  1. Map<String, String> build();
  • 示例代码:
  1. EMASMANPageHitBuilder pageHitBuilder = new EMASMANPageHitBuilder("testPage");
  2. pageHitBuilder.setReferPage("testReferPage");
  3. pageHitBuilder.setDurationOnPage(1234);
  4. pageHitBuilder.setProperty("pageKey1", "pageValue1");
  5. Map<String, String> properties = new HashMap<>();
  6. properties.put("pageKey2", "pageValue2");
  7. pageHitBuilder.setProperties(properties);
  8. manService.send(pageHitBuilder.build());

2.10 自定义事件埋点

  • 自定义事件创建:
    • 参数为自定义事件标签,用于区分唯一标识自定义事件,必须设置。
  1. EMASMANCustomHitBuilder(String eventLabel);
  • 设置页面名:
    • 标识自定义事件发生的页面;
    • 非必须调用。
  1. EMASMANCustomHitBuilder setEventPage(String page);
  • 设置事件停留时间:
    • 自定义事件持续时间。
  1. EMASMANCustomHitBuilder setDurationOnEvent(long duration);
  • 设置扩展参数:
    • 自定义事件扩展参数设置,其中key不能为PAGE/EVENTID/ARG1/ARG2/ARG3/ARGS
  1. EMASMANCustomHitBuilder setProperty(String key, String value);
  2. EMASMANCustomHitBuilder setProperties(Map<String, String> properties);
  • 自定义事件日志构建:
    • 构建生成自定义事件埋点日志,可调用2.5节日志上报接口将其上报。
  1. Map<String, String> build();
  • 示例代码:
  1. EMASMANCustomHitBuilder customHitBuilder = new EMASMANCustomHitBuilder("testEvent");
  2. customHitBuilder.setEventPage("testPage");
  3. customHitBuilder.setDurationOnEvent(1234);
  4. customHitBuilder.setProperty("key1", "value1");
  5. Map<String, String> properties = new HashMap<>();
  6. customHitBuilder.setProperties(properties);
  7. manService.send(customHitBuilder.build());

3. 调试验证

3.1 打开调试日志

  • 调用SDK接口,打开调试日志,并初始化SDK。
  • 若没有错误日志提示,则SDK初始化成功。
  1. manService.enableLog(true);
  2. manService.init(application, kAppKey, kAppSecret);

3.2 埋点事件上报

  • 参照第2节,选择一事件上报,例:上报自定义事件。
  1. EMASMANCustomHitBuilder customHitBuilder = new EMASMANCustomHitBuilder("testEvent");
  2. customHitBuilder.setEventPage("testPage");
  3. customHitBuilder.setDurationOnEvent(1234);
  4. customHitBuilder.setProperty("key1", "value1");
  5. Map<String, String> properties = new HashMap<>();
  6. customHitBuilder.setProperties(properties);
  7. manService.send(customHitBuilder.build());
  • 成功埋点后,可看到类似如下日志。
  1. 24 12:18:50.289 18764-18809/com.junmo.man_sdk_demo D/UTAnalytics:UploadTask: pid:18764 mPeriod:30000,
  2. 06-24 12:18:50.702 18764-18764/com.junmo.man_sdk_demo D/UTAnalytics:UTDC: pid:18764 [commit] page:testPage,eventId:19999,arg1:testEvent,arg2:arg3:1234,args:{SDKTYPE=mini, key1=value1},
  3. 06-24 12:18:50.706 18764-18764/com.junmo.man_sdk_demo D/UTAnalytics:UTLog: pid:18764 Log [id=0, eventId=19999, index=],Ww/xMZI/HysolCe8BVMAnQ==||Ww/xMZLlVfMOx701CBeXDw==||Android||Android SDK built for x86_64||1794*1080||Android||2G/3G||LTE||aliyun||20000068||1.2.3||userNick-1529831983231||-||userNick-1529831983231||-||en||a||7.0||2.6.1_for_bc||1529842600246||WGCzcBjJCogDAJwcljAE9H4Y||mini||-||-||-||-||_ap=1,_mac=02:00:00:00:00:00||1529842730702||testPage||19999||testEvent||-||1234||key1=value1,
  4. 06-24 12:18:50.706 18764-18764/com.junmo.man_sdk_demo D/UTAnalytics:LogStoreMgr: pid:18764 [add] :,
  5. 06-24 12:18:55.712 18764-18786/com.junmo.man_sdk_demo D/UTAnalytics:LogStoreMgr: pid:18764 [store],
  6. 06-24 12:18:55.718 18764-18786/com.junmo.man_sdk_demo D/UTAnalytics:UTSqliteLogStore: pid:18764 [insert] ,, isSuccess:true,ret,90,

3.3 日志上报策略

  • App启动时尝试首次上报日志,之后按照定时间隔(30s)上报。
  • App切换到后台,立即上报。

3.4 日志上报验证

  • SDK内部有日志上报控制策略,埋点完成后不一定立即上报,可等待一段时间或者App进行几次前后台切换,触发日志上报。若可看到如下类似日志,说明日志上报成功。
  1. 06-24 12:19:20.342 18764-18809/com.junmo.man_sdk_demo D/UTAnalytics:UploadTask: pid:18764 logs.size():1, selfMonitorLogCount:0,
  2. 06-24 12:19:20.342 18764-18809/com.junmo.man_sdk_demo D/UTAnalytics:UploadTask: pid:18764 upload isSendSuccess:true, consume:25, delete consume:10,

4. 混淆配置

SDK混淆配置可参考:Android快速集成 - 混淆配置,然后再加入下述配置。

  1. -keep class com.alibaba.android.emas.man.**{*;}