Android能否强制启动的Activity运行在当前进程?无需修改Manifest?
无需修改Manifest指定Activity运行进程的解决办法
核心逻辑
Android里Activity的进程归属是Manifest静态定死的,官方没提供动态修改的API,但可以通过拦截库的启动请求+Hook系统启动逻辑,强制让Activity跑在Service的隔离进程里。
实操步骤
拦截Activity启动请求
写个自定义的ContextWrapper,替换Service的Context,重写startActivity方法,一旦检测到库要启动com.badlibrary.TheirActivity,就动手修改:public class IsolationContextWrapper extends ContextWrapper { public IsolationContextWrapper(Context base) { super(base); } @Override public void startActivity(Intent intent) { ComponentName component = intent.getComponent(); if (component != null && "com.badlibrary.TheirActivity".equals(component.getClassName())) { hookActivityStart(intent); } super.startActivity(intent); } private void hookActivityStart(Intent intent) { // 反射修改系统启动逻辑,指定Activity跑在当前进程 try { // 获取ActivityManagerService实例 Class<?> amClazz = Class.forName("android.app.ActivityManager"); Method getServiceMethod = amClazz.getDeclaredMethod("getService"); Object ams = getServiceMethod.invoke(null); // 找到startActivity的方法,反射调用时修改进程参数 Class<?> iAmClazz = Class.forName("android.app.IActivityManager"); Method startActivityMethod = iAmClazz.getDeclaredMethod( "startActivity", IBinder.class, String.class, Intent.class, String.class, IBinder.class, int, int, String.class, Bundle.class ); // 这里需要根据对应Android版本的源码,修改ActivityRecord的processName字段 // 不同版本的参数和内部类结构可能不一样,得自己适配 } catch (Exception e) { e.printStackTrace(); } } }然后在Service的
onCreate里替换Context,确保库用这个Wrapper来启动Activity:@Override public void onCreate() { super.onCreate(); // 替换Service的Context try { IsolationContextWrapper wrapper = new IsolationContextWrapper(this); Field mBaseField = ContextWrapper.class.getDeclaredField("mBase"); mBaseField.setAccessible(true); mBaseField.set(this, wrapper); } catch (Exception e) { e.printStackTrace(); } // 初始化异常库 BadLibrary.init(this); }进程复用辅助技巧
启动Activity时加上FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK标记,让系统优先复用当前Service的进程。但这个方法不稳定,系统还是会优先遵循Manifest的声明,只能作为辅助手段。
补充:更稳妥的官方方案
要是能接受修改Manifest,直接在你的主Manifest里重新声明这个Activity,指定进程为:isolation,Manifest合并时会覆盖库的声明,这是官方支持的稳定做法:
<activity android:name="com.badlibrary.TheirActivity" android:process=":isolation" />
内容的提问来源于stack exchange,提问作者Hounshell
相关产品推荐
相关产品推荐

