初始化分析

初始化主要做了以下几件事:

  1. 读取配置信息appId、channeId,既可通过代码设置appId、channelId,也可以在manifest中设置;如果两个都设置的话,优先以AndroidManifest.xml为主;

  2. 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. 数据中心液冷技术发展分析

    电力信息与通信技术,中国知网 | 来源 数据中心液冷技术发展分析 | 题目 王艳松1,张琦2,孙聪3,庄泽岩2,黄子轩2,翟天一4 | 作者 1国网北京市电力公司,2华为技术有限公司,3中国信息通信研 ...

  2. 赵英时遥感原理分析和应用课件_细数5种停车场防砸车技术原理分析与应用

    原标题:细数5种停车场防砸车技术原理分析与应用 一.压力波防砸装置 也叫遇阻防砸,主要是安装遇阻返回装置,当道闸杆下落过程中接触到车辆或者行人(接触力度是可以调节的),装置道闸杆底下的橡胶条受到阻力, ...

  3. 智能情绪分析技术_石化缘推荐:炼化企业智能机器人巡检技术应用前景分析!...

    本期内容由湖南天一奥星泵业有限公司冠名 炼化企业智能机器人巡检技术应用前景分析 王国彤1,孙秉才2,储胜利2,宋亚敏1(1.中国石油天然气股份有限公司大连石化分公司,辽宁省大连市:2.中国石油集团安全 ...

  4. 如何高效提高倾斜摄影三维模型顶层合并的技术方法分析

    如何高效提高倾斜摄影三维模型顶层合并的技术方法分析 1.倾斜摄影三维模型顶层合并 1.1倾斜摄影三维模型是一种基于倾斜摄影技术,通过多个角度拍摄同一区域的影像,利用计算机图像处理和三维重建技术生成的三 ...

  5. [DEV] 陷阱技术探秘 ──动态汉化Windows技术的分析

    "陷阱"技术探秘 ──动态汉化Windows技术的分析 四通利方(RichWin).中文之星(CStar)是大家广为熟知的汉化Windows产品,"陷阱"技术即 ...

  6. 陷阱技术探秘 ----动态汉化Windows技术的分析

    "陷阱"技术探秘 ──动态汉化Windows技术的分析 四通利方(RichWin).中文之星(CStar)是大家广为熟知的汉化Windows产品,"陷阱"技术即 ...

  7. 陷阱技术探秘 ──动态汉化Windows技术的分析

    "陷阱"技术探秘 ──动态汉化Windows技术的分析 四通利方(RichWin).中文之星(CStar)是大家广为熟知的汉化Windows产品,"陷阱"技术即 ...

  8. 射频识别技术原理分析

    射频识别技术原理分析 射频识别(RFID)技术相对于传统的磁卡及IC卡技术具有非接触.阅读速度快.无磨损等特点,在最近几年里得到快速发展.为加强中国工程师对该技术的理解,本文详细介绍了RFID技术的工 ...

  9. 2020清华计算机科学与技术录取分析总结

    声明:本文章首发于2020年清华大学计算机科学与技术录取分析,未经作者授权,禁止任何形式的的转载! 本文尽可能以一个客观的角度分析2020年被录取学硕同学的情况,以备参考. 2020年被录取计算机学硕 ...

  10. 抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建。

    前言:抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建. 抖音seo源码如何搭建?抖音seo排名优化系统软件部分源码分析,代码打包中... 场景:在 python 中,你可以使用 list[1 ...

最新文章

  1. (转)TabContainer要实现服务器端回传
  2. 领课网络在线教育系统开源项目
  3. c++中内敛函数_C++ 内联函数 | 菜鸟教程
  4. Docker Review - dockerfile 实战_给基础镜像增加功能
  5. 深大计算机科学与技术在广东省,广东考生请注意:深圳大学2021年计划本省总招生人数比例超过75%!...
  6. MYSQL返回指定时间间隔函数DATE_SUB和TO_DAYS详解
  7. 英特尔 开源降噪库 api_Google的新操作系统,英特尔的开源VR耳机以及更多新闻
  8. 计算机漏洞为什么无法避免,雷电3接口漏洞影响数百万计算机:5分钟解锁设备,无法修复...
  9. 还在用Json-lib?面对疾风吧!
  10. nodejs 使用的一些http网络请求模块
  11. 74cms代码执行漏洞
  12. 机器学习——专业名词
  13. 彻底解决联想手机数据连接不能上网问题(无需恢复出厂设置) 本文来自移动叔叔论坛 ,详细出处请参考:http://bbs.ydss.cn/thread-201115-1-1.html
  14. 三分钟带你详解SSL认证与加密技术
  15. java基础知识【第12期】-- 集合之Set
  16. java课设--简单的学生成绩管理系统(可视化界面,连接MYsql数据库)
  17. 面向工业智能制造的组态系统设计思路与实现
  18. 地理信息系统(GIS)系列——绪论
  19. 瑞芯微RK3128盒子刷机提示测试设备失败的解决方法:MASKROM模式
  20. 【180927】坦克大战游戏源码

热门文章

  1. LM4766T/NOPB小秘密
  2. 分享 : 微软Kinect初体验
  3. php编写解一元一次方程,一元一次方程及解法
  4. YARN : FairScheduler深入解析(队列维护,demand、fair share计算)
  5. PV-RCNN:Point-based与Voexl-based共同成就的高性能3D目标检测网络
  6. 基于Linux的智能聊天与控制设计(毕业设计总结)
  7. 系统安全性分析与设计
  8. unity中向量夹角
  9. 加盟店 -- 祖坟刨干记
  10. java中常用的摘要算法