Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Xposed框架中創建模塊的指導手冊

Android Xposed框架中創建模塊的指導手冊

編輯:關於Android編程

當然,你可以去學習如何創建一個Xposed模塊。所以你可以閱讀這篇教程(官方教程)去學習怎樣解決這個問題。這不僅僅講解如何新建模塊、如何編寫模塊,我們要往更深處思考,為什麼按照這些步驟,為什麼要新建這個類。如果你是“TL博士”那樣的人,那麼可以直接閱讀"Making the project an Xposed module" 這一章節。如果你想看完整個教程那麼你需要很好的理解能力。你將會花費時間去閱讀這篇文章,因為你不能但靠自己解決任何的問題。   here)。綜觀類XposedBridge,你可以看到的main 方法。這就是我上面寫的,這個類會在進程啟動之前被調用。在那時候執行一些初始化和模塊的加載(我會在後面講解模塊的加載)。       這裡下載XposedBridgeApi-.jar 。把它復制到子文件夾名為lib目錄下。然後在其上單擊右鍵,選擇Build Path => Add to Build Path 。你需要將版本名插入到xposedminversion的聲明清單中。轉自       可以選擇庫引用的方式。但是確保你的API類被正確地編譯到APK文件中 ,否則你會得到一個IllegalAccessError 。通過引用libs 文件(有“s”),通過Eclipse的簡單設置可以不用把XposedBridgeApi-.jar 包含進去。   here )並且浏覽他。但這官方ROM可能與你的不一樣,但在這種情況下,它是一個類似甚至相同的實現。第一,我想看看AOSP,看看是否是一樣的。如果我需要更多的細節,看看實際的反編譯代碼。        你可以尋找與“時鐘”類名稱或包含該字符串的類。下一步就是,尋找他所使用的資源和布局。如果您下載了官方AOSP的代碼,就可以開始在這裡開始尋找:frameworks/base/packages/SystemUI 。你會發現不少地方出現“時鐘”。這是正常的,的確會有不同的方式來實現修改。請記住,你僅僅可以hook方法 。所以,你必須要找到一個可以在他之前、之後、或全部替換可以插入一些代碼的地方。你應該hook 住盡可能具體的方法,而不是那些會被調用上千次的方法,去避免性能問題和意想不到的副作用。    在這種情況下,您可能會發現這個layout布局res/layout/status_bar.xml 包含了一個自定義視圖類:com.android.systemui.statusbar.policy.Clock。多個想法可能會現在你的頭腦中。文字顏色的定義是通過textAppearance屬性,所以最簡單的方法就是改變它,將會改變外觀的定義 。然而,這可能有效也可能無效(因為它可能存在於更深的native 代碼中)。更換布局狀態欄將是可能的,但是你們只可以做最小的變化去更改他,相反,看看這個類。有一個叫updateClock方法,它看上去會被每分鐘調用去更新時間       看起來完美的修改,因為它是這似乎是唯一設置文本時鐘的非常具體的方法。假如我們改變了這個clock的顏色或者字體,那麼任何調用這個方法的都會受此影響。就達成我們的需求了,我們立刻行動.   (單獨的文本顏色,這裡有一種更好的方式.看到“修改布局”的例子在 "Replacing resources".)   helper 類的一個方法。請注意,它是靜態導入的,如果你配置了它描述的鏈接頁面就會自動添加 。此方法通過ClassLoader 在ClassLoader 包中查找Clock類 。然後,它會在裡面尋找updateClock方法。如果這種方法有任何參數,那你就必須列出這些參數的類型。不同的情況不一樣的處理,但我們的方法沒有任何參數,可以跳過這個假設。作為最後一個參數,你需要提供XC_MethodHook類的實現。對於較小的改動,就可以使用一個匿名類。如果你有太多的代碼,最好創建一個普通的類,只在這裡創建實例。隨後,helper 將盡一切方法hook住以上的函數。        你可以重寫XC_MethodHook的兩個方法。您可以同時覆蓋,甚至不做操作,但後者是完全沒有意義的。這兩個方法是beforeHookedMethod和afterHookedMethod。這不是太難猜測,這兩個方法會在原始的方法的之前和之後執行。您可以使用beforeHookedMethod 方法來評價/篡改方法調用的參數(通過param.args) ,甚至阻止調用原來的方法(發送自己的結果)。afterHookedMethod 方法可以用來做基於原始方法的結果的事情。您還可以用它來操縱結果 。當然,你可以添加自己的代碼,它將會准確地在原始方法的前或後執行。   (如果你想完全取代方法,看看子類XC_MethodReplacement相反,你只需要覆蓋replaceHookedMethod )   XposedBridge保留著一個記錄了每個已經hook了的函數的注冊回調函數 的列表。那些具有最高優先級(如hookMethod定義)會首先調用。原始方法始終是優先級最低的。所以,假如你hook了一個函數並注冊了回調A(PRIO高點)和B(PRIO默認值),那麼每當hook的方法被調用,控制流將是這樣的:A.before - > B.before - >原始的方法 - > B.after - > A.after。因此,A修改了的參數,B是可以看到的,這樣可以在傳遞給原始方法之前多步地改變它。原方法的結果首先會被B處理,但是這個原始方法最終返回的結果是由A來決定的。   九、最後一個步驟:執行自己的代碼在方法調用之前/之後    好了,你現在有一個每次updateClock 調用時,都會被調用的方法,而且可以精確到原始方法的前後(你已經在SystemUI 的進程裡面了)。現在,讓我們來修改一些東西。    首先要檢查:我們有沒有得到具體的時鐘對象?是的,我們有,它在param.thisObject參數裡。因此,如果該方法被myClock.updateClock()調用,然後param.thisObject將會使myClock這個對象。    下一步:我們可以做什麼用的時鐘?這個Clock 類是不可以利用的,你可以不轉換param.thisObject變成類(甚至不要去嘗試)。然而,它繼承自TextView的。所以,你可以使用像的setText,gettext和setTextColor的方法,一旦你已經把Clock引用映射成TextView。這些改變應該在原始方法調用後去設置新的時間。由於在方法調用前沒有事做,我們就不考慮 beforeHookedMethod。調用 (empty) "super" 方法是沒有必要的。所以不要重寫這方法。   這是完整的源代碼 :       十、對結果滿意    現在安裝/重新啟動您的應用程序。正如你在運行之前已經在XposedInstaller 啟用了它,你就不需要再來一次了,重新啟動就足夠了。不過,如果你想使用它停用這個紅色時鐘的例子。兩者都使用缺省的優先級給他們的updateClock處理程序,那麼你不知道哪一個會勝出(它實際上取決於處理方法的字符串表示形式,但並不依賴於此)。   十一、結論   我知道,這個教程很長。但我希望你現在不僅可以實現一個綠色的時鐘,還可以實現和這個完全不同的東西。找到好的方法來hook是一個經驗上的問題,所以開始的東西比較容易。嘗試剛開始就多使用日志功能去確保被調用的是預期的事件。現在:玩得開心!
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved