Android埋點統計這個大家應該都再熟悉不過了。GoogleAnalytics,Umeng等等,大家可能用各個方案的都有。這些方案都非常優秀,但在借助這些方案的時候免不了要手動做一些特殊統計打點,為了解決要手動打點的問題,又出現了很多無埋點方案。總結下公開資料能搜到的無埋點方案基本逃不出這幾種模式:
1、打點統計基本都是統計用戶點擊之類的事件,那么利用Gradle插件編譯期自動改代碼,或者所有View全部自定義,從自定義View攔截事件,或者從dispatchTouchEvent分析等等。
2、Hook虛擬機,類似阿里的熱修復,從Xposed找到靈感Hook虛擬機。
上面幾種方式都是從App本身入手去解決問題。最終的是通過App集成jar包實現。最近也在研究無埋點,項目需求是希望實現一個比較簡單好用的無埋點,最好是以服務形式存在,甚至是從目標App里脫離出來。粗看要從目標App獨立出來,而且還要統計目標App的各種用戶數據,這怎么可能實現?其實可以實現。
Android里有個特殊的功能叫:無障礙服務。詳細的可以參考Google官方文檔。https://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
這一大堆文檔,頭大,這東西干嘛用的呢?簡單說就是幫助那些在使用Android設備時候會有障礙的用戶,更加容易的使用Android。最簡單的例子,大家在平時開發的時候有注意過在使用ImageView的時候,lint會給這樣一個警告:
[Accessibility] MissingcontentDescription attribute on image [less...](#lint/ContentDescription)
點開會有詳細的解釋。簡單解釋就是,ImageView需要添加ContentDescription,做什么用呢?因為有視力障礙的用戶會無法看到ImageView的內容,所以為了幫助這部分用戶一樣可以使用設備,需要加一個內容描述,這個描述可以被內容閱讀器以聲音的形式朗讀出來,這樣就可以幫助到視力有障礙但是聽力正常的朋友使用設備了。
舉個例子,假如我雙手殘疾了,那我是無法觸摸屏幕的,那么我可以通過聲音來控制手機。(Google有個叫VoiceAccess的軟件,有興趣的可以下載試試。另外還有一個叫Accessibility Scanner的軟件輔助開發者進行無障礙適配的,有興趣的也可以下載試試。)
說了這么多,其實就一句話:可以利用無障礙服務來獲取所有的屏幕交互事件,然后實現無埋點統計。
這是一個單獨的apk,實際統計到了我對微信的一些操作。當然實際AccessibilityService服務可以獲取的信息非常多,基本上只要是界面可見的交互數據都可以獲取到,這里只是示例把Click事件顯示出來了。
注意這種方式連H5頁面也一樣支持統計
具體AccessibilityService實際代碼這里就不貼了,非常簡單,大家搜下會有非常多文章介紹怎么使用這個服務。
最后總結下利用這種方式實現的交互統計的優缺點。
優點:
1、可以統計到任何頁面可見的交互
2、可以做到真正的無埋點
3、可以統計任意App,對方App不需要做任何處理(例如:不需要集成jar包)
4、一個進程服務可以實現對所有App的統計
5、支持H5頁面
6、可以做到完全動態打點(注意這里可以做到完全動態的打點,從AccessibilityService接受到的是一個AccessibilityEvent,我們完全可以把對AccessibilityEvent的解析,在服務端動態定義。比如:需要統計哪些包,統計哪些事件等等。)
缺點:
1、需要用戶手動打開無障礙服務,增加了使用成本,無障礙服務權限非常大,用戶極有可能會拒絕開啟
2、因為相當于是獨立于apk之外的服務,所以無法拿到進程共享數據(例如無法統計Crash)
3、不能跨平臺。這種實現方式只能在Android生效,iOS不行
4、一些非可視化數據統計不到,比如前面的Chrome點擊打開分鍋大會,這里暗含的數據是分鍋大會的URL,但通過AccessibilityService不能拿到這里的URL。