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