Android全埋点案の調査
4347 ワード
1業界内の全埋点技術方案の調査研究
調査記事リンク:網易雲音楽Android自動埋点実践 網易HubbleDataのAndroid無埋点実践 58埋め込み点のないデータ収集技術Android側で を実践 51クレジットカードAndroid自動埋め込み実践 美団無埋点案-Gradle Pluginの方式は、コンパイル中にclass を修正する.
1.1データ処理プロセスデータ収集 データレポート データストア データ分析 データ展示 1.2現状、痛点
主にコード埋め込み方式を用いてデータ収集を行い、コード埋め込みとは、あるイベントが発生したときに予め書かれたコードを通じてデータを送信し、事前符号化に基づいて実現されたコード埋め込み点を指し、その利点は、制御が正確で、収集の柔軟性が強く、いつどのようなデータを送信するかを自由に選択できることである.しかし、欠点も同様に明らかで、開発、テストコストが高く、クライアントにとってオンラインの埋め込みポイントを修正するにはリリースを待つ必要がある.
1.3業界状況
全埋め込み点は、埋め込み点がないか、痕跡のない埋め込み点とも呼ばれ、端でできるだけ多くのデータを自動的に収集して報告し、計算時に利用可能なデータをフィルタリングする.その利点は、開発、テストの重複労働を大幅に減らし、データを遡ることができ、全面的である.欠点は、情報収集が柔軟ではなく、データ量が大きいことです.
可視化埋め込みポイントは、可視化ツールによって収集する必要がある埋め込みポイントデータを選択し、クライアントに送信し、構成を解析して対応する埋め込みポイントを収集する方法である.その利点は:開発、テストの重複労働を大幅に減らし、データ量を制御でき、オンラインで動的に埋め込み点配置を行うことができ、Appのリリースを待つ必要がない.その欠点は,情報収集が柔軟でなく,データ遡及の問題を解決できないことである.
1.4全埋点
ページ、コントロールなどの要素に対してそのIDを生成する必要があり、このIDはできるだけ『一意性』と『安定性』を備えなければならない.「一意性」はよく理解されています.任意の要素にとって、そのIDは他のすべての要素とは異なるはずです.そうすれば、IDに基づいて私たちが望んでいる要素を一意に識別することができ、収集したデータが正確で、重複しません.「安定性」とは、エレメントのIDがバージョンの変更を受けないようにすることで、後期関連業務の意味の操作が容易になるということです.
1.4.1ページIDルールクラス名(51クレジットカード方式)Activity,IDルール .ページclassフルパス(58同城) 1.4.2コントロールID規則
1.4.3コード杭挿入方式 Javassist+Transform(51クレジットカードスキーム) ASM+Transform(58同城、網易雲音楽) 1.4.4埋点方式 Gradleプラグインを用いて埋め込みコードを自動的に注入することを主とし、手動埋め込みポイントでデータのカスタマイズ補完を行う技術案を補完する.(58同城) H 5のログはJSPBridgeを介してNativeを呼び出し,Nativeによってバックエンドに一括してログ情報を送信する.
2 Androidフル埋め込み実現案概要
2.1 AppViewScreen(ページ参照)
登録
2.2 AppStart、AppEnd(現在のアプリケーションはフロントまたはバックグラウンド)
登録
フロントかバックグラウンドかを理解する:アプリケーションの場合、Appのページを開くとフロントでAppStartイベントがトリガーされ、そのページが終了したときにトリガーされ、30秒以内に新しいページが開かなければ、アプリケーションがバックグラウンドにあると判断し、AppEndイベントがトリガーされる
ページが終了すると(onPauseライフサイクル関数)、30秒カウントダウンが開始され、20秒以内に新しいページが入ってこない(または表示されている)とAppEndイベントがトリガーされます.新しいページが入ってくると、新しいページが入ってきたことをマークするタグビットが格納されます.ここで注意しなければならないのは、Activity間にプロセス間共有が存在する可能性があるため、タグビットがプロセス間共有を実現する必要がある場合、ContentProvider+SharedPreferencesで記憶し、ContentObserverで新しいページから入ってきたタグビットの変更を傍受し、前のページの終了時に起動したカウントダウンをキャンセルすることができることです.30 s以内に新しいページが入ってこない場合、ユーザーがHomeキーを押したり、戻るキーを押してアプリケーションを終了したり、アプリケーションがクラッシュしたり、アプリケーションが強殺されたりすると、AppEndイベントがトリガーされますが、アプリケーションがクラッシュしたり、アプリケーションが強殺されたりすると、AppEndイベントにタイムリーに触れることができず、ユーザーが次回起動するときにしか再発行できません.ユーザーが後でアプリケーションを起動しない場合は、AppEndイベントが失われます.
ページ起動時(onStartライフサイクル関数)、前のページからの終了間隔が30 sを超えているかどうかを判断し、30 sを超えていない場合はAppViewScreenイベントを直接トリガーする必要があります.30 sを超えている場合は、AppEndイベントが以前にトリガーされたかどうかを判断し、トリガーされていない場合はAppEndイベントを先にトリガーする必要があります.その後、AppStartイベントとAppViewScreenイベントがトリガーされます.
2.3 AppClick(コントロールクリック)
イニシアチブ
げんり
メリットとデメリット
エージェントOnClickListener/View.OnTouchListener
ビューをクリックしたmOnClickListener/mOnTouchListenerオブジェクトを反射で取得し、カスタムListenerエージェントを使用します.
反射を使用し、効率が低く、互換性のリスクがある.Activityの上にあるコントロール(Dialogなど)のクリックを取得できません
エージェントCallback
カスタムウィンドウでCallbackエージェントシステムの
クリックするたびにRootViewを巡回する必要があり、効率が低く、性能に影響を与える.Activityの上にあるコントロール(Dialogなど)のクリックを取得できません
エージェントAccessibilityDelegate
カスタムビューでAccessibilityDelegateエージェントシステムの
反射を使用し、効率が低く、互換性のリスクがある.Activity上に遊離したコントロール(Dialogなど)のクリックを採取できません.補助機能はユーザーが手動で開く必要がある
とうめいそう
すべてのActivityの最上位レベルに透明なView書き換えonTouchEventを追加してViewエージェントmOnClickListenerを取得
クリックするたびにRootViewを巡回する必要があり、効率が低く、性能に影響を与える.Activityの上にあるコントロール(Dialogなど)のクリックを取得できません
AspectJ
コンパイル期間埋め込みコードの挿入
三方庫に織り込むことができません.互換性の問題;接点はプログラミング言語に依存する.Lambda構文の互換性がありません(最初の2つの欠点はaspectjxライブラリで解決されました)
ASM
コンパイル時にバイトコードを修正埋め込みコードを挿入
利点:小さくて速くて、操作が柔軟です;欠点:バイトコードについて一定の理解が必要
javassist
コンパイル時にバイトコードを修正埋め込みコードを挿入
利点:ソースレベルのAPI呼び出しで、バイトコードを理解する必要はありません.欠点:反射を使用して、性能はASMより低いです
AST
コンパイル期間操作AST修正ソースコード
APTは他のmoduleをスキャンできません.Lambdaはサポートされていません.com.sun.tools.javac.treeのAPIは理解が難しい
調査記事リンク:
1.1データ処理プロセス
主にコード埋め込み方式を用いてデータ収集を行い、コード埋め込みとは、あるイベントが発生したときに予め書かれたコードを通じてデータを送信し、事前符号化に基づいて実現されたコード埋め込み点を指し、その利点は、制御が正確で、収集の柔軟性が強く、いつどのようなデータを送信するかを自由に選択できることである.しかし、欠点も同様に明らかで、開発、テストコストが高く、クライアントにとってオンラインの埋め込みポイントを修正するにはリリースを待つ必要がある.
1.3業界状況
全埋め込み点は、埋め込み点がないか、痕跡のない埋め込み点とも呼ばれ、端でできるだけ多くのデータを自動的に収集して報告し、計算時に利用可能なデータをフィルタリングする.その利点は、開発、テストの重複労働を大幅に減らし、データを遡ることができ、全面的である.欠点は、情報収集が柔軟ではなく、データ量が大きいことです.
可視化埋め込みポイントは、可視化ツールによって収集する必要がある埋め込みポイントデータを選択し、クライアントに送信し、構成を解析して対応する埋め込みポイントを収集する方法である.その利点は:開発、テストの重複労働を大幅に減らし、データ量を制御でき、オンラインで動的に埋め込み点配置を行うことができ、Appのリリースを待つ必要がない.その欠点は,情報収集が柔軟でなく,データ遡及の問題を解決できないことである.
1.4全埋点
ページ、コントロールなどの要素に対してそのIDを生成する必要があり、このIDはできるだけ『一意性』と『安定性』を備えなければならない.「一意性」はよく理解されています.任意の要素にとって、そのIDは他のすべての要素とは異なるはずです.そうすれば、IDに基づいて私たちが望んでいる要素を一意に識別することができ、収集したデータが正確で、重複しません.「安定性」とは、エレメントのIDがバージョンの変更を受けないようにすることで、後期関連業務の意味の操作が容易になるということです.
1.4.1ページIDルール
ActivityClassName|
Fragment,IDルールActivityClassName[FragmentClassName]|
ID:
(51クレジットカード、網易、58同城)コントロールをクリックしてからコントロールツリーを巡り、ルートノードがコントロールパスFrameLayout[0]/LinearLayout[1]/Button[0]を決定するまで、ResourceIDをコントロールIDとして優先的に使用し、ResourceIDが存在しない場合、コントロールパスをコントロールIDとして降格させる.1.4.3コード杭挿入方式
2 Androidフル埋め込み実現案概要
2.1 AppViewScreen(ページ参照)
登録
Application.ActivityLifecycleCallbacks
リスニング、ActivityのライフサイクルonResume
でイベントをトリガー2.2 AppStart、AppEnd(現在のアプリケーションはフロントまたはバックグラウンド)
登録
Application.ActivityLifecycleCallbacks
傍受フロントかバックグラウンドかを理解する:アプリケーションの場合、Appのページを開くとフロントでAppStartイベントがトリガーされ、そのページが終了したときにトリガーされ、30秒以内に新しいページが開かなければ、アプリケーションがバックグラウンドにあると判断し、AppEndイベントがトリガーされる
ページが終了すると(onPauseライフサイクル関数)、30秒カウントダウンが開始され、20秒以内に新しいページが入ってこない(または表示されている)とAppEndイベントがトリガーされます.新しいページが入ってくると、新しいページが入ってきたことをマークするタグビットが格納されます.ここで注意しなければならないのは、Activity間にプロセス間共有が存在する可能性があるため、タグビットがプロセス間共有を実現する必要がある場合、ContentProvider+SharedPreferencesで記憶し、ContentObserverで新しいページから入ってきたタグビットの変更を傍受し、前のページの終了時に起動したカウントダウンをキャンセルすることができることです.30 s以内に新しいページが入ってこない場合、ユーザーがHomeキーを押したり、戻るキーを押してアプリケーションを終了したり、アプリケーションがクラッシュしたり、アプリケーションが強殺されたりすると、AppEndイベントがトリガーされますが、アプリケーションがクラッシュしたり、アプリケーションが強殺されたりすると、AppEndイベントにタイムリーに触れることができず、ユーザーが次回起動するときにしか再発行できません.ユーザーが後でアプリケーションを起動しない場合は、AppEndイベントが失われます.
ページ起動時(onStartライフサイクル関数)、前のページからの終了間隔が30 sを超えているかどうかを判断し、30 sを超えていない場合はAppViewScreenイベントを直接トリガーする必要があります.30 sを超えている場合は、AppEndイベントが以前にトリガーされたかどうかを判断し、トリガーされていない場合はAppEndイベントを先にトリガーする必要があります.その後、AppStartイベントとAppViewScreenイベントがトリガーされます.
2.3 AppClick(コントロールクリック)
イニシアチブ
げんり
メリットとデメリット
エージェントOnClickListener/View.OnTouchListener
ビューをクリックしたmOnClickListener/mOnTouchListenerオブジェクトを反射で取得し、カスタムListenerエージェントを使用します.
反射を使用し、効率が低く、互換性のリスクがある.Activityの上にあるコントロール(Dialogなど)のクリックを取得できません
エージェントCallback
カスタムウィンドウでCallbackエージェントシステムの
クリックするたびにRootViewを巡回する必要があり、効率が低く、性能に影響を与える.Activityの上にあるコントロール(Dialogなど)のクリックを取得できません
エージェントAccessibilityDelegate
カスタムビューでAccessibilityDelegateエージェントシステムの
反射を使用し、効率が低く、互換性のリスクがある.Activity上に遊離したコントロール(Dialogなど)のクリックを採取できません.補助機能はユーザーが手動で開く必要がある
とうめいそう
すべてのActivityの最上位レベルに透明なView書き換えonTouchEventを追加してViewエージェントmOnClickListenerを取得
クリックするたびにRootViewを巡回する必要があり、効率が低く、性能に影響を与える.Activityの上にあるコントロール(Dialogなど)のクリックを取得できません
AspectJ
コンパイル期間埋め込みコードの挿入
三方庫に織り込むことができません.互換性の問題;接点はプログラミング言語に依存する.Lambda構文の互換性がありません(最初の2つの欠点はaspectjxライブラリで解決されました)
ASM
コンパイル時にバイトコードを修正埋め込みコードを挿入
利点:小さくて速くて、操作が柔軟です;欠点:バイトコードについて一定の理解が必要
javassist
コンパイル時にバイトコードを修正埋め込みコードを挿入
利点:ソースレベルのAPI呼び出しで、バイトコードを理解する必要はありません.欠点:反射を使用して、性能はASMより低いです
AST
コンパイル期間操作AST修正ソースコード
APTは他のmoduleをスキャンできません.Lambdaはサポートされていません.com.sun.tools.javac.treeのAPIは理解が難しい