本篇文章主要介紹Android移動(dòng)端埋點(diǎn)的作用以及埋點(diǎn)發(fā)展铃剔,順帶加一點(diǎn)埋點(diǎn)技術(shù)分析檀葛。
埋點(diǎn)是什么
在應(yīng)用中通過(guò)特定的流程收集一些信息麦备,用來(lái)跟蹤應(yīng)用使用的狀況逃默,并作為優(yōu)化產(chǎn)品或者提供運(yùn)營(yíng)的數(shù)據(jù)支撐。
移動(dòng)端埋點(diǎn)可以收集到的數(shù)據(jù)
- 手機(jī)基礎(chǔ)數(shù)據(jù)(手機(jī)型號(hào)搓彻、版本如绸、網(wǎng)絡(luò)、瀏覽器版本等)
- 用戶(hù)相關(guān)數(shù)據(jù)(年齡旭贬、性別怔接、職業(yè)、行業(yè)稀轨、喜好等)
- 渠道相關(guān)數(shù)據(jù)
- App質(zhì)量和性能相關(guān)數(shù)據(jù)
埋點(diǎn)是用來(lái)做什么的
- 檢測(cè)運(yùn)營(yíng)狀況
- 市場(chǎng)趨勢(shì)反映
- App錯(cuò)誤和缺陷的及時(shí)發(fā)現(xiàn)
- 交互視覺(jué)效果分析
上面弄清楚了移動(dòng)端埋點(diǎn)的作用和數(shù)據(jù)統(tǒng)計(jì)的維度扼脐,下面說(shuō)說(shuō)如何在代碼中加入這些統(tǒng)計(jì)
代碼埋點(diǎn)
最原始最簡(jiǎn)單的方法是,我們寫(xiě)一堆統(tǒng)計(jì)App數(shù)據(jù)的接口奋刽,然后封裝成sdk瓦侮,集成進(jìn)App中,App任何地方需要統(tǒng)計(jì)任何數(shù)據(jù)佣谐,則在代碼的任何地方埋入接口肚吏,并傳入相應(yīng)的數(shù)據(jù),一般大家叫這種埋點(diǎn)為代碼埋點(diǎn)狭魂。
這種埋點(diǎn)的優(yōu)點(diǎn)很明顯:可以統(tǒng)計(jì)任何維度的數(shù)據(jù)罚攀,而且統(tǒng)計(jì)很精準(zhǔn);但缺點(diǎn)也很明顯:具有版本兼容問(wèn)題(新統(tǒng)計(jì)的數(shù)據(jù)只能在新版本加入接口統(tǒng)計(jì)雌澄,舊版本沒(méi)有數(shù)據(jù))坞生,破壞代碼結(jié)構(gòu)(很多設(shè)計(jì)好的模塊為了傳入一些埋點(diǎn)數(shù)據(jù)需要修改代碼),工作量太大(每個(gè)版本都要為埋點(diǎn)付出大量人力)掷伙。
為了克服代碼埋點(diǎn)的缺點(diǎn),勤(懶)勞(惰)的程序員們發(fā)揮自己的想象力又兵,so任柜,埋點(diǎn)又進(jìn)化了。
無(wú)痕埋點(diǎn)(全埋點(diǎn))
代碼埋點(diǎn)不是工作量大沛厨?不是每個(gè)版本都要埋入代碼么宙地?不是破壞代碼結(jié)構(gòu)么?在無(wú)痕埋點(diǎn)這些問(wèn)題通通不叫事逆皮,一行代碼都不需要寫(xiě)(當(dāng)然是在吹牛)宅粥,數(shù)據(jù)就統(tǒng)計(jì)上去了。
究竟什么叫無(wú)痕埋點(diǎn)呢电谣?通俗點(diǎn)說(shuō)就是加入一些配置秽梅,然后某些控件做一些改動(dòng)抹蚀,就可以自動(dòng)統(tǒng)計(jì)上報(bào)數(shù)據(jù)了(實(shí)現(xiàn)技術(shù)后面談)。
無(wú)痕埋點(diǎn)的優(yōu)點(diǎn)是:無(wú)版本兼容問(wèn)題(應(yīng)該每個(gè)版本統(tǒng)計(jì)的數(shù)據(jù)都是一樣的企垦,不存在兼容問(wèn)題)环壤,不會(huì)破壞代碼架構(gòu)(不像代碼埋點(diǎn)那樣到處插入統(tǒng)計(jì)代碼了);當(dāng)然也有缺點(diǎn):可記錄的數(shù)據(jù)維度有限(基本只能記錄一些用戶(hù)交互數(shù)據(jù)钞诡,業(yè)務(wù)相關(guān)數(shù)據(jù)無(wú)法記錄)郑现,統(tǒng)計(jì)的數(shù)據(jù)量過(guò)大(無(wú)差別統(tǒng)計(jì)每個(gè)控件的相關(guān)交互操作事件,統(tǒng)計(jì)量過(guò)多)荧降。
以上關(guān)于無(wú)痕埋點(diǎn)的分析都基于開(kāi)發(fā)層面接箫,還有些基于運(yùn)營(yíng)層面的問(wèn)題,例如:上報(bào)的控件事件如何區(qū)分是哪個(gè)頁(yè)面的朵诫?后臺(tái)人員是否可以配置辛友?控件區(qū)分問(wèn)題由開(kāi)發(fā)和運(yùn)營(yíng)人員討論確定就行,配置問(wèn)題就涉及到無(wú)痕埋點(diǎn)的升級(jí)了拗窃。
可視化埋點(diǎn)
可視化埋點(diǎn)可以理解為無(wú)痕埋點(diǎn)的升級(jí)版瞎领,即可配置的無(wú)痕埋點(diǎn)=可視化埋點(diǎn);此實(shí)現(xiàn)策略主要通過(guò)調(diào)用服務(wù)器接口埋點(diǎn)配置數(shù)據(jù)随夸,根據(jù)這份配置九默,確認(rèn)需要上報(bào)的埋點(diǎn)數(shù)據(jù),規(guī)避了無(wú)痕埋點(diǎn)中上報(bào)很多垃圾數(shù)據(jù)問(wèn)題宾毒。
作為無(wú)痕埋點(diǎn)的升級(jí)版驼修,亦不能完全規(guī)避無(wú)痕埋點(diǎn)的缺點(diǎn)(譬如數(shù)據(jù)統(tǒng)計(jì)維度問(wèn)題),so诈铛,代碼埋點(diǎn)并沒(méi)有過(guò)時(shí)乙各,可視化埋點(diǎn)僅是埋點(diǎn)開(kāi)發(fā)過(guò)程中為了提升效率產(chǎn)生的一種方案。
下面簡(jiǎn)單談?wù)劅o(wú)痕埋點(diǎn)的實(shí)現(xiàn)原理幢竹。
無(wú)痕埋點(diǎn)實(shí)現(xiàn)
現(xiàn)在市面上的無(wú)痕埋點(diǎn)方案基本都是統(tǒng)計(jì)控件的點(diǎn)擊耳峦、長(zhǎng)按之類(lèi)的事件,統(tǒng)計(jì)方式基本分為動(dòng)態(tài)hook焕毫,靜態(tài)hook蹲坷;
- 動(dòng)態(tài)hook
在代碼中某個(gè)位置監(jiān)聽(tīng)所有控件的點(diǎn)擊、長(zhǎng)按相關(guān)事件邑飒,在事件里插入統(tǒng)計(jì)相關(guān)代碼循签;Android中會(huì)在Application中添加Activity的生命周期監(jiān)聽(tīng),即ActivityLifecycleCallbacks疙咸,在里面獲取相關(guān)Activity的RootView县匠,從RootView出發(fā)深度優(yōu)先遍歷控件樹(shù),為滿(mǎn)足特定條件的View設(shè)置代理監(jiān)聽(tīng),這里面主要涉及到幾個(gè)技術(shù)點(diǎn):View的唯一ID確定乞旦,F(xiàn)ragment生命周期問(wèn)題
1)ViewID
每個(gè)需要統(tǒng)計(jì)的View要確保ID是唯一的贼穆,不可變的,這樣才能讓后臺(tái)統(tǒng)計(jì)到的數(shù)據(jù)準(zhǔn)確杆查,為了做到這點(diǎn)扮惦,聰明的程序員們也是用盡手段:一種確定唯一ID方式為通過(guò)RootView路徑和View的Index來(lái)標(biāo)記ViewID(LinearLayout[0]#rootView/FrameLayout[0]/RelativeLayout[0]),一種是在代碼中給每個(gè)View確定一個(gè)唯一ID亲桦。兩種方案都可以解決問(wèn)題崖蜜,好壞不表,但這種設(shè)計(jì)方式碰到RecyclerView客峭、ListView之類(lèi)的列表View就可能會(huì)出現(xiàn)錯(cuò)誤了豫领,因?yàn)樗暮芏嘧覸iew都是復(fù)用,常規(guī)的唯一ID統(tǒng)計(jì)方案在這里不起作用舔琅,這時(shí)就要加入一些特殊標(biāo)記了等恐,比如在列表的每個(gè)子View的唯一ID加入在列表中的位置
2)Fragment生命周期
上面介紹到我們統(tǒng)計(jì)Activity中的控件是在Application中做的,但是Fragment的相關(guān)Application卻無(wú)法統(tǒng)計(jì)备蚓,這時(shí)候改如何辦呢课蔬?首先確定Fragment的生命周期,它的生命周期并不能簡(jiǎn)單的按照onCreate郊尝、onResume二跋、onDetory來(lái)決定,需要根據(jù)setUserVisibleHint流昏、onHiddenChanged來(lái)共同確定扎即,確定生命周期后,再把Fragment關(guān)聯(lián)到相關(guān)的Activity况凉,通過(guò)Activity就能調(diào)用到Fragment中的View了
- 靜態(tài)Hook
靜態(tài)hook則是在代碼編譯期在需要統(tǒng)計(jì)的地方插入相應(yīng)的統(tǒng)計(jì)代碼谚鄙,主要了解AbstractProcessor類(lèi)就好
以上僅介紹無(wú)痕埋點(diǎn)的大概實(shí)現(xiàn),以及所使用到的技術(shù)刁绒,若需使用到項(xiàng)目中還需更深入的研究闷营。
有人可能會(huì)問(wèn)這幾種埋點(diǎn)方式用哪種好?對(duì)一般的創(chuàng)業(yè)團(tuán)隊(duì)來(lái)說(shuō)知市,直接接第三方的埋點(diǎn)就可以傻盟,基本都是代碼埋點(diǎn)+可視化埋點(diǎn);當(dāng)然有能力的團(tuán)隊(duì)可以按需打造自己的埋點(diǎn)平臺(tái)初狰。