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

本文详细介绍了如何通过Android RIL层的反射机制实现来电拦截,指出并修正了前一部分中ProxyHandler构造函数的问题,以及 RegistrantList 可能被回收的隐患。文章提供了一个DEMO,通过注入自定义的ProxyHandler来控制CallManager的事件响应,实现了来电全拦截,防止手机响铃、振动。此外,通过日志分析,揭示了来电和去电过程中的关键事件流程,为后续功能完善和深入研究奠定了基础。
摘要由CSDN通过智能技术生成

原文相续,书接上一回。

在《Android RIL层实现来电拦截的技术原理(一)》(以下简称《一》),已经详细分析了来电的在RIL层的逻辑走向,但缺少了一个强有力的DEMO作为验证。于是花了些时间,把DEMO也弄出来了,也验证了这个方案的技术可性性。在DEMO的开发过程中,也发现了一些在《一》中错误,等下会说明。

在《一》中,通过JAVA的反射机制,取出位于CallManager中的mIncomingRingRegistrants字段,再通过自定义的ProxyHandler,把定义在mIncomingRingRegistrants里的Handler替换掉,以实现截获这个动作。再回顾一下之前的代码实现:


class ProxyHandler extends Handler {

          private Handler mInnter;


          public  ProxyHandler(Handler h){

               mInnter = h;

          }


          @Override

           public void handleMessage(Message msg) {

               //做爱做的事

               // ......

               // ......


               mInnter.handlerMessage(msg);

           }

 }


     CallManager instance = CallManager.getInstance();


     //通过反射,拿到其字段mIncomingRingRegistrants

     RegistrantList mIncomingRingRegistrants = instance.mIncomingRingRegistrants;

     for(int i=0; i<mIncomingRingRegistrants.size(); i++){

          Registrant item = mIncomingRingRegistrants.get(i);

          

          Handler handler = item.getHandler();

          //通过反射,拿到其字段refH

          item.refH = new WeakReference(new ProxyHandler(handler)); //完成注入

     }



这里存在三个问题,如下:

1. ProxyHandler的构造函数,由于是在一个非Looper线程上执行,因为会发生异常,应该改           为

  public  ProxyHandler(Handler h){

super(h.getLooper);

            mInnter = h;

    }

确保我们的ProxyHandler是挂载到原来Handler的线程上。




      2. Registrant 中的refH,类型WeakReference,即是说我们的ProxyHandler有可能被回收掉;


      3. 通过修改mIncomingRingRegistrants只能监控EVENT_INCOMING_RING一种事件,但在整个来电流程中,是涉及多种事件处理的,因此并不能对整个流程进行把控; 



    因此需要再寻找其它地方进行注入。再回顾一下事件的流程走现,从RIL层开始,如下:



RIL$RILReceiver.run

RIL.readRilMessage

RIL.processResponse

RIL.processUnsolicited

Registrant.notifyRegistrant

Registrant.internalNotifyRegistrant

Handler.sendMessage

Handler.handleMessage

PhoneBase.handleMessage

PhoneBase.notifyIncmoingRing

RegistrantList.notifyRegistrants

RegistrantList.internalNotifyRegistrants

Registrant.internalNotifyRegistrant

Handler.sendMessage

Handler.handleMessage

CallManager.mHandler.handlerMessage(原来是CallManager.handlerMessage,分析有误)

RegistrantList.notifyRegistrants

RegistrantList.internalNotifyRegistrants

Registrant.internalNotifyRegistrant

Handler.sendMessage

评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值