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);
    }
}