package com.gh.common.util; import android.app.Activity; import android.app.Application; import android.content.Context; import android.os.Build; import android.text.TextUtils; import com.gh.common.constant.Config; import com.gh.gamecenter.BuildConfig; import com.halo.assistant.HaloApp; import com.lightgame.config.CommonDebug; import com.lightgame.utils.Util_System_Phone_State; import com.tencent.bugly.crashreport.CrashReport; import com.tencent.stat.MtaSDkException; import com.tencent.stat.StatConfig; import com.tencent.stat.StatCrashReporter; import com.tencent.stat.StatReportStrategy; import com.tencent.stat.StatService; import com.tendcloud.tenddata.TCAgent; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * Created by LGT on 2016/6/15. * 数据收集 工具类 (TalkingData、MTA) */ public class DataUtils { /** * 初始化各种统计工具,仅在release build(非debug)模式启用统计 * * @param context * @param channel */ public static void init(final Application context, String channel) { if (CommonDebug.IS_DEBUG) { return; } //TalkingData try { TCAgent.LOG_ON = false; TCAgent.init(context, Config.TALKINGDATA_APPID, channel); /** * * 不要启用!!!!不要启用,全部由{@link com.gh.base.AppUncaughtHandler}处理 */ TCAgent.setReportUncaughtExceptions(false); } catch (Exception e) { e.printStackTrace(); } //MTA try { /** * * 不要启用!!!!全部由{@link com.gh.base.AppUncaughtHandler}处理 */ StatConfig.setAutoExceptionCaught(false); StatCrashReporter crashReporter = StatCrashReporter.getStatCrashReporter(context); crashReporter.setJavaCrashHandlerStatus(false); // crashReporter.setEnableInstantReporting(true); StatConfig.setDebugEnable(false); // 设置数据上报策略 // 测试渠道的时候即时上传,方便查看日志 if ("GH_TEST".equals(HaloApp.getInstance().getChannel())) { StatConfig.setStatSendStrategy(StatReportStrategy.INSTANT); } else { StatConfig.setStatSendStrategy(StatReportStrategy.PERIOD); StatConfig.setSendPeriodMinutes(5); } // 设置启用Tlink StatConfig.setTLinkStatus(true); StatConfig.init(context); StatConfig.setInstallChannel(channel); StatConfig.setAntoActivityLifecycleStat(true); StatConfig.setAppVersion(PackageUtils.getVersionName()); // 开启收集服务 StatService.startStatService(context, Config.MTA_APPKEY, com.tencent.stat.common.StatConstants.VERSION); StatService.registerActivityLifecycleCallbacks(context); } catch (MtaSDkException e) { e.printStackTrace(); } // init bugly try { CrashReport.setIsDevelopmentDevice(context, "GH_TEST".equals(channel)); CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context); strategy.setEnableANRCrashMonitor(false); strategy.setEnableNativeCrashMonitor(false); strategy.setAppChannel(channel); strategy.setAppVersion(PackageUtils.getVersionName()); CrashReport.initCrashReport(context, Config.BUGLY_APPID, false, strategy); } catch (Exception e) { e.printStackTrace(); } } // MTA ->【次数统计】Key-Value参数的事件 public static void onMtaEvent(Context context, String eventId, String... kv) { // if (CommonDebug.IS_DEBUG && (kv == null || kv.length % 2 != 0)) { // throw new IllegalStateException("onEvent kv 必须不为空且数量为偶数"); // } MtaHelper.onEvent(eventId, kv); } public static void onEvent(Context var0, String var1, String var2) { TCAgent.onEvent(var0, var1, var2); Properties prop = new Properties(); prop.setProperty(var1, var2); StatService.trackCustomKVEvent(var0, var1, prop); } public static void onPause(Activity var0) { TCAgent.onPageEnd(var0, var0.getClass().getSimpleName()); StatService.onPause(var0); } public static void onResume(Activity var0) { TCAgent.onPageStart(var0, var0.getClass().getSimpleName()); StatService.onResume(var0); } // 游戏启动 public static void onGameLaunchEvent(Context context, String gameName, String platform, String page) { Map kv = new HashMap<>(); kv.put("版本", platform); kv.put("页面", page); onEvent(context, "游戏启动", gameName, kv); } public static void onEvent(Context var0, String var1, String var2, Map var3) { TCAgent.onEvent(var0, var1, var2, var3); Properties prop = new Properties(); prop.setProperty("label", var2); for (String key : var3.keySet()) { prop.setProperty(key, var3.get(key) + ""); } StatService.trackCustomKVEvent(var0, var1, prop); } public static void trackTimeEvent(Context context, String eventId, int costTime, String... kv) { Properties prop = new Properties(); for (int i = 0; i < kv.length; i++) { if (i % 2 != 0 || i != 0) { String key = kv[i - 1]; String value = kv[i]; if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { prop.setProperty(key, value); } } } if (prop.size() == 0) return; StatService.trackCustomKVTimeIntervalEvent(context, costTime, eventId, prop); } // 游戏下载 public static void onGameDownloadEvent(Context context, String gameName, String platform, String entrance, String status, String method) { Map kv = new HashMap<>(); platform = PlatformUtils.getInstance(HaloApp.getInstance().getApplication()).getPlatformName(platform); kv.put("版本", platform); kv.put("用户机型", Build.MODEL); kv.put("设备IMEI", Util_System_Phone_State.getDeviceId(HaloApp.getInstance().getApplication())); kv.put("网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication())); kv.put("光环助手版本", BuildConfig.VERSION_NAME); kv.put("位置", entrance); kv.put("类型", method); kv.put("厂商", Build.MANUFACTURER); kv.put("Android版本", Build.VERSION.RELEASE); onEvent(context, "游戏下载", gameName, kv); Map kv2 = new HashMap<>(); kv2.put("状态", status); kv2.put("位置", entrance); if (status.equals("开始")) { kv2.put("版本", entrance + "-开始"); kv2.put("游戏分平台", gameName + "-" + platform + "-开始"); kv2.put("光环助手版本", BuildConfig.VERSION_NAME + "-开始"); } else { kv2.put("版本", platform); kv2.put("游戏分平台", gameName + "-" + platform); kv2.put("光环助手版本", BuildConfig.VERSION_NAME); } onEvent(context, "游戏下载位置", gameName, kv2); } // 游戏更新 public static void onGameUpdateEvent(Context context, String gameName, String paltform, String status) { Map kv = new HashMap<>(); kv.put("版本", paltform); kv.put("状态", status); onEvent(context, "游戏更新", gameName, kv); } public static void onError(Context context, Throwable throwable) { // MTA主动上传错误 try { StatService.reportException(context, throwable); } catch (Exception e) { } // //bugly 作为默认处理异常的类库,已经上报了,此处不重复上报 // try { // CrashReport.postCatchedException(throwable); // } catch (Exception e) { // } //talkingdata try { TCAgent.onError(context, throwable); } catch (Exception e) { } } }