中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android無埋點的技術選型之路

發布時間:2020-07-07 02:03:02 來源:網絡 閱讀:1156 作者:YY強 欄目:移動開發

數極客是國內新一代用戶行為分析平臺,支持無埋點采集,前端代碼埋點采集,后端代碼埋點采集等多種混合數據采集方式,支持30多種數據可視化效果,是增長***必的備大數據分析工具,支持APP分析數據網站分析及用戶畫像,獨創了6大轉化率分析模型,的英文用戶行為分析領域首家應用定量分析與定性分析方法的數據分析產品,運用數極客用戶行為錄屏系統,可以分析并優化用戶體驗的細節,基于用戶行為分析系統- ,了提供會員營銷系統-?A / B測試工具兩大數據智能應用解決方案,企業使得可以快速的實現數據驅動增長。
歡迎關注數極客微信公眾號:shujujike,更全面的獲取無埋點及用戶行為大數據分析的要點。
原創作者:楊永強數極客技術合伙人

概述
無埋點也叫全埋點、自動埋點,無埋點就是指不需要開發人員添加任何代碼,就可以實現數據的采集。
換句話說也就是在我們需要采集數據的位置插入采集數據的代碼,而這個插入采集代碼的過程不需要我們手動去添加,而是自動實現插入,這就是無埋點。
用戶行為數據,就是用戶在操作app的過程中產生的行為,比如 打開頁面 / 關閉頁面 / 瀏覽頁面 / 點擊按鈕 /退出后臺 / 返回前臺 等事件,這些行為事件連起來就能組成一個用戶的行為事件鏈條,這個鏈條可以理解為這個用戶的行為數據。

目錄
一 、技術方案對比
1.1?幾種無埋點實現方案介紹
1.2?處理時機對比
1.3?優缺點對比
二、實現ASM方案的準備知識
2.1 什么是AOP
2.2 gradle plugin的實現
2.3 Android app的編譯過程
2.4 ASM介紹
三、?ASM方案實現方法
3.1實現gradle plugin
3.2通過ASM實現hook代碼
3.3根據業務邏輯實現自己的SDK代碼
四、總結

一 、技術方案對比
1.1?幾種無埋點實現方案介紹
在做無埋點技術選型時,我們對以下幾種主流Android 無埋點方案進行對比:
AspectJ 方案
Aspectj 是它有一套自己的Java編譯器,當我們用這個編譯器進行編譯時Aspectj會根據自己的方式進行代碼插入,從而實現在編譯期間插入埋點代碼。
可參考:
利用AspectJ實現Android端非侵入式埋點
AspectJ in Android (一),AspectJ 基礎概念
AspectJ in Android (二),AspectJ 語法
AspectJ in Android (三),AspectJ 兩種用法以及常見問題

AST 方案
當IDE對項目code進行編譯時,最先進行的是對源代碼進行編譯從而生成 .java 文件。
此方案就是利用這個時機,通過自定義注解器(APT)來切入我們需要插入代碼的點,再通過AST的語法來插入埋點代碼。
可參考:
Android AOP 抽象語法樹
基于AST的組件化自動插樁方案

Javassist 方案
在Android app編譯的過程中,.class 最終會轉換為 .dex 文件,gradle 在編譯的過程中 允許開發人員通過gradle plugin來修改class文件。這樣就可以利用 Javassist 來修改 .class 字節碼文件,從而實現插入埋點代碼的目的。
可參考:
Javassist 使用指南 1?
Javassist 使用指南 2

ASM? 方案
ASM和 Javassist 原理基本一樣,只是在操作.class 文件時用的是ASM。
本文將主要介紹此種方式。

1.2?處理時機對比
Android無埋點的技術選型之路

1.3?優缺點對比
Android無埋點的技術選型之路

AspectJ 功能非常強大,使用起來也很方便,但是其不支持三方庫的修改,所以果斷放棄。
AST 對于不了解語法樹 /注解 這些相對晦澀的知識點的不建議使用,后期維護起來非常不便,遂放棄。
Javassist 和 ASM兩者原理基本一樣,只是在后期操作字節碼時 ASM 比 Javassist性能更好,因為javassist用到反射,所以性能上有犧牲。ASM是非常底層的,操作起來難度大,但是性能非常優秀。作為三方SDK,對源代碼的侵入程度和性能要求非常嚴格,所以最終選擇ASM方案。

