Androidフル埋め込みソリューション-認識
4977 ワード
Androidフル埋め込みポイントイベント転送メカニズム:onTouchEventメソッド戻り値 true:消費今回のイベント false:消費しないイベント、イベントは に伝達されます.
埋め込みイベント プログラム起動 プログラム終了 ページブラウズ クリックイベント 処理ロジックをブロックする方法 androidイベント処理メカニズム 埋め込みコードロジックの挿入方法 コンパイラ対コードの処理 埋点原理:イベントブロック、イベント前後挿入埋点論理コード 埋点方式 静的エージェント:gradle pluginコンパイル期間挿入コード 動的エージェント:実行中のview.onclickコールバック Android view埋め込みポイント クリック可能コントロール【button】 スライド可能コントロール【seekbar】 選択コントロール【checkBox】 バインドlistener方式 button.setOnClickListener xmlファイル内android:onclickプロパティ サードパーティコントロール注記バインドbutterknif 0、埋め込み点初期化 アプリケーションでonCreateが を初期化アプリケーションはxmlファイルで構成する を覚えています.
1、ページブラウズ埋め込みAppViewScreen activity、fragment切替によるライフサイクルコールバック activity lifecycle callbacks このコールバックには の登録が必要である. activityライフサイクルコールバック のリスニング現在実行中のactivityインスタンス を取得 activityがフロントにあるかバックグラウンドにあるか判断する 埋点収集 activity名称【パッケージ名+クラス名】 activityのtitle も追加
完備 が実際に使用されるたびに、アクセス権 がチェックされます.
2、Appフロント、バックグラウンド埋め込みポイント 判断方式 runningtask runningProcess activitLifecycleCallback【onstart -》onPause】 usageStatsManager バリアフリーサービス /procディレクトリの下の情報 android間プロセス通信 AIDL【一対多並列】 Messager【一対のマルチシリアル】 Bundle【基本データ型、シーケンス化対象】 ContentProvider【Binderメカニズム】 BroadcastReceiver ファイル共有 Socket
startイベントとendイベントトリガ:セッション期間 を設定できます.の欠点 プログラムクラッシュendイベントは、次回の起動時に を補充する必要があります.プログラムアンインストール、endイベント損失
3、イベント埋め込みポイントをクリック キーテクノロジー:android.R.id.content 旧バージョンとはActionBarの次の部分 を指す.の新しいバージョンにはActionBar が含まれる場合があります.
原理:【onclickListenerに基づく埋込み点】 アプリケーションではonCreateが埋め込み点SDKを初期化し、アプリケーション に転送する. r e gisterActivitylifecycleCallback登録ライフサイクルコールバック方法【activityライフサイクルの監視】 現在のactivityインスタンスを取得し、対応するコントロールを見つけ、クリック可能属性 が設定されているかどうかを判断する.エージェントクリックイベントは,まず元のクリックイベントを実行し,さらに埋め込みイベント を実行する.欠点:menuitemクリックイベント を収集できない解決:DecorView導入 【Decorviewベース】 DecorView->LinearLayout->FrameLayout/FrameLayout menuItem:activityを取得getWindow().getDecorView() 欠点:onResumeライフサイクルを取得できない後にviewを作成するクリックイベント 解決:viewTreeObserver.OnGlobalLayoutListener参照 【viewTreeObserver.OnGlobalLayoutListenerベース】ビューツリーが変化すると傍受され、onGlobalLayoutがコールバックされ、このときエージェントクリックイベント[上記] を再遍歴する.推奨:ページ終了時remove onGlobalLayoutのリスニングイベント 欠点:反射、ダイナミックエージェントの効率が低い【window.Callbackベース】 activityインスタンス を取得 windowを手に入れます.callbackオブジェクト【カスタムエージェントこのオブジェクト】 この方法におけるイベント配信方法dispatchTouchEvent挿入埋め込み点 dispatchTouchEventのパラメータMotionEventによりクリックされたviewオブジェクトを検索する【処理イベントタイプ:押す、持ち上げる】 欠点: クリックするたびにRootView を巡回する必要があります API 15+は をサポートする Activity LifecycleCallbacks API 14+サポート activity以外のコントロールを採集できない【dialog、popupwindow】
【View.AccessobilityDelegateベース】アシストツール、視覚、聴覚障害 viewが クリックされましたは、既存のクリック傍受イベント を先に呼び出す.再呼び出しaccessbilityDelegate **欠点:**手動で設定をオンにする必要がある->アクセシビリティ
4、タッチイベント埋め込みポイント 透明層 各activityの最上位層には透明なviewが覆われている(activityに透明な層を追加する方法を実現する) .クリックイベントが発生すると が先に受け入れられる. onTouchEventを書き換え、superを呼び出す前に座標情報 を判断する. rootviewで実際にクリックされたviewオブジェクト を検索する既存のonclickで論理を処理し、埋め込みコード を挿入する.
5、Aspectj埋点【AOP】 問題:埋め込み点のコードへの侵入性は、非侵入性 を使用する必要がある.解決:Aspectj AOPツール 原理:classファイル生成後、dexファイル生成前にaspectjに適合する接点を見つけ、埋め込み点コード【コンパイル中にコードをターゲットプログラムに挿入-】キーはajcコンパイラ】 aspectj実装手順 織り込みポイント@Pointcut(織り込み方法を指定) call転入点:織り込みコードは方法前後 に現れる. execute実行ポイント:織り込みコードがメソッドに表示される 織り込みコード@Before、@After、@Around【埋込みコード】 切面向けプロファイル【クラス】@Aspect コンパイル生成pluginプラグインは を併用する必要がある.
欠点:採集できないクリックイベント butterknife@onClickバインドイベント android:onclickバインドイベント menuitemイベント onclickListennerでlambda構文を使用したイベント
6、ASM【バイトコード操作と分析フレームワーク】 原理:.classファイルを.dexファイルの前に埋め込みコードの挿入を行います【classファイルで挿入位置を見つけることによって】 バイトコード挿入杭 コード注入 カスタムgradle plugin
7、Javassist ClassPool
8、AST 注記プロセッサ【Javacのツール】 Elementオブジェクト【Element配列】 9、その他 動的エージェント・テクノロジー Java Proxy ASM AspectJ javassist
まとめ:最終的な実現はまだ.calssファイルと.dexファイル間でコードの注入を行うのが理想的です.
Java Proxyダイナミックエージェント技術を起点として、次に各種ダイナミック技術を深く学習する【すなわち.class->.dex間でコード挿入技術を行う】
.java->.class->.dex
setContentView(view) view
【View.AccessobilityDelegateベース】アシストツール、視覚、聴覚障害
まとめ:最終的な実現はまだ.calssファイルと.dexファイル間でコードの注入を行うのが理想的です.
Java Proxyダイナミックエージェント技術を起点として、次に各種ダイナミック技術を深く学習する【すなわち.class->.dex間でコード挿入技術を行う】