Replugin源碼分析之replugin-plugin-library

概述

1:該庫主要在插件開發(fā)過程中通過dependencies { compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' ... }引入
2:該庫主要作用為 Java反射”來調(diào)用主程序中 RePlugin Host Library 的相關(guān)接口,通過com.qihoo360.replugin.RePlugin的各種方法,提供“雙向通信能力”
3:該庫入口為com.qihoo360.replugin.Entry,該類的create唯一方法會(huì)在replugin-host-librarycom.qihoo360.loader2.Plugin load(int load, boolean useCache)當(dāng)loadPlugin.LOAD_APP時(shí)去加載插件,并反射Entry的create方法

源碼分析

1: com.qihoo360.replugin.Entry

public static final IBinder create(Context context, ClassLoader cl, IBinder manager) {
        // 初始化插件框架
        RePluginFramework.init(cl);
        // 初始化Env
        RePluginEnv.init(context, cl, manager);

        return new IPlugin.Stub() {
            @Override
            public IBinder query(String name) throws RemoteException {
                return RePluginServiceManager.getInstance().getService(name);
            }
        };
    }

2com.qihoo360.replugin.RePluginFramework

static boolean init(ClassLoader cl) {
        synchronized (LOCK) {
            return initLocked(cl);
        }
    }

 private static boolean initLocked(ClassLoader cl) {
        if (mInitialized) {
            return mHostInitialized;
        }
        mInitialized = true;

        try {
            //
            RePluginInternal.ProxyRePluginInternalVar.initLocked(cl);
            RePlugin.ProxyRePluginVar.initLocked(cl);
            PluginLocalBroadcastManager.ProxyLocalBroadcastManagerVar.initLocked(cl);
            PluginProviderClient.ProxyRePluginProviderClientVar.initLocked(cl);
            PluginServiceClient.ProxyRePluginServiceClientVar.initLocked(cl);
            IPC.ProxyIPCVar.initLocked(cl);

            mHostInitialized = true;

        } catch (final Throwable e) {
            if (LogRelease.LOGR) {
                Log.e(TAG, e.getMessage(), e);
            }
        }

        return mHostInitialized;
    }

2.1 com.qihoo360.replugin.RePluginInternal.ProxyRePluginInternalVar

 static class ProxyRePluginInternalVar {

        private static MethodInvoker createActivityContext;

        private static MethodInvoker handleActivityCreateBefore;

        private static MethodInvoker handleActivityCreate;

        private static MethodInvoker handleActivityDestroy;

        private static MethodInvoker handleRestoreInstanceState;

        private static MethodInvoker startActivity;

        private static MethodInvoker startActivityForResult;

        private static MethodInvoker loadPluginActivity;

        static void initLocked(final ClassLoader classLoader) {

            final String factory2 = "com.qihoo360.i.Factory2";
            final String factory = "com.qihoo360.i.Factory";

            // 初始化Factory2相關(guān)方法
            createActivityContext = new MethodInvoker(classLoader, factory2, "createActivityContext", new Class<?>[]{Activity.class, Context.class});
            handleActivityCreateBefore = new MethodInvoker(classLoader, factory2, "handleActivityCreateBefore", new Class<?>[]{Activity.class, Bundle.class});
            handleActivityCreate = new MethodInvoker(classLoader, factory2, "handleActivityCreate", new Class<?>[]{Activity.class, Bundle.class});
            handleActivityDestroy = new MethodInvoker(classLoader, factory2, "handleActivityDestroy", new Class<?>[]{Activity.class});
            handleRestoreInstanceState = new MethodInvoker(classLoader, factory2, "handleRestoreInstanceState", new Class<?>[]{Activity.class, Bundle.class});
            startActivity = new MethodInvoker(classLoader, factory2, "startActivity", new Class<?>[]{Activity.class, Intent.class});
            startActivityForResult = new MethodInvoker(classLoader, factory2, "startActivityForResult", new Class<?>[]{Activity.class, Intent.class, int.class, Bundle.class});

            // 初始化Factory相關(guān)方法
            loadPluginActivity = new MethodInvoker(classLoader, factory, "loadPluginActivity", new Class<?>[]{Intent.class, String.class, String.class, int.class});
        }
    }

其實(shí)2.0initLocked的相關(guān)方法都是去初始化一些MethodInvoker來反射調(diào)用主程序中 RePlugin Host Library的相關(guān)接口。

 RePluginInternal.ProxyRePluginInternalVar.initLocked(cl)----->  初始化為反射調(diào)用主程序中 com.qihoo360.i.Factory2及com.qihoo360.i.Factory相關(guān)方法

 RePlugin.ProxyRePluginVar.initLocked(cl);----->  初始化為反射調(diào)用主程序中 com.qihoo360.replugin.RePlugin相關(guān)控制插件install、preload及  activity控制相關(guān)方法

PluginLocalBroadcastManager.ProxyLocalBroadcastManagerVar.initLocked(cl)----->
初始化為反射調(diào)用主程序中相關(guān)控制Broadcast相關(guān)方法

PluginProviderClient.ProxyRePluginProviderClientVar.initLocked(cl)----->
初始化為反射調(diào)用主程序中 com.qihoo360.loader2.mgr.PluginProviderClient相關(guān)控制Provider相關(guān)方法

PluginServiceClient.ProxyRePluginServiceClientVar.initLocked(cl);----->
初始化為反射調(diào)用主程序中 com.qihoo360.loader2.mgr.PluginServiceClient相關(guān)控制service相關(guān)方法

IPC.ProxyIPCVar.initLocked(cl);----->初始化為反射調(diào)用主程序中com.qihoo360.replugin.base.IPC相關(guān)獲取儲(chǔ)存的IPC信息

3com.qihoo360.replugin.RePluginEnv

/**
 * 插件環(huán)境相關(guān)變量的封裝
 *
 * @author RePlugin Team
 */
public class RePluginEnv {

    private static Context sPluginContext;

    private static Context sHostContext;

    private static ClassLoader sHostClassLoader;

    private static IBinder sPluginManager;

    /**
     * NOTE:如需使用MobileSafeHelper類,請(qǐng)務(wù)必先在Entry中調(diào)用此方法
     */
    static void init(Context context, ClassLoader cl, IBinder manager) {
        sPluginContext = context;

        // 確保獲取的一定是主程序的Context
        sHostContext = ((ContextWrapper) context).getBaseContext();

        sHostClassLoader = cl;

        // 從宿主傳過來的,目前恒為null
        sPluginManager = manager;
    }

    /**
     * 獲取宿主部分的Context對(duì)象
     * 可用來:獲取宿主部分的資源、反射類、Info等信息
     * <p>
     * 注意:此Context對(duì)象不能用于插件(如資源、類等)的獲取。
     * 若需使用插件的Context對(duì)象,可直接調(diào)用Activity中的getApplicationContext(7.1.0及以后才支持),或直接使用Activity對(duì)象即可
     */
    public static Context getHostContext() {
        return sHostContext;
    }

    /**
     * 獲取宿主部分的ClassLoader對(duì)象
     * 可用來:獲取宿主部分的反射類
     * <p>
     * 注意:同HostContext一樣,這里的ClassLoader不能加載插件中的class
     */
    public static ClassLoader getHostCLassLoader() {
        return sHostClassLoader;
    }

    /**
     * 獲取該插件的PluginContext
     * @return
     */
    public static Context getPluginContext() {
        return sPluginContext;
    }

給插件環(huán)境賦值基本變量

4 com.qihoo360.replugin.RePluginServiceManager

   private ConcurrentHashMap<String, IBinder> mServices = new ConcurrentHashMap<String, IBinder>();

 /**
     * 獲取已注冊(cè)的IBinder
     *
     * @param name
     * @return
     */
    public IBinder getService(final String name) {
        if (LogDebug.LOG) {
            LogDebug.d(TAG, "get service for IPlugin.query, name = " + name);
        }

        if (TextUtils.isEmpty(name)) {
            throw new IllegalArgumentException("service name can not value null");
        }

        IBinder ret = mServices.get(name);

        if (ret == null) {
            return null;
        }

        if (!ret.isBinderAlive() || !ret.pingBinder()) {
            mServices.remove(name);
            return null;
        }

        return ret;
    }

該類的作用就是通過mServices緩存并提供對(duì)外提供通信的能力binder

至此Replugin4個(gè)庫分工職責(zé) 分析學(xué)習(xí)結(jié)束

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容