作者归档:heisedeyueya

域名解析失败—serverHold

今天注册了lovedbymm.com这个域名,然后配置阿里云的DNS解析,发现解析无法生效。于是排查原因,通过whois.aliyun.com查询域名状态如下: whois_serverHold

域名状态为serverHold,主要原因就是域名没有备案。域名在这个状态下,所有解析都无法生效,要取消这个状态,只有通过注册商,向CNNIC提交该域名的备案号,CNNIC会在三个工作日内审核并取消该状态。

继续阅读

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信息、内存地址、持有的引用以及被持有引用的关系。

继续阅读

百度云加速服务导致SQL以及敏感代码数据提交异常

问题描述

由于我的博客采用百度云加速服务,博客中经常会有敏感代码,和SQL语句需要提交,但是由于云加速服务开启了安全防护策略。导致数据提交异常。如下图 baidu_clound_reject

解决方案

遇到问题之后首先想到的是去百度云加速设置白名单,将自己的IP段加入到白名单,如下图: baidu_waf

抱着见证奇迹的心情我再一次保存文章,还是无法提交。简直崩溃。一气之下我将百度云加速的Web防火墙关闭,再提交就可以了。所以目前找到的方法就是先关闭防火墙提交之后再打开。

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了,因为语法检查是在编译时进行的。 继续阅读