最近在開發關于xposed方面的應用的時候,需要進行子產品驗證。我們知道xposed架構可以好hook應用的方法。但是在xposed的入口函數内是得不到Context對象的,之前想在
handleLoadPackage方法内進行廣播,然後在廣播内修改一下SharedPreferences的鍵值來判斷子產品是否安裝,因為得不到Context對象,是以沒法用廣播。後來想到2個方法。
方法一:在主Activity中添加一個需要被hook掉的函數如下:
//用于判斷子產品是否安裝
public static String getResult(){
return "未安裝";
}
因為是預設的未安裝,我們hook一下這個函數,令其傳回值為已安裝。如果hook成功,則代表已經安裝,否則就沒安裝。
代碼
XSharedPreferences xpre = new XSharedPreferences("com.mero.wyt_register",Config.ID);
final Class<?> thiz = XposedHelpers.findClass("com.mero.wyt_register.MainActivity",lpparam.classLoader);
try{
hookMethod(thiz,"getResult","已安裝");
}catch (Exception e){
e.printStackTrace();
hookMethod代碼如下:
private void hookMethod(final Class<?> clz, String methodName,final String result) {
XposedHelpers.findAndHookMethod(clz,methodName,new Object[]{
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// super.afterHookedMethod(param);
param.setResult(result);
XposedBridge.log("正在測試beforeHookedMethod");
}
}
});
方法二:擷取Context對象。
我們可以擷取全局的Context對象。首先,我們建立立一個MyApplication的類繼承自Application類。
public class MyApplication extends Application {
public static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static MyApplication getMyApplication(){
return instance;
}
}
另外在配置檔案中添加:Android:name = ".MyApplication";代碼示範如下:
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar">
同樣我們hook掉getMyApplication函數,在下面函數中拿到Context對象。
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// super.afterHookedMethod(param);
param.setResult(result);
XposedBridge.log("正在測試beforeHookedMethod");
Context context = (Context) param.thisObject;
}
}
記得把Context對象改成全局變量。這樣就可以發送廣播了。在廣播裡利用SharedPreferences對象儲存一個字元串。随機什麼都行。然後再在驗證子產品安裝的地方得到這個字元串,判斷是否與預設的也就是SharedPrefences對象
預設的getString(key,value);也就是這個value,假如你在這得到的數值和廣播中發送的不一樣,那麼就代表hook不成功,也就是說你的子產品還沒有安裝。