android-discuss
android-discuss copied to clipboard
[问答]Android开发中何时使用多进程?
Android开发中何时使用多进程?使用多进程的好处是什么?
I think the poster is meaning "Process", not "Thread".
要想知道如何使用多进程,先要知道Android里的多进程概念。一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。那如何让自己的应用拥有多个进程?很简单,我们的四大组件在AndroidManifest文件中注册的时候,有个属性是android:process,1.这里可以指定组件的所处的进程。默认就是应用的主进程。指定为别的进程之后,系统在启动这个组件的时候,就先创建(如果还没创建的话)这个进程,然后再创建该组件。你可以重载Application类的onCreate方法,打印出它的进程名称,就可以清楚的看见了。再设置android:process属性时候,有个地方需要注意:如果是android:process=":deamon",以:开头的名字,则表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自动加上包名,而全局进程则不会。一般我们都是有私有进程,很少使用全局进程。他们的具体区别不知道有没有谁能补充一下。
2.使用多进程显而易见的好处就是分担主进程的内存压力。我们的应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有心人会发现Android后台进程里有很多应用是多个进程的,因为它们要常驻后台,特别是即时通讯或者社交应用,不过现在多进程已经被用烂了。典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。还有就是防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。应该还有还有其他好处,这里就不多说了。
3.坏处的话,多占用了系统的空间,大家都这么用的话系统内存很容易占满而导致卡顿。消耗用户的电量。应用程序架构会变复杂,应为要处理多进程之间的通信。这里又是另外一个问题了。
According to the doc of Android, the diff between
android:process=":foo"
and
android:process="foo"
is
If the name assigned to this attribute begins with a colon (':'), a new process, private to the application, is created when it's needed and the service runs in that process. If the process name begins with a lowercase character, the service will run in a global process of that name, provided that it has permission to do so. This allows components in different applications to share a process, reducing resource usage.
here is the doc.
@szuwest android应用有内存大小限制,是针对进程的还是针对应用的,比如限制是128MB,那开启多个进程是不是就可以有N*128M的内存空间可以使用?
还有,守护进程和主进程之间相互监视这一种,MIUI自带的一键清空内存功能,应该是把各个不在白名单的进程顺序杀死,监视这时候能起到作用吗?
我记得应该是newTask.好处是不受应用的生命周期影响
@jasonross 我的理解是android应用有内存大小限制是针对进程的。每个进程其实都有一个虚拟机,这个虚拟机最大堆就是它的最大可用内存。 守护进程和主进程之间相互监视 这个是很有限的,MIUI可以限制那些进程可以常驻内存哪些不可以,如果被禁掉了,那就无效了。
关于Process的使用最常见的例子是Service。针对Service进行使用需要考虑两种情况 情况1.应用中有Activity部分有会使用较多的UI,占用较多的内存资源,并且要求Activity退到后台情况下要求Service在后台运行。因为Android本身有Low Memory Killer这套机制,在系统内存吃紧的情况下会去会砍掉内存占用较多(一般是OOM_ADJ值较大的Process),此时因为有Service在后台运行,所以会降低OOM_ADJ,Low Memory Killer在砍Process的时候就不容易将此部分内存回收。此时可以考虑将Service从应用进程中分离出来,这样Low Memory Killer在回收内存时会将因为Activity部分占用的内存较大,OOM_ADJ较大,优先将其砍掉释放内存。同时保证Service正常运行。 情况2.在系统中有很多有共性的Service,同时应用中Activity显示部分的UI不多或者没有Activity.可以将这些Service合并成同一个进程。因为android没启动一个进行,在zygote fork阶段会预载于一部分资源占用内存(具体几M记不清楚了),通过将Service合并,可以节省这部分开销。
@szuwest "守护进程和主进程之间相互监视,有一方被杀就重新启动它"
让我想起了,保持servic 不被杀死的问题,貌似现在需要结合ndk才能实现. 在github上没有搜索到解决方案.
@szuwest 全局的进程系统会在必要的时候加入其它进程共享资源,降低系统的内存消耗
@ronanhardiman 结合NDK实现Service不被杀死的 https://github.com/Marswin/MarsDaemon。在Nexus 5X设备上是OK的,然后小米,华为 这些rom 都修改过了,不在白名单的后台进程无法启动/与守护进程有关系的主进程一旦不见被杀,守护进程也就被杀了,不同rom 情况不一样;一般的主进程被杀后,守护进程也会被杀,然后守护进程再也不能启动了
哈哈,微信他们是在白名单,听说@Apeterlife,可以试着把包名改为和微信相同。
哈哈,微信他们是在白名单,听说@Apeterlife,可以试着把包名改为和微信相同。
可测试时加几个flavor,修改applicationId = "com.tentent.mm", "com.tencent.mobileqq"等. 😄 看看效果
一般两个目的:数据共享和内存限制
我记得应该是newTask.好处是不受应用的生命周期影响
newTask只是新的任务栈,与多进程无关
感谢您的关注,我会尽快给您答复
你好,邮件已收到,谢谢
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
这是来自QQ邮箱的自动回复邮件。 您好,您的邮件已收到。如有后续我查收后会立刻联系您。如在假期,我将在假期结束后,尽快给您回复。