allan1st
2015-05-06 19:17:55 +08:00
另外科普一下 Android 内存和 GC Bitmap 等知识,浅见,如果有错误请指出:
比方说你的 Android App 需要显示一张图,计算简单就算它 1024*1024 像素,这张图的 Bitmap 在内存里面占用 2M (RGB565)和 4M (RGB8888),只要这张图片还在屏幕上显示,那么它必须存在内存里;反之不然:bitmap 会继续保持在内存里,这样你下次要显示这张图片就会一下子读取出来,因为内存是非常快的。如果 App 需要更多的内存怎么办,Android 的 Delvik/ART 会做一次 GC,回收那些已经移出屏幕外边的 bitmap,因此你就有更多内存可以读取新图片了。
那么什么时候会崩溃和卡呢?
1. 卡:
图片太大或者太密集,导致频繁的 GC:Android 的 GC 是 stop the world 的,主线程也会因此受到阻塞,如果阻塞时间大于 16ms (60分之一秒),那么就会掉帧,也就是卡。
另外和系统也有关系:
三星 Galaxy S4 内存1G。最新系统好像是 4.1。一次 GC 居然要用20ms 以上,每个 App 基本只有 50m 左右分配到的空间,那么必须卡。
Moto G 1st gen 内存1G。最新系统 Android 5,用的 ART,一次 GC 只有 2-5ms,而且每个 app 可以分到 60 - 80M 左右,看上去流畅的像飞一样。
2. 崩溃
有些垃圾程序员不知道 ListView/RecyclerView 可以回收重用,或者自己写了个很差劲的 Cache,或者很多 Activity 内存泄露,那么可用的内存就越来越少,等到真的要用内存的时候就不够了,这样就会 out-of-memory 了,也就是奔溃了。
一个优秀的 app 是不可能在你切换到后台后还在 Running 里面看到占用几十一百M 的内存的;它只会出现在 Cached Processes 里面,这是系统随时可以回收的部分。
希望能够帮助你们判断 App 到底好不好,而不是看到一个图片为主的 app 达到了100M 就认为它流氓。