回锅肉

昨天第一次开原创评论留言,想不到这么多人捧场,本来想把各位的留言全部都放出来的,但是没想到,居然留言只能放出100条!所以,昨天没看见自己留言的朋友,大概知道自己的名次了~

在前面的菜单中,我上了一道『单应用的多进程架构』,地址如下:

http://mp.weixin.qq.com/s?__biz=MzAxNzMxNzk5OQ==&mid=2649484574&idx=1&sn=0d4fde0fb26940f8d1cd421eed7d2292#rd 大家可以点击原文查看。

这道菜上了之后,有位朋友跟我在后台留言,说有些多进程的问题想和我一起讨论下,双方就这个问题,彼此发表了各自的看法,并达成了高度统一的意见,对增进多进程的理解,起到了极大的促进作用,为维护真理作出了巨大贡献,下面请看详细报道。

疑问1:多进程架构并不能降低被LMK杀的概率

对于这个问题,我认为应该是我没有写清楚,我的意思是,一个App本来需要50M的内存,但是进入一个页面后,需要内存飚升至200M,一旦返回后台,那么这个App就很容易被LMK杀掉,但是,如果改成多进程架构,将很耗内存的那个页面放入另一个进程,那么即使这个进程被Kill,也不会影响App本身的那个进程。

但是,LMK杀进程是基于整个系统的全局策略,使用多进程架构在系统层面上,会带来更多的内存开销,也会加剧内存紧张的问题,反而会提高被杀的可能性。

另外,在Android L之后,系统对杀进程往往会采取以pkg为单位的策略,所以在很多设备上,即使是通过NDK层Fork出来的进程,也会因为App进程被杀而被停止。

疑问2:ROM对进程管理行为的修改

不同的ROM厂商,通常都会对进程管理系统做一定的修改,特别是在Android N之前,实际上很多ROM都已经有了自己的权限系统。而不同ROM的Launcher中的清理进程,甚至都有不同的进程管理策略,有的可能按pid进行管理,有的可能按pkg进行管理。所以,不同的ROM对多进程的清理方式也是不同的。而且,对于原生ROM来说,在安装pkg进行进程管理的时候,不仅仅会以pkg的方式来进行Kill,即使两个进程间产生了反射关系,也有可能会被Kill。

疑问3:ContentProvider的Call方法

对于这个方法,我在那天的文章中说了,是进行跨进程调用的一个非常好用而且方便的方法,但是,这个方法在原生的Android系统中,就存在一个Bug,即调用call方法的进程,有一定几率被杀,虽然概率极低,但一旦发生这个问题,几乎是无法进行分析的。不过,这个问题我暂时还没有遇到,准备通过自动化脚本来测试下具体的Kill概率有多少。

疑问4:系统按照pkg来管理内存,为什么多进程中的崩溃不会影响另一个进程

在多进程中,如果Crash一个进程,而这个进程在内存中是独立的,没有与其它进程建立联系,那么系统之后Kill Crash的进程,也就是说,系统在进行进程管理的时候,是采用的多种策略,不仅仅是只按照pkg或者pid。

疑问5:关于多进程保活

在这一点上,我是极力反对通过多进程来进行所谓的保活的,保活应该是让用户建立对App的依赖,从而来提高留存,而不是通过所谓的后台唤起,这种只会让数据好看的方式。很多比较智障的产品经理,动不动就说,微信、QQ都可以保活呀,对于这种产品,我只想说,你TM能把App做到微信、QQ这种程度,我也能让你活!这些大厂的App的保活,基本上都是靠ROM的白名单,如果ROM想Kill你的进程,那真是可以让你有一万种死法。而大部分的ROM厂商,为了降低自己手机的功耗和内存,基本上对于第三方的App都会采取直接Kill的方式来管理,所以,如果再有产品让你来给应用保活,请直接向抛出一个异常。

OK,那天的谈话内容基本就是上面这些了,这里再次感谢这位朋友,我已经很久没有从事Framework层的开发了,所以对底层的理解在4.4时代后可能有一些偏差,也有很多新的东西没有来得及了解,多谢他的提醒和指导,才得以把那天的文章中的一些问题重新整理下,这才有了今天的这盘回锅肉!

那么感谢他的帮助,所以给他打个广告,这位朋友是小米的一位高级开发工程师——Gityuan,大家可以去他的博客上看看,有很多非常好的关于Framework的文章,地址如下:

http://gityuan.com/

再次对他表示感谢,也希望大家对文章中的问题提出自己的看法,毕竟现在开通留言了,可以很方便的进行讨论啦~~

本文分享自微信公众号 - Android群英传(android_heroes),作者:徐宜生

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 单应用的多进程架构

    用户1907613
  • 从 Linux 进程调度到 Android 线程管理

    用户1907613
  • Android O 中的 seccomp 过滤器

    用户1907613
  • 僵尸进程的问题

    1、僵尸进程的产生 在AIX操作系统实施的进程结构中,每一个进程都有一个父进程。当一个进程结束时会通知它的父进程,从而该进程的父进程会收集该进程的状态信息。若...

    李海彬
  • 操作系统核心原理-3.进程原理(上):进程概要

    进程管理、内存管理和文件管理是操作系统的三大核心功能,那么什么是进程呢?顾名思义,进程就是进展中的程序,或者说进程是执行中的程序。当一个程序被加载到内存之后就变...

    Edison Zhou
  • 关于进程的分类

    默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作。对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候...

    shengjk1
  • 1.进程管理

    11、对进程的描述错误的是( d) A.进程是动态的概念 B.进程执行需要处理机 C.进程是有生命期的 D.进程是指令的集合

    见贤思齊
  • 100个Linux命令(7)-进程管理

    这是100个命令的第7篇文章,主要关于进程的管理命令以及你应该知道关于进程的基本原理,相对于命令的理解,应该更加注重对于进程本身的理解。

    懒人的小脑
  • Linux进程基础

    计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令(instruction)。所谓的...

    程序员宝库
  • Linux笔记(10)| 进程概述

    父进程返回正整数,子进程返回0,在执行fork函数之前,操作系统只有一个进程,fork函数之前的,代码只会被执行一次,在执行fork函数之后,操作系统有两个几乎...

    飞哥

扫码关注云+社区

领取腾讯云代金券