HookFactory.java 源代码


package com.x8zs.morgoo.droidplugin.hook;

import android.app.Application;
import android.content.Context;
import com.x8zs.morgoo.droidplugin.hook.proxy.IActivityManagerHook;
import com.x8zs.morgoo.droidplugin.hook.proxy.IPackageManagerHook;
import com.x8zs.morgoo.droidplugin.hook.xhook.SQLiteDatabaseHook;
import com.x8zs.morgoo.helper.Log;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class HookFactory {
    private static HookFactory sInstance;
    private List<Hook> mHookList = new ArrayList(3);

    private HookFactory() {
    }

    public static HookFactory getInstance() {
        synchronized (HookFactory.class) {
            if (sInstance == null) {
                sInstance = new HookFactory();
            }
        }
        return sInstance;
    }

    public void installHook(Hook hook, ClassLoader classLoader) {
        try {
            hook.onInstall(classLoader);
            synchronized (this.mHookList) {
                this.mHookList.add(hook);
            }
        } catch (Throwable th) {
            Log.e(Log.TAG, "installHook %s error", th, hook);
        }
    }

    public final void onCallApplicationOnCreate(Context context, Application application) {
        installHook(new SQLiteDatabaseHook(context), application.getClassLoader());
    }

    public void setHookEnable(boolean z6) {
        synchronized (this.mHookList) {
            Iterator<Hook> it = this.mHookList.iterator();
            while (it.hasNext()) {
                it.next().setEnable(z6);
            }
        }
    }

    public void setHookEnable(boolean z6, boolean z7) {
        synchronized (this.mHookList) {
            Iterator<Hook> it = this.mHookList.iterator();
            while (it.hasNext()) {
                it.next().setEnable(z6, z7);
            }
        }
    }

    public final void installHook(Context context, ClassLoader classLoader) {
        Log.e(Log.TAG, "%s", "installHook call");
        installHook(new IActivityManagerHook(context), classLoader);
        installHook(new IPackageManagerHook(context), classLoader);
    }

    public void setHookEnable(Class cls, boolean z6) {
        synchronized (this.mHookList) {
            for (Hook hook : this.mHookList) {
                if (cls.isInstance(hook)) {
                    hook.setEnable(z6);
                }
            }
        }
    }
}