作者归档:heisedeyueya
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
通过以上命令,打印出指定包名进程中的Service信息,你会看到isForeground=true的信息,但是通知栏却没有看到Notification。这就是进程保活的黑魔法。
LeakCanary源码分析第三讲-HeapAnalyzerService详解
前面的两篇文章介绍了LeakCanary的核心架构和RefWatcher的工作原理,其核心内容就是查找泄漏对象的最短引用路径,这些工作都是在HeapAnalyzerService中完成的。
HeapAnalyzer
HeapAnalyzerService通过调用HeapAnalyzer的checkForLeak方法来进一步分析内存,使用HAHA将RefWatcher传递过来hprof文件解析成Snapshot对象,其中调用的方法包括SnapshotFactory的parse和HprofIndexBuilder的fill方法。解析得到的SnapShot对象和我们用MAT分析内存得出的对象结构类似,其源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public AnalysisResult checkForLeak(File heapDumpFile, String referenceKey) { ... ISnapshot snapshot = null; try { snapshot = openSnapshot(heapDumpFile); IObject leakingRef = findLeakingReference(referenceKey, snapshot); // False alarm, weak reference was cleared in between key check and heap dump. if (leakingRef == null) { return noLeak(since(analysisStartNanoTime)); } String className = leakingRef.getClazz().getName(); AnalysisResult result = findLeakTrace(analysisStartNanoTime, snapshot, leakingRef, className, true); if (!result.leakFound) { result = findLeakTrace(analysisStartNanoTime, snapshot, leakingRef, className, false); } return result; } catch (SnapshotException e) { return failure(e, since(analysisStartNanoTime)); } finally { cleanup(heapDumpFile, snapshot); } } |
它构建了一颗对象引用关系树,我们可以在这颗树中查询各个Object的信息,包括Class信息、内存地址、持有的引用以及被持有引用的关系。
百度云加速服务导致SQL以及敏感代码数据提交异常
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了,因为语法检查是在编译时进行的。 继续阅读