Android内存优化之系统预制资源sPreloadedDrawables

  private void clearPreloadedResources() {

    Resources resource = getApplicationContext().getResources();

    try {
      Field field = Resources.class.getDeclaredField("sPreloadedDrawables");
      field.setAccessible(true);
      LongSparseArray<Drawable.ConstantState>[] sPreloadedDrawables = (LongSparseArray<Drawable.ConstantState>[]) field
          .get(resource);
      for (LongSparseArray<Drawable.ConstantState> s : sPreloadedDrawables) {
        s.clear();
      }
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    }

  }

在应用起来之后清除系统预加载资源,效果显著

使用场景

在没有使用系统资源的进程中使用,有的手机型号也是可以的,发现在华为荣耀6上面是会出现资源显示异常,联想手机也有

原理

sPreloadedDrawables是在zygoteinit中执行的,当应用进程启动之后fork进程的时候会把这些与加载资源全部fork过来

实验

新建一个HelloWorld
查看内存占用22M
清除预加载资源后
查看内存占用2M
测试机型小米4
使用不同机型可能会不一样,不同厂商rom加载的预制资源不相同

    原文作者:skyline大鑫
    原文地址: https://www.jianshu.com/p/477552a346ab
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