`

由android:process引发的内存限制的问题

阅读更多

android:process

定义activity运行所在的进程名称。一般情况下,应用的所有组件都运行在为应用创建的默认的进程中,该默认进程的名称应用包名称一致。通过定义<application>元素的“process”属性可以为所有组件指定一个不同的默认进程。但是任意组件都可以重写默认进程,以便实现多进程操作。

如果该属性指定名称以“:”开头,则一个新的专属于该应用的进程将会被创建。如果该进程名以小写字母开头,则为该activity提供权限以让其在一个全局的进程中运行。这样会允许多个应用的不同组件共用一个进程,以便节省资源。

 

Android是支持多进程的,每个进程的内存使用限制一般为24MB的内存,所以当完成一些很耗费内存的操作如处理高分辨率图片时,需要单独开一个进程来执行该操作(上面的配置可以用来实现该操作)。即便如此,开发者还是不要随意多开进程来耗费用户的资源。(内存限制,有16MB24MB 32MB,很老的机型的内存限制会是16MB,这个具体还要再搜索下资料。。)

 

另外一些还有一些其他的方式来绕过内存限制,使用更多的资源来完成自己的任务,如下文(有待实践):

                                 How to work around Androids 24 MB memory limit

The Android framework enforces a per-process 24 MB memory limit. On some older devices, such as the G1, the limit is even lower at 16 MB.

Whats more, the memory used by Bitmaps is included in the limit. For an application manipulating images it is pretty easy to reach this limit and get the process killed with an OOM exception:

E/dalvikvm-heap(12517): 1048576-byte external allocation too large for this process.
E/GraphicsJNI(12517): VM won't let us allocate 1048576 bytes
D/AndroidRuntime(12517): Shutting down VM
W/dalvikvm(12517): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0)
E/AndroidRuntime(12517): FATAL EXCEPTION: main
E/AndroidRuntime(12517): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

This limit is ridiculously low. For a device, like the Nexus One, with 512MB of physical RAM, setting the per-process memory limit for the foreground activity to only 5% of the RAM is a silly mistake. But anyway, thats how things are and we have to live with it i.e. find how to work around it.

There are two ways to allocate much more memory than the limit:

One way is to allocate memory from native code. Using the NDK (native development kit) and JNI, its possible to allocate memory from the C level (e.g. malloc/free or new/delete), and such allocations are not counted towards the 24 MB limit. Its true, allocating memory from native code is not as convenient as from Java, but it can be used to store some large amounts of data in RAM (even image data).

Another way, which works well for images, is to use OpenGL textures the texture memory is not counted towards the limit.

To see how much memory your app has really allocated you can use android.os.Debug.getNativeHeapAllocatedSize().

Using either of the two techniques presented above, on a Nexus One, I could easily allocate 300MB for a single foreground process more than 10 times the default 24 MB limit.

分享到:
评论
7 楼 jlyybz 2014-08-15  
学习了
6 楼 337240552 2012-07-25  
亲们 不要用remote这个字就可以了 你安装规则 随便起个 比如com.hoot.remote_service就不会报哪个错了
5 楼 337240552 2012-07-25  
android:process="remote"这个属性 貌似能成功的没几个人
4 楼 MichelleWang 2012-06-29  
ericchan2012 写道
<service android:name=".AidlService"
             android:exported="true"
             android:process="remote"
                >
                <intent-filter>
                    <action android:name="com.mine.aidlserver.aidlserver" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </service>

在安装的时候,老是Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,请问是什么问题

这个。。问题有很多可能的。。
3 楼 ericchan2012 2012-06-06  
<service android:name=".AidlService"
             android:exported="true"
             android:process="remote"
                >
                <intent-filter>
                    <action android:name="com.mine.aidlserver.aidlserver" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </service>

在安装的时候,老是Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,请问是什么问题
2 楼 MichelleWang 2012-03-29  
2006003845 写道
有好的解决方案否?

已经给出解决方案了,单独开一个进程,但是这种方法尽量少使用,除非你真的要完成很耗内存的操作
1 楼 2006003845 2012-03-27  
有好的解决方案否?

相关推荐

    android检查内存泄露

    android检查内存泄露和用法 &lt;!--==============================================================================--&gt; android:name="com.squareup.leakcanary.internal.HeapAnalyzerService" android:enabled...

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    最快最简单解决手机中进程“android.process.acore”已停止运行问题.docx

    "解决安卓手机进程“android.process.acore”已停止运行问题" 安卓手机中进程“android.process.acore”已停止运行问题是安卓系统中常见的问题之一。该进程是安卓系统中的核心进程,负责管理联系人、电话簿和其他...

    JakeWharton最新力作——Process Phoenix,重启application process.zip

    Process Phoenix是由知名Android开发者Jake Wharton推出的一个开源项目,旨在帮助开发者更加优雅地处理应用程序进程的重启。在Android系统中,应用进程可能会因为各种原因被系统杀死,例如内存不足、系统优化或者...

    Android下线程与进程

    在Android系统中,线程(Thread)和进程(Process)是理解应用程序运行机制的关键概念。它们决定了应用如何分配资源和执行任务,对于优化性能、提高用户体验具有重要意义。 **线程** 线程是程序中的执行流,是操作...

    Software Testing and Analysis: Process, Principles and Techniques

    这本书是一本不可多得的好书。强烈推荐相关测试及开发、管理人员阅读。同时软件分析与测试方面的研究人员也可以将这本书作为入门参考。 这本书的两位作者分别是Mauro Pezzè和Michal Young,两位作者的主页分别是:...

    深入理解Android:卷I--详细书签版

    android的启动速度、虚拟机heapsize的大小调整、watchdog工作原理等问题;第5章讲解了android系统中常用的类,包括sp、wp、refbase、thread等类,同步类,以及java中的handler类和 looper类,掌握这些类的知识后方...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    1. Android内存管理:Android应用程序运行在一个受限的内存环境中,每个应用都有一个由Dalvik虚拟机管理的内存预算。当应用尝试分配的内存超过这个预算时,就会触发OutOfMemoryError。 2. OutOfMemoryError:这是一...

    android单进程示例程序

    在AndroidManifest.xml文件中,我们可以通过设置`android:process`属性来控制组件运行的进程。当这个属性的值未设置或者为空时,组件将运行在应用的默认进程中。如果设置了`android:process`,则组件将在指定的进程...

    深入理解Android:卷2,中文完整扫描版

    《深入理解Android:卷2》共8章:第1章介绍了阅读本书所需要做的准备工作,包括Android 4.0源码的下载和编译、Eclipse环境的搭建,以及Android系统进程(system_process)的调试等;第2章对Java Binder和MessageQueue...

    Android 获取手机总内存和可用内存信息,博客附adb方式

    在Android系统中,获取手机的总内存和可用内存信息是开发者和普通用户都可能需要的操作。这涉及到系统层面的信息查询,通常需要通过编程接口(API)或者使用Android Debug Bridge(ADB)工具来实现。以下是对这个...

    activity的设置大全

    android:process=":my_process" /&gt; ``` #### 十四、`android:screenOrientation` **属性描述:** 此属性用于指定`Activity`的屏幕方向。常见的值包括`unspecified`(默认值)、`landscape`(横屏模式)、`...

    Android进程间通讯——多进程共用SharedPreferences

    在使用SharedPreferences进行进程数据共享时,我们发现,有些虽然过时了,但是实际上还是可以用的。 只是Google不建议大家这么干了。所以这篇文章只是一个介绍实现,科普。 ...

    Android平台Icon.docx

    &lt;activity android:name=".A2" android:label="@string/app_name2" android:process=":process.sub" android:icon="@drawable/icon2" android:launchMode="singleInstance"&gt; &lt;action android:name="android....

    Android Studio启动模拟器失败.docx

    然而,在使用Android Studio时,开发者可能会遇到一些问题,例如启动模拟器失败。这篇文章将介绍Android Studio启动模拟器失败的解决方法。 Android Studio模拟器是Android Studio中的一项功能强大且功能丰rich的...

    Android中获取系统内存信息以及进程信息

    在Android系统中,开发者可以通过Android提供的API来获取系统的内存信息以及正在运行的进程状态。这一功能主要涉及到`ActivityManager`类的使用。`ActivityManager`是Android SDK中的一个关键组件,它提供了对系统...

    一个Oracle server process进程会消耗多少内存

    Server Process 的数量通常由`_processes` 参数决定,而每个Server Process 所占用的内存大小则受到多种因素的影响,如操作系统类型、Oracle版本、执行的操作类型等。 #### 三、Server Process 进程内存消耗的因素...

    Android 通过process进程信息拿到当期正在运行的APP包名

    在Android系统中,每个应用程序都运行在自己的进程中,这些进程由Linux内核管理。了解如何通过分析进程信息来获取当前正在运行的APP包名对于开发者来说是很有价值的。本篇将详细介绍如何利用Java代码实现这一功能,...

    processhacker-2.39-bin

    ProcessHacker是一款强大的系统信息工具,它提供了进程管理、服务管理、硬件监控、内存查看等多种功能,深受系统管理员和高级用户的喜爱。这个"processhacker-2.39-bin"压缩包很可能包含了ProcessHacker的二进制版本...

    BaiduMap_AndroidSDK Sample_demo

    配置AndroidManifest.xml 使用百度SDK时,应用的AndroidManifest.xml主要需要注意以下三项: 4.1、权限 不同的功能需要申请不同的权限,因此在实际使用时,最好参考... android:process=":remote"&gt; ............

Global site tag (gtag.js) - Google Analytics