Replugin源码分析之replugin-plugin-library

概述

1:该库主要在插件开发过程中通过dependencies { compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' ... }引入
2:该库主要作用为 Java反射”来调用主程序中 RePlugin Host Library 的相关接口,通过com.qihoo360.replugin.RePlugin的各种方法,提供“双向通信能力”
3:该库入口为com.qihoo360.replugin.Entry,该类的create唯一方法会在replugin-host-librarycom.qihoo360.loader2.Plugin load(int load, boolean useCache)loadPlugin.LOAD_APP时去加载插件,并反射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相关方法
            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相关方法
            loadPluginActivity = new MethodInvoker(classLoader, factory, "loadPluginActivity", new Class<?>[]{Intent.class, String.class, String.class, int.class});
        }
    }

其实2.0initLocked的相关方法都是去初始化一些MethodInvoker来反射调用主程序中 RePlugin Host Library的相关接口。

 RePluginInternal.ProxyRePluginInternalVar.initLocked(cl)----->  初始化为反射调用主程序中 com.qihoo360.i.Factory2及com.qihoo360.i.Factory相关方法

 RePlugin.ProxyRePluginVar.initLocked(cl);----->  初始化为反射调用主程序中 com.qihoo360.replugin.RePlugin相关控制插件install、preload及  activity控制相关方法

PluginLocalBroadcastManager.ProxyLocalBroadcastManagerVar.initLocked(cl)----->
初始化为反射调用主程序中相关控制Broadcast相关方法

PluginProviderClient.ProxyRePluginProviderClientVar.initLocked(cl)----->
初始化为反射调用主程序中 com.qihoo360.loader2.mgr.PluginProviderClient相关控制Provider相关方法

PluginServiceClient.ProxyRePluginServiceClientVar.initLocked(cl);----->
初始化为反射调用主程序中 com.qihoo360.loader2.mgr.PluginServiceClient相关控制service相关方法

IPC.ProxyIPCVar.initLocked(cl);----->初始化为反射调用主程序中com.qihoo360.replugin.base.IPC相关获取储存的IPC信息

3com.qihoo360.replugin.RePluginEnv

/**
 * 插件环境相关变量的封装
 *
 * @author RePlugin Team
 */
public class RePluginEnv {

    private static Context sPluginContext;

    private static Context sHostContext;

    private static ClassLoader sHostClassLoader;

    private static IBinder sPluginManager;

    /**
     * NOTE:如需使用MobileSafeHelper类,请务必先在Entry中调用此方法
     */
    static void init(Context context, ClassLoader cl, IBinder manager) {
        sPluginContext = context;

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

        sHostClassLoader = cl;

        // 从宿主传过来的,目前恒为null
        sPluginManager = manager;
    }

    /**
     * 获取宿主部分的Context对象
     * 可用来:获取宿主部分的资源、反射类、Info等信息
     * <p>
     * 注意:此Context对象不能用于插件(如资源、类等)的获取。
     * 若需使用插件的Context对象,可直接调用Activity中的getApplicationContext(7.1.0及以后才支持),或直接使用Activity对象即可
     */
    public static Context getHostContext() {
        return sHostContext;
    }

    /**
     * 获取宿主部分的ClassLoader对象
     * 可用来:获取宿主部分的反射类
     * <p>
     * 注意:同HostContext一样,这里的ClassLoader不能加载插件中的class
     */
    public static ClassLoader getHostCLassLoader() {
        return sHostClassLoader;
    }

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

给插件环境赋值基本变量

4 com.qihoo360.replugin.RePluginServiceManager

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

 /**
     * 获取已注册的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缓存并提供对外提供通信的能力binder

至此Replugin4个库分工职责 分析学习结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容