Skip to content

Bypassing dalvik heap to operate images,will 100% avoid OOM (Maintenance had stopped)绕过dalvik heap操作图片,100%避开OOM

License

Notifications You must be signed in to change notification settings

lzdon/OperatingImageBypassDalvik

 
 

Repository files navigation

停止维护公告

Android 8.0之后bitmap的内存就是创建在native heap中,随着用户不断更换新手机,慢慢都用到8.0更新的系统了,这个库就没有使用的意义了.

绕过Bitmap操作图片,100%防止OOM


我们都知道JVM xmx参数,这个xmx不做具体介绍,这是jvm的基本参数,不了解的请自行查询Java虚拟机原理。

android的Dalvik/ART遵守了JVM的规范,有堆内存限制,遇到大图操作缩放旋转Bitmap的时候,就很容易OOM。

虽然,现在新的android系统提供的这个限制都在调大,我记得6.0官方ROM好像是96M,非官方ROM要大一些,因为非官方ROM在编译时修改了xmx参数配置,但是新出的手机相机拍摄出来的图片更大,相机技术的增长速度远大于这个限制的开放程度,进行大图操作,你懂得。

上面说的核心原因在于你的bitmap内存申请都在dalvik heap中,这个最大内存的限制。 但是native内存处于不太受管理的状态,这一点很多人不知道。

这个库的目的在于绕过Dalvik heap 限制,去操作图片,保证无需担心OOM。怎么绕过Dalvik呢?就是绕过bitmap去直接对图片进行操作,毕竟Android 4.0以后的机器bitmap内存都在Dalvik中,我们所有操作图片时的内存申请都在Native heap中。

证明native heap内存申请无限制

我尝试用native写了个申请巨大内存又不执行free()的代码进行测试,申请了1G多的内存还是不会OOM,下图是我用adb shell dumpsys meminfo PACKAGENAME 打印出来的当前memory信息。

当前仓库进度

  • rotate jpeg

  • compress jpeg

  • resize jpeg

  • compress png (2018.04.10)

    • 提供除了libpng单纯压缩level之外的算法,参考optipng这个古老的开源库
  • rotate png

  • resize png

编译运行提示

该项目需要在外部存储空间(SD卡)根目录下存储一个test.jpg 的大图。 运行项目之后:

    test.jpg ----------compress/rotate---------> test2.jpg
      

了解更多

访问http://androidyuan.com/post/bypassjavadalvikheapopratingimg

特别鸣谢

base on::bither-android-lib

github:libjpeg-turbo

source.android.com/...../dalvik_vm_properties

sourceforge:libjpeg

About

Bypassing dalvik heap to operate images,will 100% avoid OOM (Maintenance had stopped)绕过dalvik heap操作图片,100%避开OOM

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 92.1%
  • C++ 7.3%
  • Other 0.6%