TalkingData技术实现分析
初始化分析
初始化主要做了以下几件事:
读取配置信息appId、channeId,既可通过代码设置appId、channelId,也可以在manifest中设置;如果两个都设置的话,优先以AndroidManifest.xml为主;
Hook系统函数,监听Activity生命周期;
Android 4.0及以后版本,只需要向mActivityLifecycleCallbacks 添加一个callback即可
public class Application extends ContextWrapper implements ComponentCallbacks2 {private ArrayList<ComponentCallbacks> mComponentCallbacks =new ArrayList<ComponentCallbacks>();private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =new ArrayList<ActivityLifecycleCallbacks>();private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null;/** @hide */public LoadedApk mLoadedApk;public interface ActivityLifecycleCallbacks {void onActivityCreated(Activity activity, Bundle savedInstanceState);void onActivityStarted(Activity activity);void onActivityResumed(Activity activity);void onActivityPaused(Activity activity);void onActivityStopped(Activity activity);void onActivitySaveInstanceState(Activity activity, Bundle outState);void onActivityDestroyed(Activity activity);}}
android4.0之前,需要Hook ActivityManagerNative,这是一个很有用的类,android插件化、热更新也会hook这个类;说到插件化,个人感觉还是360做得比较好,基本上完全解耦了,不需要任何依赖就可以加载apk,但要hook的系统类比较多,还需要对各种版本兼容,甚至不同的rom兼容,难度和工作量都是比较大的,但对我们了解apk的启动与安装有很大帮助;
public abstract class ActivityManagerNative extends Binder implements IActivityManager {......
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {protected IActivityManager create() {IBinder b = ServiceManager.getService("activity");if (false) {Log.v("ActivityManager", "default service binder = " + b);}IActivityManager am = asInterface(b);if (false) {Log.v("ActivityManager", "default service = " + am);}return am;}};public interface IActivityManager extends IInterface {......public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,ProfilerInfo profilerInfo, Bundle options) throws RemoteException; public void finishSubActivity(IBinder token, String resultWho, int requestCode) public void activityPaused(IBinder token) throws RemoteException;public void activityStopped(IBinder token, Bundle state,PersistableBundle persistentState, CharSequence description) throws RemoteException;......
}
原理就是通过动态代理创建IActivityManager的代理类,再赋值给gDefault;
日志保存
TalkingData对外提供了三个保存的接口
1. TCAgent.onEvent(context, "event_ID", "事件标签");2. Map<String, Object> map = new HashMap<String, Object>();map.put("游戏类型", "益智游戏");map.put("下载次数", 100000);map.put("price", number);TCAgent.onEvent(context, "event_ID", "event_LABEL", map);3. TCAgent.onError(context, exception);
日志保存也使用单独的线程,最终会保存在数据库中,不同类型,保存在不同的表中。
private static final HandlerThread processingThread= new HandlerThread("ProcessingThread");CREATE TABLE app_event(_id INTEGER PRIMARY KEY autoincrement,event_id TEXT,session_id TEXT,paramap BLOB);CREATE TABLE error_report(_id INTEGER PRIMARY KEY autoincrement,error_time LONG,repeat INTERGER,shorthashcode TEXT);CREATE TABLE activity (_id INTEGER PRIMARY KEY autoincrement,name TEXT,duration INTEGER,refer TEXT,realtime LONG);CREATE TABLE session (_id INTEGER PRIMARY KEY autoincrement,session_id TEXT,start_time LONG,duration INTEGER,is_launch INTEGER,interval LONG, is_connected INTEGER);
当然保存在数据库中数据会进行加密,talkingData使用aes+base64的方式加密存储,下面就是加密后的数据格式
occurtime = gT/eWPVCUNwdo27ijTY+DA==
event_id = T5GkG01BkfChcRqKfBoKLQ==
session_id = cGs8z2tU7emPtYnra01EbJuMZKh4RV2lbstIQU/o7oXXCQTC/sW9pdwNrUlwJymt
event_label = l9Hm43j6KrFsMyS402s+ng==
日志上传
每次重新启动或者间隔30s会触发日志上传;
从数据库中读取日志时,日志会去重;
上传的数据会进行gzip压缩;
SELECT COUNT(_id), MAX(occurtime), event_id, event_label, paramap from app_event group by event_id, event_label, paramap
灵动分析功能
TalkingData还有一个很不错的灵动分析功能,其原理主要通过下面的方法来实现对View的监听;
public void sendAccessibilityEvent(int eventType) {if (mAccessibilityDelegate != null) {mAccessibilityDelegate.sendAccessibilityEvent(this, eventType);} else {sendAccessibilityEventInternal(eventType);}}
自实现统计sdk
读写分离,读和写都在独立的进程;
数据库加密存储,aes+base64;
日志上传
1) 对日志进行去重;
2) 上传时机:每次初始化后上传日志,日志上传间隔时间30s;
3) gzip压缩;数据格式
上传时,都转为json对象,并进行gzip压缩;数据格式 说明 event_id 事件类型 event_lable 标签 map 详情,key-value
map的基础字段
字段名 说明 device_id 设备号 device_cookie 安装后生成的唯一表示,不卸载重装不会改变 network_type 网络类型,3g、4g、wifi os 操作系统,android4.4.4 package_name 包名,应用的唯一标识 version 应用版本 phone_model 手机型号 net_operator 网络运营商 language 系统语言 phone_number 手机号 mac mac地址 resolution 分辨率,480x800 config_id 配置id create_time 日志生成的时间 几种常见的事件类型
event_id event_label map crash、xxException error “detail”=”堆栈信息” OpenGame、PauseGame、CreateRole、… custom “server”=”服务器”, “role_name”=”角色名”, “role_id”=”角色Id”“account”=”账号” xx cmd “detail”=”命令详情”
TalkingData技术实现分析相关推荐
- 数据中心液冷技术发展分析
电力信息与通信技术,中国知网 | 来源 数据中心液冷技术发展分析 | 题目 王艳松1,张琦2,孙聪3,庄泽岩2,黄子轩2,翟天一4 | 作者 1国网北京市电力公司,2华为技术有限公司,3中国信息通信研 ...
- 赵英时遥感原理分析和应用课件_细数5种停车场防砸车技术原理分析与应用
原标题:细数5种停车场防砸车技术原理分析与应用 一.压力波防砸装置 也叫遇阻防砸,主要是安装遇阻返回装置,当道闸杆下落过程中接触到车辆或者行人(接触力度是可以调节的),装置道闸杆底下的橡胶条受到阻力, ...
- 智能情绪分析技术_石化缘推荐:炼化企业智能机器人巡检技术应用前景分析!...
本期内容由湖南天一奥星泵业有限公司冠名 炼化企业智能机器人巡检技术应用前景分析 王国彤1,孙秉才2,储胜利2,宋亚敏1(1.中国石油天然气股份有限公司大连石化分公司,辽宁省大连市:2.中国石油集团安全 ...
- 如何高效提高倾斜摄影三维模型顶层合并的技术方法分析
如何高效提高倾斜摄影三维模型顶层合并的技术方法分析 1.倾斜摄影三维模型顶层合并 1.1倾斜摄影三维模型是一种基于倾斜摄影技术,通过多个角度拍摄同一区域的影像,利用计算机图像处理和三维重建技术生成的三 ...
- [DEV] 陷阱技术探秘 ──动态汉化Windows技术的分析
"陷阱"技术探秘 ──动态汉化Windows技术的分析 四通利方(RichWin).中文之星(CStar)是大家广为熟知的汉化Windows产品,"陷阱"技术即 ...
- 陷阱技术探秘 ----动态汉化Windows技术的分析
"陷阱"技术探秘 ──动态汉化Windows技术的分析 四通利方(RichWin).中文之星(CStar)是大家广为熟知的汉化Windows产品,"陷阱"技术即 ...
- 陷阱技术探秘 ──动态汉化Windows技术的分析
"陷阱"技术探秘 ──动态汉化Windows技术的分析 四通利方(RichWin).中文之星(CStar)是大家广为熟知的汉化Windows产品,"陷阱"技术即 ...
- 射频识别技术原理分析
射频识别技术原理分析 射频识别(RFID)技术相对于传统的磁卡及IC卡技术具有非接触.阅读速度快.无磨损等特点,在最近几年里得到快速发展.为加强中国工程师对该技术的理解,本文详细介绍了RFID技术的工 ...
- 2020清华计算机科学与技术录取分析总结
声明:本文章首发于2020年清华大学计算机科学与技术录取分析,未经作者授权,禁止任何形式的的转载! 本文尽可能以一个客观的角度分析2020年被录取学硕同学的情况,以备参考. 2020年被录取计算机学硕 ...
- 抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建。
前言:抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建. 抖音seo源码如何搭建?抖音seo排名优化系统软件部分源码分析,代码打包中... 场景:在 python 中,你可以使用 list[1 ...
最新文章
- (转)TabContainer要实现服务器端回传
- 领课网络在线教育系统开源项目
- c++中内敛函数_C++ 内联函数 | 菜鸟教程
- Docker Review - dockerfile 实战_给基础镜像增加功能
- 深大计算机科学与技术在广东省,广东考生请注意:深圳大学2021年计划本省总招生人数比例超过75%!...
- MYSQL返回指定时间间隔函数DATE_SUB和TO_DAYS详解
- 英特尔 开源降噪库 api_Google的新操作系统,英特尔的开源VR耳机以及更多新闻
- 计算机漏洞为什么无法避免,雷电3接口漏洞影响数百万计算机:5分钟解锁设备,无法修复...
- 还在用Json-lib?面对疾风吧!
- nodejs 使用的一些http网络请求模块
- 74cms代码执行漏洞
- 机器学习——专业名词
- 彻底解决联想手机数据连接不能上网问题(无需恢复出厂设置) 本文来自移动叔叔论坛 ,详细出处请参考:http://bbs.ydss.cn/thread-201115-1-1.html
- 三分钟带你详解SSL认证与加密技术
- java基础知识【第12期】-- 集合之Set
- java课设--简单的学生成绩管理系统(可视化界面,连接MYsql数据库)
- 面向工业智能制造的组态系统设计思路与实现
- 地理信息系统(GIS)系列——绪论
- 瑞芯微RK3128盒子刷机提示测试设备失败的解决方法:MASKROM模式
- 【180927】坦克大战游戏源码