本篇文章具體是Xposed開發(fā)筷畦,如何安裝Xposed需自行上網(wǎng)查找败匹,本文同步更新于旺仔的個人博客早像,訪問可能有點慢是钥,多刷新幾次掠归。
Xposed
什么是Xposed呢?
“Xposed是一個適用于Android的框架缅叠。基于這個框架開發(fā)的模塊可以改變系統(tǒng)和app應用的行為虏冻,而不需要修改APK痪署。這是一個很棒的特性,意味著Xposed模塊可以不經(jīng)過任何修改兄旬,安裝在各種不同的ROM上。Xposed模塊可以很容易的開啟和關閉余寥。你只需要激活或者禁用Xposed模塊领铐,然后重啟手機即可∷蜗希”
很好理解绪撵,就是替換了/system/bin/app_process可執(zhí)行文件,在啟動Zygote時加載額外的jar文件(XposedBridge.jar)祝蝠,并執(zhí)行一些初始化操作(執(zhí)行XposedBridge的main方法)音诈,從而完成對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持,然后我們就可以在這個Zygote上下文中進行某些hook操作绎狭。
前提
安裝Xposed的前提是手機必須root细溅,所以沒有root手機的,就不用往下看了儡嘶。
開發(fā)Xposed項目
介紹完Xposed喇聊,那么接下來我們來開發(fā)Xposed的項目。
創(chuàng)建AS項目
使用Android Studio創(chuàng)建一個新的項目蹦狂,具體內(nèi)容就不詳細說了誓篱,基本都會創(chuàng)建項目的。
導入Xposed的api庫
要使用Xposed的東西凯楔,就必須導入相對應的api庫窜骄,
導入jar包
首先我們需要下載對應的jar包,然后導入到項目中的Libs文件夾里面摆屯,下載api-82-sources.jar邻遏,api-82.jar
注意這里要將compile
改為provided
,原因是Xposed里已有該jar包內(nèi)容鸥拧,再次打包進去會沖突党远,所以要改為provided
。
同時也要將compile fileTree(include: ['*.jar'], dir: 'libs')
也改為provided
富弦,如果不修改的話沟娱,就會導致handleLoadPackage沒有回調(diào)。
Provided是對所有的build type以及favlors只在編譯時使用腕柜,類似eclipse中的external-libs,只參與編譯济似,不打包到最終apk矫废。
gradle
當然也可以用gradle導入Xposed,同樣將compile
改為provided
dependencies {
provided fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
provided 'de.robv.android.xposed:api:82'
}
聲明Xposed模塊
創(chuàng)建Xposed項目后砰蠢,還需要在AndroidMenafest.xml
文件里面聲明Xposed模塊蓖扑,在application
里面添加三個meta-data
標簽(xposedmodule、xposeddescription台舱、xposedminversion)律杠。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="Hook log test"/>
<meta-data
android:name="xposedminversion"
android:value="53"/>
</application>
xposedmodule
表示作為Xposed的一個模塊
xposeddescription
表示對本模塊的描述,該描述會顯示在安裝好后的程序名稱下方
xposedminversion
表示jar包的最低版本號
創(chuàng)建hook類
我們新建一個類竞惋,類名隨意柜去,然后實現(xiàn)IXposedHookLoadPackage
接口,并且重寫handleLoadPackage
方法拆宛,里面就是我們要具體操作的地方嗓奢。
package top.jowanxu.xposedtest;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Tutorial implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("=========Loaded app: " + lpparam.packageName);
}
}
聲明類的入口
創(chuàng)建完我們hook類之后,我們需要將該類加載到XposedInstaller中浑厚,也就是我們必須聲明該類的位置股耽,需要在xposed_init中聲明。
xposed_init文件
創(chuàng)建assests文件夾
然后在里面新建一個文件钳幅,文件名為xposed_init
物蝙,沒有后綴,然后在里面寫入我們剛剛創(chuàng)建的類的完整類名敢艰,
運行
搞完上面的步驟之后茬末,我們直接run起來,程序跑起來之后盖矫,Xposed會提示是否激活
我們可以在Xposed里面看到我們的我們剛剛創(chuàng)建的項目
打勾丽惭,然后重啟
重啟之后然后打開Xposed的日志,點擊保存
然后導出到電腦辈双,搜索一下责掏,就能找到我們自己打印的內(nèi)容了
結(jié)語
通過上面的例子我們可以很容易的通過Xposed來對app進行修改,所以使用Xposed需謹慎湃望,不要亂下載一些有后臺的模塊换衬,指不定那天就把你的帳號密碼給泄露出去了。