Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[问答]Android开发中何时使用多进程? #7

Open
jasonross opened this issue Mar 10, 2015 · 13 comments
Labels

Comments

@jasonross
Copy link

@jasonross jasonross commented Mar 10, 2015

Android开发中何时使用多进程?使用多进程的好处是什么?

@pcqpcq

This comment has been minimized.

Copy link

@pcqpcq pcqpcq commented Mar 10, 2015

I think the poster is meaning "Process", not "Thread".

@szuwest

This comment has been minimized.

Copy link

@szuwest szuwest commented Mar 10, 2015

要想知道如何使用多进程,先要知道Android里的多进程概念。一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。那如何让自己的应用拥有多个进程?很简单,我们的四大组件在AndroidManifest文件中注册的时候,有个属性是android:process,1.这里可以指定组件的所处的进程。默认就是应用的主进程。指定为别的进程之后,系统在启动这个组件的时候,就先创建(如果还没创建的话)这个进程,然后再创建该组件。你可以重载Application类的onCreate方法,打印出它的进程名称,就可以清楚的看见了。再设置android:process属性时候,有个地方需要注意:如果是android:process=":deamon",以:开头的名字,则表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自动加上包名,而全局进程则不会。一般我们都是有私有进程,很少使用全局进程。他们的具体区别不知道有没有谁能补充一下。

2.使用多进程显而易见的好处就是分担主进程的内存压力。我们的应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有心人会发现Android后台进程里有很多应用是多个进程的,因为它们要常驻后台,特别是即时通讯或者社交应用,不过现在多进程已经被用烂了。典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。还有就是防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。应该还有还有其他好处,这里就不多说了。

3.坏处的话,多占用了系统的空间,大家都这么用的话系统内存很容易占满而导致卡顿。消耗用户的电量。应用程序架构会变复杂,应为要处理多进程之间的通信。这里又是另外一个问题了。

@pcqpcq

This comment has been minimized.

Copy link

@pcqpcq pcqpcq commented Mar 10, 2015

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.

@jasonross

This comment has been minimized.

Copy link
Author

@jasonross jasonross commented Mar 10, 2015

@szuwest android应用有内存大小限制,是针对进程的还是针对应用的,比如限制是128MB,那开启多个进程是不是就可以有N*128M的内存空间可以使用?

还有,守护进程和主进程之间相互监视这一种,MIUI自带的一键清空内存功能,应该是把各个不在白名单的进程顺序杀死,监视这时候能起到作用吗?

@siyehua

This comment has been minimized.

Copy link

@siyehua siyehua commented Mar 10, 2015

我记得应该是newTask.好处是不受应用的生命周期影响

@Trinea Trinea changed the title 问答-Android开发中何时使用多进程? [问答]Android开发中何时使用多进程? Mar 10, 2015
@Trinea Trinea added the help wanted label Mar 10, 2015
@szuwest

This comment has been minimized.

Copy link

@szuwest szuwest commented Mar 11, 2015

@jasonross 我的理解是android应用有内存大小限制是针对进程的。每个进程其实都有一个虚拟机,这个虚拟机最大堆就是它的最大可用内存。 守护进程和主进程之间相互监视 这个是很有限的,MIUI可以限制那些进程可以常驻内存哪些不可以,如果被禁掉了,那就无效了。

@jcb316733855

This comment has been minimized.

Copy link

@jcb316733855 jcb316733855 commented Mar 11, 2015

关于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合并,可以节省这部分开销。

@ronanhardiman

This comment has been minimized.

Copy link

@ronanhardiman ronanhardiman commented Apr 16, 2015

@szuwest
"守护进程和主进程之间相互监视,有一方被杀就重新启动它"

让我想起了,保持servic 不被杀死的问题,貌似现在需要结合ndk才能实现.
在github上没有搜索到解决方案.

@LoranWong

This comment has been minimized.

Copy link

@LoranWong LoranWong commented Jul 26, 2016

@szuwest 全局的进程系统会在必要的时候加入其它进程共享资源,降低系统的内存消耗

@Apeterlife

This comment has been minimized.

Copy link

@Apeterlife Apeterlife commented Dec 1, 2016

@ronanhardiman 结合NDK实现Service不被杀死的 https://github.com/Marswin/MarsDaemon。在Nexus 5X设备上是OK的,然后小米,华为 这些rom 都修改过了,不在白名单的后台进程无法启动/与守护进程有关系的主进程一旦不见被杀,守护进程也就被杀了,不同rom 情况不一样;一般的主进程被杀后,守护进程也会被杀,然后守护进程再也不能启动了

@AnyLifeZLB

This comment has been minimized.

Copy link

@AnyLifeZLB AnyLifeZLB commented Dec 1, 2016

哈哈,微信他们是在白名单,听说@Apeterlife,可以试着把包名改为和微信相同。

@jp1017

This comment has been minimized.

Copy link

@jp1017 jp1017 commented Dec 1, 2016

哈哈,微信他们是在白名单,听说@Apeterlife,可以试着把包名改为和微信相同。

可测试时加几个flavor,修改applicationId = "com.tentent.mm", "com.tencent.mobileqq"等. 😄 看看效果

@EspoirX

This comment has been minimized.

Copy link

@EspoirX EspoirX commented Mar 12, 2019

一般两个目的:数据共享和内存限制

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
You can’t perform that action at this time.