基于Android RIL层实现来电拦截的技术原理(一)

引入
         目前市面上,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.com/content/11/0221/10/474846_94752600.shtml
     在了解了RIL的工作原理之后,再来了解RIL层的来电拦截,就非常容易了。在JAVA层,由于由com.android.phone通过localsocket( http://www.linuxidc.com/Linux/2012-07/65506.htm)跟rild进行通讯。当有来电的时候,rild会通知com.android.phone,下面是关于XXXX_CALL_RING的通讯流程分析(JAVA层):

RIL$RILReceiver.run
RIL.readRilMessage
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值