首页 > 系统相关 >Android Bitmap内存溢出问题解释

Android Bitmap内存溢出问题解释

时间:2023-04-30 11:01:31浏览次数:41  
标签:Bitmap BitmapFactory 参数 内存 报错 Android native


Android平台在图片处理方面经常会出现OOM的问题,在去年开发的一个项目中,我也一直被这个问题所困扰,在这方面也搜集了许多的资料,今天仅仅针对Android平台的Bitmap说事儿,今后再对内存的问题做详细的探讨,android平台对图片解码这块确实设置的有内存上限,在解码Bitmap的时候android平台会对其需要占用的内存进行Check,一旦需要的内存超越上限,则直接报错,下面援引邓凡平老师的解释:



createBitmap好像有一个参数,可以绕过虚拟机的堆栈检查。内存报错其实是先检查是否超过限制,比如最大16M,你要分配32M,检查的时候超标,则会报错。除此之外,没有别的办法可以解决该问题。我们当时测试了30M的图片分配,如果不加该参数,则必然报错。加了就没事了。该参数是hidden的。你必须用源码编译才可以。而只有那个函数可以用。其余都用不了。该参数是BitmapFactory.options类的public boolean inNativeAlloc。不过4.0已经去掉该参数了。所以这个办法可能也不行。

你最好分析下你的图片尺寸大小,实在不行的话,把buffer传递给native层,然后在native层做修改。记住我刚才说的,内存检查是Bitmap自己去check的。native层其实malloc/new多大内存都无所谓,只要你不去check。



这个参数就是:



BitmapFactory.Options options = new BitmapFactory.Options();
   
options.inNativeAlloc = true;



接下来我查证了SDK的文档,其中BitmapFactory.Options中并没有inNativeAlloc这个参数,为了查证这个参数,我继续查看了Android系统源代码的BitmapFactory部分,在其中找到了该参数,以下是对该参数的描述:

       


我在Android Developers 论坛上找到了一段话:
> On Wed, Jun 8, 2011 at 10:17 AM, Erik R wrote:
> > I'm working on a simple image manipulation app that requires opening
> > bitmaps at full resolution, which of course results in OutOfMemory
> > issues. I know that the short answer is to simply use less memory via
> > BitmapFactory's inSampleSize Option to downsample the bitmap, but for
> > this app I really would like to retain the full resolution for
> > editing. One solution I have been investigating is loading the bitmap
> > entirely on the native heap, after learning that the memory limitation
> > is only imposed within the Dalvik VM heap. A look into the Android
> > source code revealed that this is already the case... BitmapFactory
> > uses native methods to load a bitmap on the native heap, while
> > maintaining a reference to it on the VM heap. The issue then is that
> > it appears the native memory used by the bitmap is actually counted
> > against the available VM memory, when it really isn't there. A look
> > into the stock Camera and Gallery apps' source revealed that they get
> > around this by using an additional BitmapFactory Option,
> > inNativeAlloc. I was able to find this field in the Java code for
> > BitmapFactory:





但是这个参数是hidden的,在使用中需要带源码编译才可以。


总之,使用这个参数确实能避开内存检查,并且系统自带的图片浏览器中也使用了这个参数,但是注意,这个参数仅仅在4.0以下平台适用。

标签:Bitmap,BitmapFactory,参数,内存,报错,Android,native
From: https://blog.51cto.com/u_548275/6237803

相关文章

  • Android开发中立即停止AsyncTask和…
    程序开发中经常会有立即停止线程运行的需要,而通过api是没有办法实现这个目的的,因此对于这个情况,我们需要采取一些“特殊”的方式来实现:  1,判断标志位的办法:  我们要知道在java的线程中,没有办法停止一个正在运行中的线程。在Android的AsyncTask中也是一样的。如果必须要停......
  • android上传base64的字符图片
    一般来说,目前在手机端上传图片,方法挺多的,不过常用的就是一个文件流,另一个是二进制转base64的字符流,下面分享一下方法网络上都是千篇一律的写法,对于上传过程中失败的问题也很少提及,上传失败的bug,主要的原因当然是编码字符的问题了,一般网上都没有介绍,记得要将base64的字符串转......
  • Android 用户界面---样式和主…
    样式是给View或Window指定外观和格式的属性集合。样式能够指定如高、边距、字体颜色、字体尺寸、背景颜色等属性。样式被定义在一个与布局XML文件分开的XML资源文件中。Android中的样式与Web设计中的层叠式样表类似,允许与内容分开设计。例如,通过使用样式,可以把下面这个布局XML转换......
  • Android应用程序的安装位置(二)
    不应该安装在外部存储器上的应用程序当用户启用USB存储器来跟计算机共享文件时(或者是卸载或移除外部存储器),任何被安装在外部存储器上,并且当前正在运行的应用程序都会被杀死。在USB存储器被禁用和外部存储器被重新挂载到设备上之前,系统不会有效的感知到引用程序的存在。除了终止应......
  • 解决联想拯救者开机运行内存过高
    1、使用win+R键打开cmd窗口2、输入MdSched进入内存诊断3、选择立即重启诊断缺点:过一段时间内存有开始增加了,这种方式只能解决一段时间,不能一劳永逸。时间:2023-04-29......
  • python 读写sqlite3 读写内存中的数据库
    Python中,可以使用标准库sqlite3来读写SQLite数据库。下面是一个示例代码,展示如何连接到SQLite数据库,创建表格,插入数据,查询数据和关闭数据库:importsqlite3#连接到数据库conn=sqlite3.connect('example.db')#创建一个表格conn.execute('''CREATETABLEIFNOTE......
  • 内存映射
     /*内存映射:是将磁盘文件数据映射到内存,用户通过修改内存就能修改磁盘文件#include<sys/mman.h>void*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset);功能:将一个文件或......
  • C内存分配
    堆上内存分配1.brk()和sbrk()progambreakprogrambreak记录了堆顶的地址,当使用brk或者sbrk系统调用时,programbreak的位置会随之改变brk()#include<unistd.h>intbrk(void*end_data_segment);brk(void*end_data_segment)将programbreak抬升到end_data_segment处,成......
  • uniapp android app 铃声静音,真正的免打扰
    需要加入这个权限:<uses-permissionandroid:name=\"android.permission.ACCESS_NOTIFICATION_POLICY\"/>代码:/***设置铃声为静音,媒体音量不变(免打扰)**/setDisturb(){//#ifd......
  • Unity中Android API 28之后无法HTTP请求
    本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。洪流学堂公众号回复log,获取最新版运行时查看日志的工具。小新:“最近我升级到AndroidAPILevel28之后,发现发布的安卓包,网络请求都不通了,这是咋回事啊?”大智:“遇到这种问题,调试的时候首先去看日志,你研究运行日......