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加载的预制资源不相同