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

本文介绍了Android中如何通过配置文件定义应用组件运行的进程,并探讨了如何管理和绕过默认的24MB内存限制,包括使用NDK进行原生内存分配及利用OpenGL纹理等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android:process

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

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

 

Android是支持多进程的,每个进程的内存使用限制一般为24MB的内存,所以当完成一些很耗费内存的操作如处理高分辨率图片时,需要单独开一个进程来执行该操作(上面的配置可以用来实现该操作)。即便如此,开发者还是不要随意多开进程来耗费用户的资源。(内存限制,有16MB,24MB, 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.

What’s 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, that’s 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, it’s 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. It’s 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.


<think>好的,我现在需要回答用户关于在Android P的Framework层修改APK内存使用值的问题。首先,我得确认用户的具体需求是什么。他们可能想要调整某个特定APK的内存限制,或者优化系统整体的内存管理。不过,用户提到的是修改内存值,这可能涉及到调整Dalvik堆的大小、进程的内存限制,或者OOM(Out Of Memory)调整等。 接下来,我得回忆一下Android P的内存管理机制。Android应用运行在Dalvik虚拟机或者ART(Android Runtime)上,每个应用都有自己的内存堆,这个堆的大小由系统根据设备配置动态分配。在Framework层,相关的代码可能位于ActivityManagerService或者ProcessList等类中,这些类负责管理应用进程和内存分配。 然后,我需要考虑用户是否有足够的权限和技术背景来进行这样的修改。因为修改Framework层的代码需要系统级别的权限,可能需要编译AOSP(Android Open Source Project)并刷机。普通应用开发者无法直接修改这些部分,所以用户可能是系统开发人员或者ROM定制者。 接下来,我需要确定具体的修改点。比如,在ProcessList.java中,有一个方法叫做computeNextPssTime,可能涉及到内存计算。另外,在ActivityManagerService中,处理进程的创建和内存状态的部分可能需要调整。用户可能需要修改应用的最大内存限制,比如调整dalvik.vm.heapgrowthlimit或者dalvik.vm.heapsize等系统属性,或者直接修改代码中的相关变量。 另外,需要考虑的是,修改这些值可能会影响系统的稳定性和性能。过高的内存限制可能导致应用占用过多内存引发OOM异常或者其他应用被杀死。因此,在修改时需要谨慎测试。 可能的步骤包括: 1. 下载并编译AOSP源码,切换到android-9.0.0_r分支。 2. 在Framework/base/services/core/java/com/android/server/am/ProcessList.java中找到相关的内存限制参数,比如OOM调整系数或者应用堆大小。 3. 修改对应的变量,如mMaxCachedProcesses或者调整computeNextPssTime中的计算逻辑。 4. 重新编译系统镜像并刷入设备进行测试。 5. 使用adb shell dumpsys meminfo或者其他工具验证修改后的内存值是否生效。 需要注意,不同的设备可能有不同的默认内存配置,修改前需要了解设备的具体情况。此外,修改系统源码需要一定的编译和调试经验,可能涉及多次尝试和错误排查。 最后,我需要提醒用户,这样的修改属于系统级定制,存在风险,可能导致设备不稳定,需谨慎操作,并确保遵守相关法律法规和许可协议。</think>在Android P的Framework层修改APK内存使用值需涉及系统级调整,需谨慎操作。以下是分步骤说明: --- ### **1. 理解Android内存管理机制** - **堆内存限制**:每个应用进程的堆大小由`dalvik.vm.heapgrowthlimit`(普通应用)和`dalvik.vm.heapsize`(largeHeap应用)定义。 - **进程优先级与OOM**:系统通过`ActivityManagerService`管理进程优先级,结合`lmkd`(Low Memory Killer Daemon)决定何时回收内存。 --- ### **2. 定位Framework层关键代码** 修改内存相关参数需修改AOSP源码,重点文件包括: - **`ProcessList.java`** 路径:`frameworks/base/services/core/java/com/android/server/am/ProcessList.java` 关键变量:`MAX_CACHED_PROCESSES`(最大缓存进程数)、`mMaxCachedProcesses`(动态调整缓存数)。 - **`ActivityManagerService.java`** 管理进程生命周期,如`startProcessLocked()`方法中设置内存参数。 --- ### **3. 修改内存限制参数** #### **示例:调整应用堆大小** 1. **修改`ProcessList.java`中的默认值** 搜索`computeNextPssTime`方法,调整以下参数: ```java // 调整进程内存计算周期(单位:毫秒) static final long PSS_SAFE_TIME_FROM_STATE_CHANGE = 10 * 1000; ``` 2. **调整OOM配置** 在`updateOomLevels`方法中修改OOM_ADJ系数,影响进程回收优先级: ```java // 降低后台进程的OOM_ADJ值,减少被杀概率 mOomAdj[PROCESS_STATE_CACHED_EMPTY] = 900; ``` --- ### **4. 编译与刷机** 1. 下载Android P源码: ```bash repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_rXX repo sync ``` 2. 修改代码后编译系统镜像: ```bash source build/envsetup.sh lunch <device_codename>-userdebug make -j8 ``` 3. 刷入设备并测试。 --- ### **5. 验证修改效果** - **查看进程内存限制** ```bash adb shell dumpsys meminfo <package_name> ``` - **检查OOM配置** ```bash adb shell cat /sys/module/lowmemorykiller/parameters/minfree ``` --- ### **注意事项** - **兼容性问题**:不同设备的默认内存配置可能不同,需结合硬件调整。 - **稳定性风险**:过度放宽内存限制可能导致系统卡顿或崩溃。 - **法律合规性**:修改系统源码需遵守Apache License 2.0及设备厂商协议。 --- 通过上述步骤,可在Framework层调整APK的内存使用值,但需系统开发权限和深入测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值