Replugin源碼分析之replugin-plugin-library

概述

1:該庫主要在插件開發(fā)過程中通過dependencies { compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' ... }引入
2:該庫主要作用為 Java反射”來調(diào)用主程序中 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來反射調(diào)用主程序中 RePlugin Host Library的相關接口。

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

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

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

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

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

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

3com.qihoo360.replugin.RePluginEnv

/**
 * 插件環(huá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類,請務必先在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對象
     * 可用來:獲取宿主部分的資源画恰、反射類、Info等信息
     * <p>
     * 注意:此Context對象不能用于插件(如資源吸奴、類等)的獲取允扇。
     * 若需使用插件的Context對象,可直接調(diào)用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;
    }

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

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個庫分工職責 分析學習結(jié)束

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市读处,隨后出現(xiàn)的幾起案子糊治,更是在濱河造成了極大的恐慌,老刑警劉巖罚舱,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件井辜,死亡現(xiàn)場離奇詭異,居然都是意外死亡管闷,警方通過查閱死者的電腦和手機粥脚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渐北,“玉大人阿逃,你說我怎么就攤上這事铭拧≡咧耄” “怎么了恃锉?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呕臂。 經(jīng)常有香客問我破托,道長,這世上最難降的妖魔是什么歧蒋? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任土砂,我火速辦了婚禮,結(jié)果婚禮上谜洽,老公的妹妹穿的比我還像新娘萝映。我一直安慰自己,他們只是感情好阐虚,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布序臂。 她就那樣靜靜地躺著,像睡著了一般实束。 火紅的嫁衣襯著肌膚如雪奥秆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天咸灿,我揣著相機與錄音构订,去河邊找鬼。 笑死避矢,一個胖子當著我的面吹牛悼瘾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播审胸,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼分尸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歹嘹?” 一聲冷哼從身側(cè)響起箩绍,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尺上,沒想到半個月后材蛛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡怎抛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年卑吭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片马绝。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡豆赏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掷邦,我是刑警寧澤白胀,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站抚岗,受9級特大地震影響或杠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宣蔚,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一向抢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胚委,春花似錦挟鸠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鉴未,卻和暖如春枢冤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铜秆。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工淹真, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人连茧。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓核蘸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啸驯。 傳聞我的和親對象是個殘疾皇子客扎,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容