【问题标题】:What are pros and cons of using multiple processes within android application [closed]在android应用程序中使用多个进程的优点和缺点是什么[关闭]
【发布时间】:2013-11-13 17:23:48
【问题描述】:

我写这个问题不是作为任何特定应用程序的一部分,而是作为未来应用程序潜在用途的一部分。我知道这个问题的答案可能是非常具体的应用程序,但我希望你能忍受我。我将按原样传达我的理解,希望你能通过扩展它来帮助我。令人惊讶的是,我在网上搜索了一个“完整”的概述,但没有找到它。显然,任何指向相关页面的链接都是受欢迎的。

默认情况下,Android 应用程序在单个进程中运行。默认情况下,您启动的每个 Activity 或 Service 甚至会在主线程中运行。用户的所有动作都由主线程的 Looper 排队,各自的回调在主线程中处理。

为了提供并发性,线程可以以多种不同的方式启动,单个或在池中。在这方面没有明确需要多个进程。不需要使用多个进程来允许设备的多个内核并行工作,因为线程也可以并行运行,甚至你的 main thread?但也许实际实现起来会更容易?

为了让活动或服务在特定的(可能不同的)进程中工作,您只需在清单文件中设置android:process 属性。这么容易实现吗?

Android 框架是专门为移动设备构建的,移动设备的内存通常有限。因此,进程可以在各种情况下被杀死,明确指出here。只要您实现了活动和服务的生命周期回调,例如onStoponDestroy,这应该不会产生任何实际问题。但显然,通过使用多个进程来划分应用程序的各个部分,可能会使更重要的事情保持活力。例如,可以保持后台下载服务处于活动状态(重要性级别 3),而具有启动此服务的初始 Activity 的进程现在在后台(级别 4)可以释放其资源。此外,您隔离应用程序的核心功能这一事实可能会让您的设备更好地利用其资源?

Binder 框架使 IPC 相当容易处理,并且是您通常会使用的东西,无论实际使用多个进程。我认为应用程序拥有多个进程的主要成本是访问共享资源,或者在进程之间发送这些资源,不包括从 Zygote 派生进程所需的额外资源。我想知道使用多个进程是否真的会迫使您以不同的方式实现您的应用程序?

我认为从概念上讲,使用多个流程不会增加实施的便利性?

总结多个流程的优点:

  • 隔离可能会提供更多终身保护。
  • 分隔使设备在重新获得资源方面更具机动性。
  • 并行化性能提升?

缺点:

  • 必须使用资源从 Zygote 派生一个新进程
  • 在一个应用程序内,资源需要在多个进程之间共享,这会给设备和应用程序性能带来压力。

我能想到的主要用例

  • 使用前台 Activity 进行任何用户交互,并运行持续使用的绑定服务来进行有用的同步,这可能会比用户与您的 Activity 和/或应用程序的会话寿命更长。

如果您对我的理解有任何意见,请说明(注意我的解释中的几个问号)。如果您有任何优点和/或缺点要添加,请回复,我会将它们添加到列表中。

【问题讨论】:

  • 这应该对你有帮助:developer.android.com/training/articles/… 除了投票关闭这个,因为它太宽泛了。
  • @MaciejGórski。显然我不同意你的观点,关于各种主题的利弊问题到处都是,但我很欣赏这个链接。谢谢。
  • 有限的堆内存是主要原因和稳定性。

标签: android process


【解决方案1】:

不需要使用多个进程来允许设备的多个内核并行工作,因为线程也可以并行运行,甚至可能是您的主线程?

实时(非阻塞)线程将自动跨多个内核并行运行。

但也许真正实现起来会更容易?

我认为线程比进程更容易,但“更容易”通常是一种观点。

例如,后台下载服务可以保持活动状态(重要性级别 3),而启动此服务的初始 Activity 的进程现在在后台(级别 4)可以释放其资源。

除非您首先通过两个进程浪费了更多资源,并且让服务长时间运行通常是一种反模式。

Binder 框架使 IPC 相当容易处理,并且是您通常会使用的东西,无论实际使用多个进程

开发人员通常不直接使用 Binder。只有那些实现绑定服务的人需要它,而这在 Android 应用程序中所占的比例相当小。

我想知道使用多个进程是否真的会迫使您以不同的方式实现您的应用程序?

是的。

隔离可能会提供更多终身保护

恕我直言,这不是在多个进程上浪费 RAM、CPU 和电池的正当借口。

并行化性能提升?

主题涵盖了这一点。

我能想到的主要用例

虽然在某些情况下,您的用例实际上是对用户的净收益,但还远不能确定。鉴于您必须以不同的方式实现您的应用程序以处理多个进程,因此使用多个进程是一种不得已的方法,而不是您经常做的那种事情,恕我直言。

【讨论】:

  • 最重要的原因是进程的内存非常有限。因此,例如,图像浏览器可以启动第二个“缓存”线程来存储另外 48MB(或 128MB)的堆内存。
  • @Lothar:使用android:largeHeap="true"更简单,避免了IPC的需要。
  • 是的,然后你仍然得到一个可能 48 MB 的双倍堆,仍然很小。我认为 128MB 是我听说过的最大权限(过去几年没有做很多 Android),
  • @Lothar:“是的,然后你仍然得到一个可能 48 MB 的双倍堆仍然很小”——那么你为什么建议一个只提供双倍堆的解决方案,如果你觉得会不会太小? android:largeHeap 将提供制造商决定提供的任何内容,对于高端设备而言,这将远远超过常规堆限制的两倍。
猜你喜欢
  • 2011-04-01
  • 2012-06-19
  • 1970-01-01
  • 2016-04-20
  • 2011-05-25
  • 1970-01-01
  • 2010-09-12
  • 2011-12-28
  • 2011-12-14
相关资源
最近更新 更多