PluginCallbackHook.java 源代码
package com.x8zs.morgoo.droidplugin.hook.proxy;
import android.content.Context;
import android.os.Handler;
import com.x8zs.morgoo.droidplugin.hook.BaseHookHandle;
import com.x8zs.morgoo.droidplugin.hook.Hook;
import com.x8zs.morgoo.droidplugin.hook.handle.PluginCallback;
import com.x8zs.morgoo.droidplugin.reflect.FieldUtils;
import com.x8zs.morgoo.helper.Log;
import com.x8zs.morgoo.helper.compat.ActivityThreadCompat;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class PluginCallbackHook extends Hook {
private static final String TAG = "PluginCallbackHook";
private List<PluginCallback> mCallbacks;
public PluginCallbackHook(Context context) {
super(context);
this.mCallbacks = new ArrayList(1);
}
@Override
protected BaseHookHandle createHookHandle() {
return null;
}
@Override
public void onInstall(ClassLoader classLoader) {
PluginCallback pluginCallback;
Handler handler = (Handler) FieldUtils.readField(FieldUtils.getField(ActivityThreadCompat.activityThreadClass(), "mH"), ActivityThreadCompat.currentActivityThread());
Field field = FieldUtils.getField(Handler.class, "mCallback");
Object readField = FieldUtils.readField(field, handler);
if (!PluginCallback.class.isInstance(readField)) {
if (readField != null) {
pluginCallback = new PluginCallback(this.mHostContext, handler, (Handler.Callback) readField);
} else {
pluginCallback = new PluginCallback(this.mHostContext, handler, null);
}
pluginCallback.setEnable(isEnable());
this.mCallbacks.add(pluginCallback);
FieldUtils.writeField(field, handler, pluginCallback);
Log.i(TAG, "PluginCallbackHook has installed", new Object[0]);
return;
}
Log.i(TAG, "PluginCallbackHook has installed,skip", new Object[0]);
}
@Override
public void setEnable(boolean z6, boolean z7) {
if (z7) {
try {
onInstall(null);
} catch (Throwable th) {
Log.i(TAG, "setEnable onInstall fail", th, new Object[0]);
}
}
Iterator<PluginCallback> it = this.mCallbacks.iterator();
while (it.hasNext()) {
it.next().setEnable(z6);
}
super.setEnable(z6, z7);
}
}