Xposed從入門到棄坑:一、Xposed初探

最近心血來(lái)潮躏尉,開始折騰xposed框架蚯根,xposed框架可以說(shuō)得上是款A(yù)ndroid系統(tǒng)God級(jí)別的開源hook框架,擁有非常高的權(quán)限胀糜,不過(guò)目前還暫不支持Android 7.0 以上的系統(tǒng)颅拦。這也是我一直沒(méi)有升級(jí)的原因

什么是xposed

Xposed框架是一款可以在不修改APK的情況下影響程序運(yùn)行(修改系統(tǒng))的框架服務(wù),基于它可以制作出許多功能強(qiáng)大的模塊教藻,且在功能不沖突的情況下同時(shí)運(yùn)作距帅。Xposed理論上能夠hook到系統(tǒng)任意一個(gè)Java進(jìn)程,由于是從底層hook括堤,所以需要root權(quán)限碌秸,并且每次更新都要重新啟動(dòng)
Xposed官方git上面有幾個(gè)開源項(xiàng)目,包括XposedInstaller悄窃、Xposed哮肚、XposedBridgeXposedTools广匙,這里就不具體介紹了允趟,感興趣的可以查找相關(guān)資料,附上官方git地址:https://github.com/rovo89

Xposed模擬器環(huán)境搭建

由于Xposed項(xiàng)目每次安裝都要重新啟動(dòng)鸦致,在真機(jī)上是非常耗時(shí)間的潮剪,所以在這里選擇Genymotion模擬器涣楷,老版本的Genymotion模擬器有免費(fèi)版本的,我提供一款mac版的模擬器抗碰。win自己百度下載狮斗,mac版下載地址:https://pan.baidu.com/s/1pLDbymn ,密碼:j3rf弧蝇。鏡像選擇Android5.0系統(tǒng)碳褒,其他版本類似。然后到官網(wǎng)下載Android5.0對(duì)應(yīng)的框架看疗,飛機(jī)直達(dá)沙峻,選擇.zip結(jié)尾的文件,下載完成后運(yùn)行模擬器两芳,將zip包拖到模擬器界面刷入即可摔寨,完成后重啟模擬器。安裝XposedInstaller_3.1.1 .apk應(yīng)用怖辆,再次重啟是复。進(jìn)入剛剛安裝的app,提示已激活即安裝成功

第一個(gè)項(xiàng)目

創(chuàng)建Xposed工程

為了方便今后的教程竖螃,工程已傳到github淑廊,可以直接clone該工程到本地。項(xiàng)目地址:https://github.com/WrBug/XposedDemo ,后面的教程的代碼也都將在這個(gè)工程里面特咆,通過(guò)clone的可忽略下面創(chuàng)建工程的步驟蒋纬。通過(guò)命令切換到提交:

git checkout 20195ce

創(chuàng)建一個(gè)新工程,build.gradle添加依賴:
provided 'de.robv.android.xposed:api:82'
編輯AndroidManifest.xml坚弱,添加:

     <meta-data
            android:name="xposedmodule"
            android:value="true"/>
        <meta-data
            android:name="xposeddescription"
            android:value="hello xposed"/>
        <meta-data
            android:name="xposedminversion"
            android:value="82"/>

配置完成后,安裝到模擬器关摇,狀態(tài)欄彈出如下提示:

第一個(gè)框架:Hello Xposed

git提交:43e4ba39e95988f0fa699ad5eddb1e55b9613638

Activity創(chuàng)建

編輯activity_main.xml荒叶,放入一個(gè)TextView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.wrbug.xposeddemo.MainActivity">

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
</LinearLayout>

MainActivity 里面設(shè)置文本信息:

public class MainActivity extends AppCompatActivity {
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textview);
        textView.setText("WrBug");
    }
}

Activity很簡(jiǎn)單。就是一個(gè)textview的顯示输虱。安裝到模擬器上些楣,界面顯示一行WrBug,下面通過(guò)xposed將WrBug修改成Hello Xposed顯示宪睹。
思路:Xposed hook onCreate方法愁茁。在該方法執(zhí)行完后獲取TextView的實(shí)例。通過(guò)setText方法設(shè)置文本

Xposed實(shí)現(xiàn)

新建一個(gè)類XposedInit實(shí)現(xiàn)IXposedHookLoadPackage亭病,關(guān)于IXposedHookLoadPackage等接口鹅很,后面的文章會(huì)有說(shuō)明。

public class XposedInit implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam){
        //app啟動(dòng)時(shí)調(diào)用
    }
}

