Android 插件化框架replugin-plugin-library 源碼解析

1、 replugin-plugin-library 初始化

replugin-host-library
com.qihoo360.loader2.Plugin.java doLoad 初始化插件裏的Entry對象

 private final boolean doLoad(String tag, Context context, ClassLoader parent, PluginCommImpl manager, int load) {
        if (mLoader == null) {
            // 試圖釋放文件
            PluginInfo info = null;
   


			.......

            // 若需要加載Dex,則還同時需要初始化插件裏的Entry對象
            if (load == LOAD_APP) {
                // NOTE Entry對象是可以在任何線程中被調用到
                if (!loadEntryLocked(manager)) {
                    return false;
                }
                // NOTE 在此處調用則必須Post到UI,但此時有可能Activity已被加載
                //      會出現Activity.onCreate比Application更早的情況,故應放在load外面立即調用
                // callApp();
            }
        }

        if (load == LOAD_INFO) {
            return mLoader.isPackageInfoLoaded();
        } else if (load == LOAD_RESOURCES) {
            return mLoader.isResourcesLoaded();
        } else if (load == LOAD_DEX) {
            return mLoader.isDexLoaded();
        } else {
            return mLoader.isAppLoaded();
        }
    }

2、replugin-plugin-library
com.qihoo360.replugin.Entry.java


public class Entry {

    /**
     * @param context 插件上下文
     * @param cl      HOST程序的類加載器
     * @param manager 插件管理器
     * @return
     */
    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);
            }
        };
    }
}

3、RePluginFramework RePluginEnv 初始化

RePluginEnv 插件環境相關變量的封裝

RePluginFramework 初始化反射調用主程序中 RePlugin Host Library的activity service Provider 相關接口方法

RePluginFramework.java

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

RePluginInternal.java

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

4、MethodInvoker.java 方法調用

    public Object call(Object methodReceiver, Object... methodParamValues) {
        if (!mInitialized) {
            try {
                mInitialized = true;
                mMethod = ReflectUtils.getMethod(mLoader, mClassName, mMethodName, mParamTypes);
                mAvailable = true;
            } catch (Exception e) {
                if (LogDebug.LOG) {
                    LogDebug.d(TAG, "get method error !!! (Maybe the version of replugin-host-lib is too low)", e);
                }
            }
        }

        if (mMethod != null) {
            try {
                return ReflectUtils.invokeMethod(mMethod, methodReceiver, methodParamValues);
            } catch (Exception e) {
                if (LogDebug.LOG) {
                    LogDebug.d(TAG, "invoker method error !!! (Maybe the version of replugin-host-lib is too low)", e);
                }
            }
        }

        return null;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章