Android如何让APP进程常驻内存?

如何让Android程序常驻内存,像QQ一样拥有强劲的生命力不被系统杀死?它传说中的进程保活(人类也在探索永生不死,App亦然),本文将会介绍进程保活的黑魔法,我想绝大部分开发者都会对它感兴趣。

进程保活的常见方案

黑色保活

何为黑色保活?就是利用不同App进程用广播相互唤醒。例如:

  • 开机、网络切换、拍照、利用系统产生的广播唤醒app。
  • 接入SDK,比如微信SDK会唤醒微信,支付宝SDK会唤醒支付宝。
  • 假如你的手机安装了支付宝,淘宝等阿里系的app,那么你打开任意一个阿里系app后,就可以唤醒其他的阿里系app

    目前Google已经意识到这些问题,所以在Android N中取消了ACTION_NEW_PICTURE,CONNECTIVITY_ACTION等广播。

白色保活

这种进程保活方式非常简单,就是采用系统接口,启动前台Service,这样你会在通知栏看到一个Notification,让用户明确的感知到你在运行中。

灰色保活

这种保活手段目前应用非常广泛,它利用系统漏洞启动一个前台Service,与白色保活的区别在于,它不会在通知栏显示Notification,这样一来用户就无法察觉到运行着一个前台进程,但是你的进程优先级又是高于普通后台进程的。 目前很多app都采用灰色保活手段(微信,QQ),接下来我们一起来验证一下。以微信为例,首先打开微信,然后home键,确认通知栏无Notification,然后进入adb shell执行如下shell命令: dumpsys activity services com.tencent.mm

dumpsys_activity_services

通过以上命令,打印出指定包名进程中的Service信息,你会看到isForeground=true的信息,但是通知栏却没有看到Notification。这就是进程保活的黑魔法。

继续阅读

LeakCanary源码分析第三讲-HeapAnalyzerService详解

前面的两篇文章介绍了LeakCanary的核心架构RefWatcher的工作原理,其核心内容就是查找泄漏对象的最短引用路径,这些工作都是在HeapAnalyzerService中完成的。

HeapAnalyzer

HeapAnalyzerService通过调用HeapAnalyzer的checkForLeak方法来进一步分析内存,使用HAHA将RefWatcher传递过来hprof文件解析成Snapshot对象,其中调用的方法包括SnapshotFactory的parse和HprofIndexBuilder的fill方法。解析得到的SnapShot对象和我们用MAT分析内存得出的对象结构类似,其源码如下:

它构建了一颗对象引用关系树,我们可以在这颗树中查询各个Object的信息,包括Class信息、内存地址、持有的引用以及被持有引用的关系。

继续阅读

Greendao Query and QueryBuilder

greenDao查询(Queries)

Queries帮助你返回entities。你可以使用Raw SQL(原生查询)构造查询,然而使用greenDao的QueryBuilder API才是更加优雅的方式。Queries支持lazy-loading的查询结果。

当处理一个较大的结果集时,lazy-loading(懒加载模式)可以节省内存提高性能。

QueryBuilder

你可以使用QueryBuilder 创建自定义查询,而不用做丑陋的SQL拼接。毕竟不是每一个人都擅长写SQL,并且还容易出错。QueryBuilder使用非常方便,它将你从SQL编写中解脱出来。妈妈再也不用担心写SQL时出现bug了,因为语法检查是在编译时进行的。 继续阅读

如何计算Bitmap图片在Android系统中占用的内存大小

Android系统内存是非常有限的,一定要好好珍惜,不要等到OOM才追悔莫及。Android app中最占用内存的也是就图片了。那么我们就有必要弄清楚,Bitmap图片在Android中占用了多少内存。

图片在内存中的存储模型

我们可以将图片在内存中的存储模型想象成一个长方体,它的长、宽、高分别表示图片的宽度、高度、颜色深度。那么Bitmap图片在内存中的大小计算就变成了计算长方体的体积:Bitmap Memroy size = width * height * 颜色深度,那么这里的颜色深度是什么意思呢?

rectengle

色彩存储

我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示Red,G表示Green,B表示Blue,所有的可见色都是由红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值,下表中对四种颜色模式的详细描述,以及每种色彩模式占用的字节数(也就是颜色深度值

颜色深度简单说就是最多支持多少种颜色。一般是用“位”来描述的。

模式 描述 占用字节
Bitmap.Config.AlPHA Alpha由8位组成 1B
Bitmap.Config.ARGB_4444 4个4位组成16位,每个色彩元素站4位 2B
Bitmap.Config.ARGB_8888 4个8为组成32位,每个色彩元素站8位 4B
Bitmap.Config.RGB_565 R为5位,G为6位,B为5位共16位,没有Alpha 2B

实例讲解 继续阅读

LeakCanary源码分析第二讲-RefWatcher详解

如果你已经阅读了LeakCanary源码分析第一讲,那么LeakCanary的基本架构应该已经掌握了。本文将详细分析RefWatcher的工作原理,当RefWatcher检查到引用路径不是弱通路的时候就会触发HeapDumper

WeakReference和ReferenceQueue

要理解RefWatcher的工作原理,首先需要知道WeakReference。当GC线程扫描它所管辖的内存区域时,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否(这一点与SoftReference不同),都会回收它的内存。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。 WeakReference_obj WeakReference和ReferenceQueue联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。上图中的实线a表示强引用,虚线aa表示弱引用。如果切断a,那么Object对象将会被回收。正如下面这段测试代码所示。 继续阅读