admin管理员组

文章数量:1551421

引入          目前市面上,Android上的防骚扰类应用非常多,比如腾讯手机管家、360手机卫士、金山手机卫士等。由于受Android OS设计框架,他们的来电拦截实现,都是通过接受com.android.phone进程所发送的广播而实现。具体的实现方案,网上有很多教程,在此不再叙述。      采用上述的方案实现来电拦截,存在一个先天性的技术缺陷——每当有来电时,都会跳到系统来电UI,而且还伴有短暂的铃声,之后才会被挂断。究其原因,主要是因为Android RIL的JAVA的响应逻辑,在com.android.phone实现的,也就是说,当有来电时,会先经由com.android.phone处理,之后才对外发送广播。因此,无论技术处理上如何快速,前面所说的技术缺陷也是无法解决的。当然,如果在有root的情况下,就有完善的实现方案,也就是接下来准备介绍的方案——基于Android RIL层的来电拦截方案。
前提      本次的技术可行性分析,是建立在已经成功实现在Android上进行so和dex注入的基础上。
原理      通过分析来电在RIL层的消息传递流程, 并寻流程中的所有“连接点”。然后选择最适合的“连接点”进行代码注入。所谓“连接点”有很多表现形式,总结起来,主要有两种:一种是方法重写(类与类之间的关系);一种包装(实体与实体的关系)。当然这两种方式,都是代码级别的,如果跳出代码级别,那在JAVA每一个函数的调用,都可以是一个“连接点“(比如通过修改JNI的methodID的结构体中native方法的指针地址等)。      而本次技术方案的实现,则同时使用了上面所介绍的两种方式,下面有详细介绍。
分析      网上关于Android RIL原理的介绍,也有很多,在此推荐链接 http://www.360doc/content/11/0221/10/474846_94752600.shtml。      在了解了RIL的工作原理之后,再来了解RIL层的来电拦截,就非常容易了。在JAVA层,由于由com.android.phone通过localsocket( http://www.linuxidc/Linux/2012-07/65506.htm)跟rild进行通讯。当有来电的时候,rild会通知com.android.phone,下面是关于XXXX_CALL_RING的通讯流程分析(JAVA层):
RIL$RILReceiver.run
RIL.readRilMessage

本文标签: 原理技术androidRIL