将Android应用程序分为两个进程,以便其中一个进程可用于位图操作,以避免出现内存错误

将Android应用程序分为两个进程,以便其中一个进程可用于位图操作,以避免出现内存错误,android,Android,据我所知,我们可以选择为Android应用程序中逻辑上分离的部分分配不同的进程,而据我所知,新进程将为其留出一个新的堆部分 假设我们的应用程序使用了128MB堆中的90-100MB,我们需要使用50mb位图执行操作 没有时间重写、重构和优化代码,因此应用程序使用的内存大大减少 我们是否可以为处理那些重量级位图操作的活动分配不同的进程ID,以避免OutOfMemoryError,如果可能的话,它的缺点是什么 我已经读过了: 但这并不像我的问题那么具体 在这里: 有人提到,这实际上可能会增加RAM

据我所知,我们可以选择为Android应用程序中逻辑上分离的部分分配不同的进程,而据我所知,新进程将为其留出一个新的堆部分

假设我们的应用程序使用了128MB堆中的90-100MB,我们需要使用50mb位图执行操作

没有时间重写、重构和优化代码,因此应用程序使用的内存大大减少

我们是否可以为处理那些重量级位图操作的活动分配不同的进程ID,以避免OutOfMemoryError,如果可能的话,它的缺点是什么

我已经读过了: 但这并不像我的问题那么具体

在这里:

有人提到,这实际上可能会增加RAM占用空间,但他们还没有详细说明

我们可以为处理那些重量级位图操作的活动分配不同的进程ID吗

您可以使用清单中的
android:process
属性在单独的进程中运行该活动

所以我们避免了OutOfMemory错误

这不是保证。事实上,鉴于以下引用的声明,这甚至不太可能

假设我们的应用程序使用了128MB堆中的90-100MB

您无法保证获得超过16MB的数据。即使使用android:largeHeap=“true”,您也无法获得比没有该属性时更多的堆空间。不要假设任一进程都必须有50MB的堆空间,除非您控制硬件

如果可能的话,它的缺点是什么

它可能并没有帮助,除非您的第一个进程中并没有需要讨论中的位图。因此,例如,如果您的第一个进程是使用
camera
API拍摄相机照片,那么您将在第一个进程中获得整个位图(或者尝试崩溃)。OTOH,如果位图仅在第一个进程中下载,并且您的方式正确(将结果流式传输到文件),那么它可能会帮助解决您的问题

但是,这确实意味着位图处理活动的启动会有点慢,因为它必须从磁盘读取位图,或者根据需要自行下载

活动需要的任何非IPC通信(例如,事件总线、单例缓存)将不存在

进程在后台时被终止以释放系统RAM。在你的情况下,这可能是两个过程中的任何一个。您需要能够处理用户离开您的应用程序(如HOME按钮)并且您的一个或两个进程在此期间被终止的情况。当第二个进程在前台时,您的第一个进程将被终止也不是不可能的——在这个场景中,我没有检查进程重要性值,因为两个进程都属于同一个Android应用程序

而且,如前所述,您无法保证完全干净的进程能够将50MB位图加载到Dalvik/ART堆中

有人提到,这实际上可能会增加RAM占用空间,但他们还没有详细说明

内存占用!=堆空间。RAM footprint指与应用程序关联的系统RAM总量。当两个进程都在运行时,您将使用比只使用一个进程执行相同工作更多的系统RAM。位图处理过程将在活动处于前台时进行,之后的一段时间内,在Android最终终止它以释放系统RAM之前

没有时间重写、重构和优化代码,因此应用程序使用的内存大大减少

除非你控制硬件,否则你真的别无选择。您可以相当确定可以在RAM中处理50MB数据的唯一方法是通过NDK,因为本机分配(
malloc()
和friends)来自系统RAM,而不是Dalvik/ART堆,因此不计入该堆限制

我们可以为处理那些重量级位图操作的活动分配不同的进程ID吗

您可以使用清单中的
android:process
属性在单独的进程中运行该活动

所以我们避免了OutOfMemory错误

这不是保证。事实上,鉴于以下引用的声明,这甚至不太可能

假设我们的应用程序使用了128MB堆中的90-100MB

您无法保证获得超过16MB的数据。即使使用android:largeHeap=“true”,您也无法获得比没有该属性时更多的堆空间。不要假设任一进程都必须有50MB的堆空间,除非您控制硬件

如果可能的话,它的缺点是什么

它可能并没有帮助,除非您的第一个进程中并没有需要讨论中的位图。因此,例如,如果您的第一个进程是使用
camera
API拍摄相机照片,那么您将在第一个进程中获得整个位图(或者尝试崩溃)。OTOH,如果位图仅在第一个进程中下载,并且您的方式正确(将结果流式传输到文件),那么它可能会帮助解决您的问题

但是,这确实意味着位图处理活动的启动会有点慢,因为它必须从磁盘读取位图,或者根据需要自行下载

活动需要的任何非IPC通信(例如,事件总线、单例缓存)将不存在

进程在后台时被终止以释放系统RAM。在你的情况下,这可能是两个过程中的任何一个。你需要能够