二、實現ASM方案的準備知識
2.1 什么是AOP
AOP 面向切向編程(Aspect Oriented Programming)與之對應的是OOP(ObjectOriented Programming)面向對象編程。
也可以自行Google,不再贅述。
2.2 gradle plugin的實現
Android Gradle Plugin 版本在1.5.0及以上,Google 官方提供了可以通過實現Plugin<Project> 接口,來實現編譯成dex文件之前來修改.class 文件。
2.3 Android app的編譯過程
Android無埋點的技術選型之路

2.4 ASM介紹
ASM是一個java字節碼操縱框架,它能被用來動態生成類或者增強既有類的功能。ASM 可以直接產生二進制 class 文件,也可以在類被加載入 Java 虛擬機之前動態改變類行為。
ASM相關可以參考:ASM 開發指導
三、?ASM方案實現方法
3.1實現gradle plugin
實現Plugin<Project>接口
Android無埋點的技術選型之路
繼承 Transform?
Android無埋點的技術選型之路
對于transform API 不熟悉的可以查看API。
最核心的代碼就是遍歷所有的class文件
Android無埋點的技術選型之路
3.2通過ASM實現hook代碼
在ASM的核心實現中,它主要有以下幾個類、接口(在org.objectweb.asm包中)。
Cla***eader類:字節碼的讀取與分析引擎。它采用類似SAX的事件讀取機制,每當有事件發生時,調用注冊的ClassVisitor、AnnotationVisitor、FieldVisitor、MethodVisitor做相應的處理。
ClassVisitor接口:定義在讀取Class字節碼時會觸發的事件,如類頭解析完成、注解解析、字段解析、方法解析等。
AnnotationVisitor接口:定義在解析注解時會觸發的事件,如解析到一個基本值類型的注解、enum值類型的注解、Array值類型的注解、注解值類型的注解等。
FieldVisitor接口:定義在解析字段時觸發的事件,如解析到字段上的注解、解析到字段相關的屬性等。
MethodVisitor接口:定義在解析方法時觸發的事件,如方法上的注解、屬性、代碼等。
ClassWriter類:它實現了ClassVisitor接口,用于拼接字節碼。
AnnotationWriter類:它實現了AnnotationVisitor接口,用于拼接注解相關字節碼。
FieldWriter類:它實現了FieldVisitor接口,用于拼接字段相關字節碼。
MethodWriter類:它實現了MethodVisitor接口,用于拼接方法相關字節碼。
SignatureReader類:對類定義、字段定義、方法定義、本地變量定義的簽名的解析。Signature因范型引入,用于存儲范型定義時的元數據(因為這些元數據在運行時會被擦除)。
SignatureVisitor接口:定義在解析Signature時會觸發的事件,如正常的Type參數、類或接口的邊界等。
SignatureWriter類:它實現了SignatureVisitor接口,用于拼接范型相關字節碼。
Attribute類:字節碼中屬性的類抽象。
ByteVector類:字節碼二進制存儲的容器。
Opcodes接口:字節碼指令的一些常量定義。
Type類:類型相關的常量定義以及一些基于其上的操作。
Android無埋點的技術選型之路
參考:?ASM 源碼解析? ,http://www.blogjava.net/DLevin/archive/2014/06/25/414292.html

步驟
1.通過Cla***eader 讀取class 文件
2.通過ClassWriter來修改class 文件,修改時需要用到ClassVisitor /MethodVisitor來訪問class 內部的成員 方法,再通過相關API來插入埋點代碼
Android無埋點的技術選型之路
3.3根據業務邏輯實現自己的SDK代碼
當hook成功后,剩下的就是自己根據業務邏輯去實現相關代碼,此處不贅述。
四、總結
本文是從宏觀上介紹無埋點的幾種技術,和ASM的實現思路,希望能對無埋點有一個全局的認識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海城市| 西畴县| 汉中市| 县级市| 司法| 思南县| 东兰县| 图们市| 辽源市| 外汇| 洪江市| 噶尔县| 静海县| 武隆县| 富顺县| 华亭县| 洪泽县| 秭归县| 曲水县| 达孜县| 香格里拉县| 婺源县| 靖西县| 马山县| 宝应县| 绥棱县| 阿拉善左旗| 赤壁市| 沭阳县| 盐池县| 田林县| 桐庐县| 奎屯市| 会昌县| 延吉市| 务川| 含山县| 桃江县| 临江市| 聊城市| 涿州市|