tal*_*kol 5 android memory-management bitmap static-libraries android-ndk
根据设计,Android应用程序在可以使用的堆内存量方面非常有限.旧设备上SDK应用程序的限制只有16MB.这种设计选择通常是有意义的,因为操作系统试图在通常内存非常低的设备上支持多任务处理 - 因此每个任务都有自己的小配给.
内存限制因设备而异.以三星Galaxy S2为例,每个应用程序的介于32MB-64MB之间.该设备具有1GB的RAM,因此单个任务只能使用设备可提供的5%左右.
值得一提的是iOS上的内存策略是非常不同的.据我所知,iOS应用程序可以使用多少内存没有外部强制限制.您可以根据需要分配,直到系统内存不足.如果你太贪心,其他后台应用程序将被终止.
让我们解决这个问题 - 这不是关于哪种内存策略更好的讨论.
对于某些类型的应用程序,Android上的内存限制很难实现.图形密集型应用程序(如游戏)需要大量内存来保存位图.即使是Web浏览器也很难在默认限制下实现.
当资源优化不够时,克服内存限制的标准策略是使用NDK.Android中的"本机"堆没有人为限制,其行为与iOS上的堆非常相似.使用"本地"堆来保存位图效果很好-这实际上是位图是如何被保存在Android 2.3.3和更低(在JVM仍限于这些人为虽然).
我正在寻找一个NDK + JNI库来保存"本机"堆中的无限位图.它的Java接口应该与stock位图API相同.我不知道为此目的的任何公共项目,并将感谢您的帮助,找到一个.如果您之前已实现此功能并愿意共享您的代码,那么也将不胜感激.
最后评论:请不要讨论将公共图书馆提供给公众的道德问题.
最近 2GB 设备的堆限制约为 192MB。需要大量内存的应用程序(例如图像编辑器)可以包含android:largeHeap=true在应用程序清单中,以将内存增加到更高的限制(目前约为 512MB)。
绕过限制通常是一个坏主意。它根据物理内存量、显示尺寸以及设备在运行大量应用程序时的性能在每个设备上进行校准。请记住,在 Android 上,您的应用程序并不是唯一存在的东西,并且并非所有物理内存都专门为应用程序保留(很大一部分进入内核,用于图形和视频内容的多个帧的缓冲区等) 。
您的应用程序越大,被杀死的可能性就越大。内核非常努力地不杀死前台应用程序,这意味着您将开始挤出后台进程,或者导致它们进行大量分页和重新启动,从而开始影响游戏的性能。
说了这么多,我想你正在寻找这个。