新建assets文件夾罪帖,文件夾下新建xposed_init文件促煮,編輯文件邮屁,填寫XposedInit的完整包名:com.wrbug.xposeddemo.XposedInit
在XposedInit中handleLoadPackage方法會(huì)在應(yīng)用啟動(dòng)時(shí)調(diào)用。所以需要篩選需要hook的app的包名菠齿,這里選擇同個(gè)應(yīng)用:

    @Override
    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam){
        if (lpparam.packageName.equals("com.wrbug.xposeddemo")) {
            
        }
    }

通過(guò)XposedHelpers的findAndHookMethod方法hook onCreate 方法佑吝,獲取到TextView實(shí)例,在方法執(zhí)行后通過(guò)setText設(shè)置方法绳匀。

public class XposedInit implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) {
        if (lpparam.packageName.equals("com.wrbug.xposeddemo")) {
            XposedHelpers.findAndHookMethod("com.wrbug.xposeddemo.MainActivity", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    //不能通過(guò)Class.forName()來(lái)獲取Class 芋忿,在跨應(yīng)用時(shí)會(huì)失效
                    Class c=lpparam.classLoader.loadClass("com.wrbug.xposeddemo.MainActivity");
                    Field field=c.getDeclaredField("textView");
                    field.setAccessible(true);
                    //param.thisObject 為執(zhí)行該方法的對(duì)象,在這里指MainActivity
                    TextView textView= (TextView) field.get(param.thisObject);
                    textView.setText("Hello Xposed");
                }
            });
        }
    }
}

除了上面通過(guò)反射的方法來(lái)獲取以外疾棵,還可以通過(guò)findViewById等方法獲取TextView對(duì)象戈钢,有興趣的可以思考下如果xml里面沒(méi)有設(shè)置TextView的ID,并且不是MainActivity的成員變量陋桂,該怎么獲取這個(gè)View逆趣,歡迎大家在下方進(jìn)行討論。安裝重啟模擬器后嗜历,打開app宣渗,這時(shí)textView將顯示Hello Xposed

后面的文章會(huì)講解具體的使用,歡迎大家關(guān)注
更多精彩文章請(qǐng)關(guān)注:http://www.mandroid.cn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梨州,一起剝皮案震驚了整個(gè)濱河市痕囱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暴匠,老刑警劉巖鞍恢,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異每窖,居然都是意外死亡帮掉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門窒典,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蟆炊,“玉大人,你說(shuō)我怎么就攤上這事瀑志∩辏” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵劈猪,是天一觀的道長(zhǎng)昧甘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)战得,這世上最難降的妖魔是什么充边? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮常侦,結(jié)果婚禮上痛黎,老公的妹妹穿的比我還像新娘予弧。我一直安慰自己,他們只是感情好湖饱,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布掖蛤。 她就那樣靜靜地躺著,像睡著了一般井厌。 火紅的嫁衣襯著肌膚如雪蚓庭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天仅仆,我揣著相機(jī)與錄音器赞,去河邊找鬼。 笑死墓拜,一個(gè)胖子當(dāng)著我的面吹牛港柜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咳榜,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼夏醉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涌韩?” 一聲冷哼從身側(cè)響起畔柔,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臣樱,沒(méi)想到半個(gè)月后靶擦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雇毫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年玄捕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚放。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枚粘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出席吴,到底是詐尸還是另有隱情,我是刑警寧澤捞蛋,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布孝冒,位于F島的核電站,受9級(jí)特大地震影響拟杉,放射性物質(zhì)發(fā)生泄漏庄涡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一搬设、第九天 我趴在偏房一處隱蔽的房頂上張望穴店。 院中可真熱鬧撕捍,春花似錦、人聲如沸泣洞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)球凰。三九已至狮腿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呕诉,已是汗流浹背缘厢。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甩挫,地道東北人贴硫。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像伊者,于是被迫代替她去往敵國(guó)和親英遭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,326評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)删壮、插件贪绘、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評(píng)論 4 61
  • 文/東成西九 || 東哥說(shuō)職場(chǎng) 今天是日更第97天 || 轉(zhuǎn)載請(qǐng)聯(lián)系作者税灌,違者必究 現(xiàn)在生活中,上大學(xué)的時(shí)候應(yīng)該是...
    東成西九閱讀 4,136評(píng)論 4 36
  • 我就是個(gè)辦不好事情的傻瓜 說(shuō)話藝術(shù)
    云從足下生閱讀 147評(píng)論 0 0