百度云推送消息到达率低问题定位分析

去年做我们这个产品的时候,SE在客户端设计了一个推送功能,SE经过调研决定在Android和IOS端都集成百度的云推送SDK来支持这个推送功能。最近领导在做运营分析的时候,发现云推送的报表显示,在Android端消息的达到率非常低,设备的在线率波动比较大,有时高有时非常低。

首先先快速的学习一下SDK的集成方式,好在这个SDK使用起来还是比较简单的,基本上照着文档做进行了,而且百度还提供了Demo供参考。当然要解决问题光知道怎么用肯定是不行的,接下来就要开始分析问题了。

看来还得靠自己了,于是尝试把SDK jar包反编译,通过代码看看里面的工作原理,但是非常遗憾的是jar包已经混淆过了阅读非常困难,而且核心代码并不在jar包里面而是在so库里面没法反编译。

还有一个重要线索是,在文档里面提到了最新的SDK版本解决了一些高系统版本手机的适配问题,最新的SDK版本是4.4.0,我看看我们应用集成的版本是3.2.0,显然这个版本已经很老了,而这个MATE7手机是最近新出的手机,所以有没有可能是因为版本问题呢?赶紧动手试一下,决定先用新版本的Demo试一下,在试之前为了对比先用老版本的Demo测试一下看看在该手机有没有问题,经过测试是有问题的。接下来用新版本的Demo试一下,惊喜的发现用新的Demo能收到消息了,于是马上把新版本SDK集成到我们的工程里面,代码不用变只需修改manifest中的配置,同老版本相比,新版本需要给PushService增加一个intent-filter action,并且增加一个Service声明CommandService:

      <service
            android:name="com.baidu.android.pushservice.PushService"
            android:exported="true"
            android:process=":bdservice_v1" >
            <intent-filter >
                <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE"/>
            </intent-filter>
        </service>
        <!-- 4.4版本新增的CommandService声明,提升小米和魅族<span id="2_nwp" style="padding: 0px; width: auto; height: auto; float: none;"><a target=_blank id="2_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=17&is_app=0&jk=4df8f727463de319&k=%CA%D6%BB%FA&k0=%CA%D6%BB%FA&kdi0=0&luki=5&n=10&p=baidu&q=65035100_cpr&rb=0&rs=1&seller_id=1&sid=19e33d4627f7f84d&ssp2=1&stid=0&t=tpclicked3_hc&td=1836545&tu=u1836545&u=http%3A%2F%2Fwww%2Ebubuko%2Ecom%2Finfodetail%2D688597%2Ehtml&urlid=0" target="_blank" mpid="2" style="padding: 0px; color: rgb(51, 51, 51); text-decoration: none;"><span style="padding: 0px; color: rgb(0, 0, 255); width: auto; height: auto;">手机</span></a></span>上的实际推送到达率 -->
        <service
            android:name="com.baidu.android.pushservice.CommandService"
            android:exported="true" />
        <!-- push结束 -->

修改之后运行工程(测试的时候要重启 手机 ,开机之后只要有百度推送系的应用运行过我们的应用时可以收到消息的),终于我们的应用也能收到消息,但是还是有个问题,当开机重启之后第一执行我们的应用时,无法收到消息,而且上应用管理查看push服务并没有被启动。在一筹莫展之际在运行日志中发现下面几行可疑日志(因为某些原因比较敏感的信息叉掉了):

03-19 19:57:25.822 D/Utility(7056): Find more higher priority pkg:com.baidu.BaiMap priority = 408,Current highest pkg: com.smart.softclient.music.baseline priority = 0
03-19 19:57:25.822 D/Utility(7056): Current highest priority Push PackageName:com.baidu.BaiMap
03-19 19:57:25.822 D/PushSDK(7056): Current push service:com.smart.softclient.music.baseline should stop!!! highest priority service is: com.baidu.BaiMap
03-19 19:57:25.822 D/PushService(7056): stopSelf:exit --- immediate=true

日志描述得比较清晰,我们的push服务在启动时因为百度地图这个应用又马上被停止了,日志还解释百度地图优先级比较高,了解过推送服务的单服务单通道策略之后这个动作我也能理解,因为只要保证有一个推送服务就可以了,但是比较魂淡的是通过查看应用中运行的服务,发现并没有启动任何推送相关或者百度地图相关的服务,所以这应该是SDK判断规则上的一个bug,我也把这个问题提给度娘了,暂时还没给反馈这到底是不是个问题(昨天提的,速度你懂的~~~)。幸运的是,通过研究发现这个问题是可以规避的,我们可以通过给intent-filter设置android:priority属性来把我们应用的优先级调高,通过上面的日志可以看到百度地图的优先级是408,我把我们的设成1000,只需设置push服务广播和push服务的intent-filter就可以了:

 <!-- push必须的receviver和service声明 -->
        <receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"
            android:process=":bdservice_v1">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
                <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
        </receiver>
       
        <service
            android:name="com.baidu.android.pushservice.PushService"
            android:exported="true"
            android:process=":bdservice_v1" >
            <intent-filter android:priority="1000">
                <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE"/>
            </intent-filter>
        </service>

修改之后发现推送消息正常了,开机之后第一次启动客户端时也能正常的收到消息了,可以查看日志发现现在轮到别的应用因为我们应用的优先级高而停掉服务了。

在我们原来的配置中只监听了切网广播和开机广播,所以如果我们把上面那些流氓行为如加上的话应该是能提高我们的服务存活率的,因为推送的长连接就是在推送服务中建立的,所以推送服务的存活率意味着设备的在线率。把push服务广播(这个广播的功能就是监听到某些系统事件之后尝试启动push服务)改成下面的配置:

<!-- push必须的receviver和service声明 -->
        <receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"
            android:process=":bdservice_v1">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
                <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
		<!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->
		<action android:name="android.intent.action.MEDIA_MOUNTED" />
		<action android:name="android.intent.action.USER_PRESENT" />
		<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
		<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>

但是由于这些事件跟系统强相关,所以会存在适配问题,由于测试机型有限,我只测试了MOTO ME860、三星Note4、小米2S、MATE7,发现MATE7的开机广播没有生效,原因还没有搞清楚,所以在这台MATE7

  • 升级SDK到最新版本
  • 设置android:priority属性
  • 加入一些流氓行为,在插拔电源、插拔SD卡、屏幕解锁事件中尝试启动push服务<pmicrosoft yahei';="" padding-top:0px;="" padding-bottom:0px;="" font-size:14px;="" color:rgb(63,63,63);="" line-height:30px"="">

    <pmicrosoft yahei';="" padding-top:0px;="" padding-bottom:0px;="" font-size:14px;="" color:rgb(63,63,63);="" line-height:30px"="">当然效果要等产品升级之后才能看到。经过将近两天的折腾又涨姿势了。

    以上就介绍了百度云推送消息到达率低问题定位分析,包括了方面的内容,希望对Android开发有兴趣的朋友有所帮助。

    本文网址链接:http://www.codes51.com/article/detail_170429.html


     
     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值