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();
}
}
在應(yīng)用起來之后清除系統(tǒng)預(yù)加載資源,效果顯著
使用場景
在沒有使用系統(tǒng)資源的進(jìn)程中使用溶诞,有的手機(jī)型號也是可以的鸯檬,發(fā)現(xiàn)在華為榮耀6上面是會出現(xiàn)資源顯示異常,聯(lián)想手機(jī)也有
原理
sPreloadedDrawables是在zygoteinit中執(zhí)行的螺垢,當(dāng)應(yīng)用進(jìn)程啟動之后fork進(jìn)程的時候會把這些與加載資源全部fork過來
實(shí)驗(yàn)
新建一個HelloWorld
查看內(nèi)存占用22M
清除預(yù)加載資源后
查看內(nèi)存占用2M
測試機(jī)型小米4
使用不同機(jī)型可能會不一樣喧务,不同廠商rom加載的預(yù)制資源不相同