PushService,进程空间为私用进程,同时暴露给外部调用
- 使用Android SDK时,需要在Manifest中声明key
- 按照sdk FrontiaApplication使用,追踪代码
继承FrontiaApplication
先解密,其中解密失败进行进行dex加载
如果启动过PushService,则进行dex加载,可能会涉及到push服务本地核心库的静默更新,如果没有启动过则不做任何操作
- 按照sdk启动PushService使用,追踪代码
PushManager.startWork执行很有意思,先调用sdk里面PushManager方法
BridgePushManager中调用plugin-deploy.jar中PushManager的代码
sdk中的PushManager和plugin-deploy.jar中的PushManager包名是不同的,中间的桥接关系由BridgePushManager类完成,可以看作一种桥接模式吧
然后使用LoadExecutor.excuteMethod执行BridgePushManager.startWork,发现LoadExecutor初始化部分去加载sdk中plugin-deploy.jar中的dex文件,那么具体执行startWork的工作就是plugin-deploy.jar中的PushManager来完成
注:在这里可以看出plugin-deploy.jar可以作为插件库,完成静默更新plugin-deploy.jar中PushManager的startWork
广播发给谁具体由a()函数中Internal.createBdussInent()或者PushConstants.createMethodIntent()
其中createBdussInent()函数又调用了n.g()函数,其中n.g()函数中通过调用n.d()函数返回intent,或者createMethodIntent()函数直接调用n.d()函数返回intent,发现此刻intent的action设置为com.baidu.android.pushservice.action.METHOD,回到应用的manifest,注册过RegistrationReceiver的intent-filter中果然有com.baidu.android.pushservice.action.METHOD
进入RegistrationReceiver类,然后立刻定位到onReceive()函数,代码混淆的执行流有点乱,但是还是找到一个函数调用b.a(paramContext, paramIntent)
更进b.a(paramContext, paramIntent),其中代码启动了PushService服务
定位到PushService的onCreate,onStartCommand,onDestroy生命周期函数
onCreate()创建服务,在initPushSDK()中判断是否应该启动本服务,如果判断不应该启动本服务则调用a()函数
initPushSDK()中调用a()函数通过优先级配置项,决定本服务是否启动
onStartCommand()中调用handleOnStart()函数进行心跳包,推送信息接收
handleOnStart()的while循环中掉调用h()函数
在h()函数中调用mPushConnection.d()函数发送心跳包
具体发送操作在c.d()函数中,其中c为abstract class a的实例,找到继承a的类message中的c,定位到d方法
定位到构造arrayOfByte请求包的函数private byte[] a(short paramShort, byte[] paramArrayOfByte)
其中具体构造过程参见d类,具体构造心跳包数据的函数如下,百度心跳包数据体的大小有三种 2/4/8
回到c.d()函数,具体发送操作在a(localb)函数中,其中a(local)函数在abstract class a中实现,其中具体发送操作在com.baidu.android.pushservice.f.a()中
































