Support "UI process" as a plug-in management process (rather than only support the "persistent process")

This is the first part, mainly the core of the realization
This commit is contained in:
zhangjiongxuan 2017-08-11 17:44:13 +08:00
parent 6bc5b01330
commit bf75346648
3 changed files with 34 additions and 49 deletions

View File

@ -44,6 +44,7 @@ import com.qihoo360.replugin.component.dummy.DummyProvider;
import com.qihoo360.replugin.component.dummy.DummyService;
import com.qihoo360.replugin.component.process.PluginProcessHost;
import com.qihoo360.replugin.component.service.server.PluginPitService;
import com.qihoo360.replugin.helper.HostConfigHelper;
import com.qihoo360.replugin.helper.LogDebug;
import com.qihoo360.replugin.helper.LogRelease;
import com.qihoo360.replugin.model.PluginInfo;
@ -228,19 +229,22 @@ class PmBase {
}
void init() {
if (IPC.isPersistentProcess()) {
mHostSvc = new PmHostSvc(mContext, this);
PluginProcessMain.installHost(mHostSvc);
PluginProcessMain.schedulePluginProcessLoop(PluginProcessMain.CHECK_STAGE1_DELAY);
if (HostConfigHelper.PERSISTENT_ENABLE) {
// 默认常驻进程作为插件管理进程则区分进程对待
if (IPC.isPersistentProcess()) {
initForPersistent();
} else {
initForClient();
}
} else {
PluginProcessMain.installHost();
}
if (IPC.isPersistentProcess()) {
initForPersistent();
} else {
initForClient();
// UI进程作为插件管理进程唯一进程则此进程既可以作为Persistent也可以作为Client
if (IPC.isUIProcess()) {
initForPersistent();
initForClient();
} else {
// 其它进程直接走Client即可
initForClient();
}
}
// 最新快照
@ -263,6 +267,10 @@ class PmBase {
LogDebug.d(PLUGIN_TAG, "search plugins from file system");
}
mHostSvc = new PmHostSvc(mContext, this);
PluginProcessMain.installHost(mHostSvc);
PluginProcessMain.schedulePluginProcessLoop(PluginProcessMain.CHECK_STAGE1_DELAY);
// 兼容即将废弃的p-n方案 by Jiongxuan Zhang
mAll = new Builder.PxAll();
Builder.builder(mContext, mAll);
@ -295,6 +303,8 @@ class PmBase {
LogDebug.d(PLUGIN_TAG, "list plugins from persistent process");
}
PluginProcessMain.installHost();
List<PluginInfo> plugins = null;
try {
plugins = PluginProcessMain.getPluginHost().listPlugins();

View File

@ -143,30 +143,6 @@ public final class RePluginConfig {
return this;
}
/**
* 是否开启"双进程"模式
*
* @return 是否开启
*/
public boolean isPersistentEnable() {
return persistentEnable;
}
/**
* 设置是否允许开启"双进程"模式开启后会极大的提升插件加载和获取的性能 <p>
* TODO 尚不支持单进程模式在以后会开发
*
* @param persistentEnable 是否开启
* @return RePluginConfig自己这样可以连环调用set方法
*/
public RePluginConfig setPersistentEnable(boolean persistentEnable) {
if (!checkAllowModify()) {
return this;
}
this.persistentEnable = persistentEnable;
return this;
}
/**
* 是否当插件没有指定类时使用宿主的类 <p>
* 有关该开关的具体说明请参见setUseHostClass方法

View File

@ -24,7 +24,6 @@ import android.text.TextUtils;
import com.qihoo360.loader.utils.SysUtils;
import com.qihoo360.loader2.PluginProcessMain;
import com.qihoo360.replugin.RePlugin;
import com.qihoo360.replugin.helper.HostConfigHelper;
import com.qihoo360.replugin.helper.LogDebug;
@ -58,13 +57,17 @@ public class IPC {
sPackageName = context.getApplicationInfo().packageName;
// 设置最终的常驻进程名
String cppn = HostConfigHelper.PERSISTENT_NAME;
if (!TextUtils.isEmpty(cppn)) {
if (cppn.startsWith(":")) {
sPersistentProcessName = sPackageName + cppn;
} else {
sPersistentProcessName = cppn;
if (HostConfigHelper.PERSISTENT_ENABLE) {
String cppn = HostConfigHelper.PERSISTENT_NAME;
if (!TextUtils.isEmpty(cppn)) {
if (cppn.startsWith(":")) {
sPersistentProcessName = sPackageName + cppn;
} else {
sPersistentProcessName = cppn;
}
}
} else {
sPersistentProcessName = sPackageName;
}
sIsUIProcess = sCurrentProcess.equals(sPackageName);
@ -105,11 +108,7 @@ public class IPC {
* @return 插件处理逻辑所在进程名
*/
public static String getPluginHostProcessName() {
if (isPersistentEnable()) {
return getPersistentProcessName();
} else {
return getCurrentProcessName();
}
return sPersistentProcessName;
}
/**
@ -148,7 +147,7 @@ public class IPC {
* @return 是否支持
*/
public static boolean isPersistentEnable() {
return RePlugin.getConfig().isPersistentEnable();
return HostConfigHelper.PERSISTENT_ENABLE;
}
/**