前言
其实很久之前就又知道多进程这种方式,因为在我理解中OOM的最终解决方案就是使用此种方式,再加上之前就了解到插件化思想, 更加坚信多进程是中大型应用必走之路,其开启方式也无非是在清单文件中利用progress配置及使用c代码fork一个进程,fork做法一般用于保活功能,不过去年被项目所逼花了时间研究保活,整理了不少资料,得出一个结论对于现在的手机 ,保活功能就是一个伪命题,这种一般框架命名为含有Daemon的Service
多进程是个啥?
个人理解图
私有进程的完整名称为默认主进程名称+配置名称,例:主进程名为:www.biabia.club,则私有进程名为www.biabia.club:jiaoBaBa。
此处sharedUserId后两个App的进程如何运行处理没做探究,但是其数据可以共享,据说这样可以共享虚拟机,共享方式暂未探索,但是共享uid的几个App必须使用相同签名方可奏效。
多进程应用场景
1.模块化时几个组件间数据隔离,或者模块化时扩大应用内存 ,适用于组件化思想开发
2.给WebView和图片加载控件保驾护航,使其拥有充足内存,且一处崩溃不影响整个App运行。
3进程皆有5个优先级,可以加以利用,譬如音乐播放案例,可以开启一前台Service并将此Service指定一公有进程运行
多进程使用问题
1.Application多次初始化,可以在onCreate判断其主进程name进行过滤的初始化某些东西
法1:
public static String getProcessName(Context cxt, int pid) {
ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}
法2:
public static String getProcessName2() {
try {
File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline");
BufferedReader mBufferedReader = new BufferedReader(new FileReader(file));
String processName = mBufferedReader.readLine().trim();
mBufferedReader.close();
return processName;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
2.静态变量等数据完全隔离:
今日在使用中访问静态变量,在A Activity做出改变,但在B Activity获取时发现获取的扔是初始值,突然想起可能是IPC隔离,IPC通信这里都是老生常谈,虽说传值方式很多,但便捷性还有待进一步探索。
3.单Activity指定进程,启动与杀死即为进程启动与结束,表现为Application在启动时仍旧会重启
待探究:同App便捷IPC通信;多组件同进程进程状况及多组件之间的数据共享状况;共享uid进程处理方式及共享虚拟机概念是什么;跳转Activity无权限原因。
参考:
https://blog.csdn.net/aj758461601/article/details/24361347
https://blog.csdn.net/coding_glacier/article/details/8230159
https://blog.csdn.net/yuanlong_zheng/article/details/7338276
http://blog.spinytech.com/2016/11/17/android_multiple_process_usage_scenario/
https://developer.android.com/reference/android/os/Process
网友评论