- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已阅读以下声明 here
By default, all components of the same application run in the same process and most applications should not change this. However, if one needs to control which process a certain component belongs to, he can do so in the manifest file. The manifest entry for each type of component element—<activity>, <service>, <receiver>, and <provider>—supports an android:process attribute that can specify a process in which that component should run. One can set this attribute so that each component runs in its own process or so that some components share a process while others do not.
我想知道开发者在哪些场景下愿意在不同的进程中运行不同的组件,这样做会有什么好处?
我读到的另一个说法是
The <application> element in the manifest file also supports an android:process attribute, to set a default value that applies to all components
关于上面的说法,我想知道开发者为什么要这样做,默认情况下已经有一个进程与一个应用程序关联,并且所有组件都在该进程中运行。
任何人都可以为我澄清这些事情,因为我在其他任何地方都没有得到任何细节
谢谢
最佳答案
让我们以 Google Chrome browser
为例充分利用了android:process
属性。在此之前,让我们了解一下为什么要考虑多进程架构。
还记得那些我们使用协作式多任务操作系统的时代吗?有一个进程和应用程序用于轮流在该进程中运行。该架构的问题是,如果一个应用程序行为不当,那么单个进程就会因整个系统宕机而终止。
现在是现代操作系统,在自己的进程中运行应用程序。如果一个应用程序行为不当,托管它的进程就会终止,并且不会影响系统的其余部分。
同样适用于浏览器。如果一个网页出现问题,它会使在其他选项卡中打开的网页不可用,从而导致整个浏览器崩溃。因此构建了多进程架构。
单独的进程用于浏览器选项卡,以保护浏览器应用程序免受呈现引擎中的错误影响。每个渲染进程都在单独的进程中作为 android 服务运行。这是通过使用 android:process
完成的<service>
的标签元素。用于渲染引擎进程的另一个重要标志是 android:isolateProcess .此标志确保渲染进程无法访问网络、显示和文件系统等系统资源,从而使浏览器应用程序高度安全。
这是 chrome list 文件的 fragment :
<service android:name="org.chromium.content.app.SandboxedProcessService0" android:permission="com.google.android.apps.chrome.permission.CHILD_SERVICE" android:exported="false" android:process=":sandboxed_process0" android:isolatedProcess="true" />
这是 adb shell 的输出:
USER PID PPID VSIZE RSS WCHAN PC NAME
u0_a14 12926 317 694380 102828 ffffffff 00000000 S com.android.chrome
u0_i16 26875 317 590860 59012 ffffffff 00000000 S com.android.chrome:sandboxed_process5
u0_i17 27004 317 577460 47644 ffffffff 00000000 S com.android.chrome:sandboxed_process6
The element in the manifest file also supports an android:process attribute, to set a default value that applies to all components
默认情况下,应用程序进程的名称将是 <manifest>
中指定的包名称标签。这可以通过在 android:process
中指定名称来覆盖<application>
的属性标签。一个用例:如果多个应用程序想要在同一个进程中运行,前提是这些应用程序由相同的证书签名并共享用户 ID。
如果名字<android:process>
以 :
开头, 它变成了那个应用程序的私有(private),就像 chrome 的渲染引擎 ( com.android.chrome:sandboxed_process5
) 一样。它意味着除com.android.chrome
以外的应用程序无法与此呈现引擎通信。
如果名字<android:process>
以小写字符开头,它成为全局进程。来自 docs :
This allows components in different applications to share a process, reducing resource usage.
优势总结:
基本上,您应该能够分离关注点并决定应用多进程架构是否有意义。
更新 1:添加@Budius 评论
每个进程只有一定数量的可用内存。在我工作的应用程序中,我们在大型内存阵列中进行计算密集型处理。我们总是在单独的进程中触发这些计算,以确保我们有足够的内存来完成整个事情,并且不会因 OutOfMemory 而崩溃。
关于android - 如何决定何时在单独的进程中运行不同的 android 应用程序组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24114689/
我错过了什么,我已完成 的安装指南中要求的所有步骤 native 脚本 运行 tns doctor 给我以下输出... C:\abc\xyz>tns doctor √ Getting environm
尝试从 {addToCart(book)}}/>}> 传递数据至}> 问题: 购物车 ( render={()=> ) 收到 null,但没有收到我尝试发送的对象 已放置“console.log...
这是 _app.tsx 的外观: function MyApp({ Component, pageProps }: AppProps) { return } 我在构建项目时遇到了这个错误: Ty
我的 Laravel Vue 组件收到以下警告: [Vue warn]: Avoid mutating a prop directly since the value will be overwrit
根据这个example更详细this one我刚刚遇到了一件奇怪的事情...... 如果我使用方法作为 addTab(title,icon,component) 并且下一步想使用 setTabComp
目前我有一个捕获登录数据的表单,一个带有 TIWDBGrid 的表单,它应该返回与我从我的 mysql 数据库登录时创建的 user_id 关联的任何主机,以及一个共享数据模块。 下面是我的登录页面代
在我的react-native应用程序中,我目前有一个本地Android View (用java编写)正确渲染。当我尝试将我的react-native javascript 组件之一放入其中时,出现以
我为作业编写了简单的代码。我引用了文档和几个 youtube 视频教程系列。我的 react 代码是正确的我在运行代码时没有收到任何错误。但是这些 react-boostrap 元素没有渲染。此代码仅
几周前我刚刚开始使用 Flow,从一周前开始我就遇到了 Flow 错误,我不知道如何修复。 代码如下: // @flow import React, { Component } from "react
我想在同一个 View 中加载不同的 web2py 组件,但不是同时加载。我有 5 个 .load 文件,它们具有用于不同场景的表单字段,这些文件由 onchange 选择脚本动态调用。 web2py
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
Blazor 有 InputNumber将输入限制为数字的组件。然而,这呈现了一个 firefox 不尊重(它允许任何文本)。 所以我尝试创建一个过滤输入的自定义组件: @inherits Inpu
我在学习 AngularDART 组件时编写了以下简单代码,但没有显示任何内容,任何人都可以帮助我知道我犯了什么错误: 我的 html 主文件:
我想在初始安装组件时或之后为 div 设置动画(淡入)。动画完成后,div 不应消失。我正在尝试使用 CSSTransition 组件并查看 reactcommunity.org 上的示例,但我根本无
我需要一个 JSF 组件来表示甘特图。是否有任何组件库(如 RichFaces)包含这样的组件? 最佳答案 JFreeChart有甘特图和PrimeFaces有一个图像组件,允许您动态地流式传输内容。
从软件工程的角度来看,组件、模块和子系统之间有什么区别? 提前致谢! 最佳答案 以下是 UML 2.5 的一些发现: 组件:该子句指定一组结构,可用于定义任意大小和复杂性的软件系统。特别是,它将组件指
我有使用非托管程序集(名为 unmanaged.dll)的托管应用程序(名为 managed.exe)。到目前为止,我们已经创建了 Interop.unmanaged.dll,managed.exe
我有一个跨多个应用程序复制的 DAL(我知道它的设计很糟糕,但现在忽略它),我想做的是这个...... 创建一个将通过所有桌面应用程序访问的 WCF DAL 组件。任何人都可以分享他们对关注的想法吗?
我有一个 ComboBox 的集合声明如下。 val cmbAll = for (i /** action here **/ } 所有这些都放在一个 TabbedPane 中。我想这不是问题。那么我
使用 VB6 创建一个 VB 应用程序。应用程序的一部分显示内部的闪存。 当我使用 printform它只是打印整个应用程序。我不知道如何单独打印闪光部分。任何帮助,将不胜感激!.. 谢谢。 最佳答案
我是一名优秀的程序员,十分优秀!