Androidフル埋め込みソリューション-認識

4977 ワード

Androidフル埋め込みポイント
  • イベント転送メカニズム:onTouchEventメソッド戻り値
  • true:消費今回のイベント
  • false:消費しないイベント、イベントは
  • に伝達されます.
  • 埋め込みイベント
  • プログラム起動
  • プログラム終了
  • ページブラウズ
  • クリックイベント
  • 処理ロジックをブロックする方法
  • androidイベント処理メカニズム
  • 埋め込みコードロジックの挿入方法
  • コンパイラ対コードの処理.java->.class->.dex
  • 埋点原理:イベントブロック、イベント前後挿入埋点論理コード
  • 埋点方式
  • 静的エージェント: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 setContentView(view) view
  • 旧バージョンとは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間でコード挿入技術を行う】