`

Google应用在Android上的Push机制以及C2DM框架的底层实现

阅读更多
GMS (Google Mobile Applications)在Android平台使用了Push机制, 所以有更好的用户体验:当服务器上有你的新的的Gmail邮件, 或者有新的Calendar Events, 或者有新的Contact, 你的Android总会第一时间知道, 并且会自动sync下来. 这里用到的就是Push机制. Google在Android上的Push机制利用的就是XMPP协议, 再加上Android上的GTalk客户端也是利用XMPP协议, 所以底层用的是同一个XMPP框架, 协议的实现是开源的Smack.

在Android 2.2版本FroYo之前, Google的Push机制直接就是利用XMPP协议的extension,也就是在<message>元素下加入自定义的子元素, 但自从FroYo, Android引入了一个新的框架C2DM(Cloud to Device Messaging), 而Google的Pushing 机制变成使用C2DM框架. 那C2DM框架的原理是什么呢? XMPP! 所以, C2DM只不过是在XMPP协议基础上的一套机制, 一个标准API而已.

在后面的时间, 我会陆续把Android上的Sync框架,GMS的Push机制, 以及C2DM的实现介绍一下, 我想以时序图的形式效果会更好.

2011.02.09 Update
增加关于Google Push机制以及C2DM实现的具体介绍
http://mysupebaby.iteye.com/blog/902054
分享到:
评论
20 楼 laiyangdeli 2011-02-22  
ak121077313 写道
我只想知道"这样当Server端有changes后, 会通过C2DM框架发送"com.google.android.c2dm.intent.RECEIVE" action" service 是怎么发送给客户端的


broadcast一个intent, 在另一篇文件已经介绍.
19 楼 ak121077313 2011-02-22  
我只想知道"这样当Server端有changes后, 会通过C2DM框架发送"com.google.android.c2dm.intent.RECEIVE" action" service 是怎么发送给客户端的
18 楼 syluke 2011-02-12  
laiyangdeli 写道
figofuture 写道
楼主不是说还有包签名的验证这一步吗?包的签名不太可能拿得到吧。


我说的包签名指的是Google一系列apps之间用的是包签名. 如果开发人员开发一个使用C2DM机制的应用, 就没办法使用包签名了, 因为发送C2DM broadcast action的肯定是Google的service.
总的来说呢, 没必要担心这个问题, 因为这是个common的问题, 不是C2DM框架特有的问题.

没错,是Android的问题。但我希望可以通过合理的设计堵住C2DM数据泄露的可能性。
17 楼 laiyangdeli 2011-02-12  
figofuture 写道
楼主不是说还有包签名的验证这一步吗?包的签名不太可能拿得到吧。


我说的包签名指的是Google一系列apps之间用的是包签名. 如果开发人员开发一个使用C2DM机制的应用, 就没办法使用包签名了, 因为发送C2DM broadcast action的肯定是Google的service.
总的来说呢, 没必要担心这个问题, 因为这是个common的问题, 不是C2DM框架特有的问题.
16 楼 figofuture 2011-02-12  
楼主不是说还有包签名的验证这一步吗?包的签名不太可能拿得到吧。
15 楼 laiyangdeli 2011-02-11  
楼上说的case我倒是没有试过. 这也许是整个Android系统存在的问题. 通常来说, 很多broadcast的intent都没有permission(可能开发人员没有意识到), 意味着你往往可以截获这些intent. 所以才有了OpenIntent这样的项目专门收集一些intent.
14 楼 syluke 2011-02-11  
laiyangdeli 写道
syluke 写道
laiyangdeli 写道
syluke 写道
楼主的文章很棒!我目前也在研究C2DM,看来同道中人真的不少。初步看来,自己实现类似架构没有问题。需要重点考虑的是安全性和长期性能。


C2DM的一个不好的地方是服务器端又要使用Google的API. 自己实现的话其实不难, 就是一个XMPP协议的通信, 安全性的话应该问题不大, 就是使用XMPP的安全机制. 我觉得更重要的问题是XMPP服务器的负载均衡和Cluster等问题.

我提到的安全性是指在XMPP传输以外,如何避免已经发送到设备端的数据被一些恶意应用截获或者破坏。感觉目前C2DM在这方面做得不够好。


不会的. C2DM发送broadcast intent的时候使用了signature方式的permission, 所以只有同样signature的apk的broadcast receiver才能注册并成功接收该broadcast intent.

这正是我所说的薄弱之处。我举个例子。

应用A是合法的C2DM应用,应用B是黑客应用。应用B声明并使用了与应用A完全一样的C2D_MESSAGE permission,并且也接收与应用A一样category的C2DM信息。首先在手机上安装应用A并正常运作,然后卸载应用A,再安装应用B,我们会发现应用B也会接收到应用A的C2DM消息。当然,消息里面的数据格式对应用B来说还是未知的,不过通过反编译应用A的APK也不难获得。这样应用B就得到应用A的数据了。

这个例子说明了C2DM数据被截获的一种可能性。在实际操作中黑客应用也许很难创造合适的机会,但毕竟存在隐患。我们如果设计类似的架构,最好还是多考虑一下。
13 楼 laiyangdeli 2011-02-11  
syluke 写道
laiyangdeli 写道
syluke 写道
楼主的文章很棒!我目前也在研究C2DM,看来同道中人真的不少。初步看来,自己实现类似架构没有问题。需要重点考虑的是安全性和长期性能。


C2DM的一个不好的地方是服务器端又要使用Google的API. 自己实现的话其实不难, 就是一个XMPP协议的通信, 安全性的话应该问题不大, 就是使用XMPP的安全机制. 我觉得更重要的问题是XMPP服务器的负载均衡和Cluster等问题.

我提到的安全性是指在XMPP传输以外,如何避免已经发送到设备端的数据被一些恶意应用截获或者破坏。感觉目前C2DM在这方面做得不够好。


不会的. C2DM发送broadcast intent的时候使用了signature方式的permission, 所以只有同样signature的apk的broadcast receiver才能注册并成功接收该broadcast intent.
12 楼 syluke 2011-02-11  
laiyangdeli 写道
syluke 写道
楼主的文章很棒!我目前也在研究C2DM,看来同道中人真的不少。初步看来,自己实现类似架构没有问题。需要重点考虑的是安全性和长期性能。


C2DM的一个不好的地方是服务器端又要使用Google的API. 自己实现的话其实不难, 就是一个XMPP协议的通信, 安全性的话应该问题不大, 就是使用XMPP的安全机制. 我觉得更重要的问题是XMPP服务器的负载均衡和Cluster等问题.

我提到的安全性是指在XMPP传输以外,如何避免已经发送到设备端的数据被一些恶意应用截获或者破坏。感觉目前C2DM在这方面做得不够好。
11 楼 laiyangdeli 2011-02-11  
syluke 写道
楼主的文章很棒!我目前也在研究C2DM,看来同道中人真的不少。初步看来,自己实现类似架构没有问题。需要重点考虑的是安全性和长期性能。


C2DM的一个不好的地方是服务器端又要使用Google的API. 自己实现的话其实不难, 就是一个XMPP协议的通信, 安全性的话应该问题不大, 就是使用XMPP的安全机制. 我觉得更重要的问题是XMPP服务器的负载均衡和Cluster等问题.
10 楼 syluke 2011-02-11  
楼主的文章很棒!我目前也在研究C2DM,看来同道中人真的不少。初步看来,自己实现类似架构没有问题。需要重点考虑的是安全性和长期性能。
9 楼 nciky1984 2011-02-11  
期待楼主完整版,最近也在研究这部分~
8 楼 laiyangdeli 2011-02-09  
2011.02.09 Update
增加关于Google Push机制以及C2DM实现的具体介绍
http://mysupebaby.iteye.com/blog/902054

赶时间匆匆写了一篇, 免得大家等.
7 楼 niwtsew 2011-02-09  
push技术相当有前途,期待楼主下文。
6 楼 laiyangdeli 2011-02-09  
archy123 写道
大哥,我在等下文。。。可别光说不练


等上班后吧, 在家里杂事太多, 静不下心研究的那么细...
5 楼 yaoxinghuo 2011-02-09  
期待下文。。。
4 楼 archy123 2011-02-09  
大哥,我在等下文。。。可别光说不练
3 楼 chinapengwei_wh 2011-02-09  
正好要学习相关知识,期待中。。。。。
2 楼 laiyangdeli 2011-02-08  
sunburst 写道
这个不错,非常期待,不过我更感兴趣的是是否可以自己调用发生push,当然自己有服务器,在不基于C2DM的基础上,因为不是所有人都是2.2的系统


当然可以利用XMPP任意实现自己的Push机制, 如果有自己的XMPP服务器的话.
1 楼 sunburst 2011-02-08  
这个不错,非常期待,不过我更感兴趣的是是否可以自己调用发生push,当然自己有服务器,在不基于C2DM的基础上,因为不是所有人都是2.2的系统

相关推荐

    Push机制在Android平台上的实现

    在Android平台上,Push机制是一种重要的应用功能,它允许应用程序接收来自服务器的实时消息,而无需持续保持网络连接或后台运行。这种机制对于提高用户体验、节省电池寿命以及提供即时通知至关重要。下面将详细介绍...

    android C2DM基本原理浅析

    Android C2DM 从服务器端将数据push到客户端

    android 推送

    从Android 2.2版本开始,Google引入了Cloud to Device Messaging (C2DM)框架,这是一个用于在Android设备与服务器之间建立高效、可靠通信的推送服务。C2DM简化了推送消息的过程,使得开发者可以轻松地在应用中集成推...

    C2DMMessageServer--服务器端代码开发

    C2DM是Android平台早期的一种推送通知服务,允许服务器向注册的Android设备发送消息,从而实现远程唤醒应用或者更新数据的功能。在本文中,我们将深入理解C2DM服务器端的开发流程,以及如何与Android客户端进行通信...

    Android中WAP PUSH的实现分析

    在Android系统中,WAP PUSH(Wireless Application Protocol Push)是一种技术,用于向移动设备推送数据,如短信、彩信或者应用程序更新等。WAP PUSH允许服务器主动将信息推送到用户的手机上,而无需用户主动请求。...

    AndroidC2DMDemo

    在本文中,我们将深入探讨Android C2DM的工作原理、实现步骤以及`AndroidC2DMDemo`项目中的关键代码解析。** **一、Android C2DM服务概述** C2DM服务是Google为开发者提供的一种轻量级通信机制,用于从互联网...

    Android推送服务的应用开发.pdf

    在Android系统中,Google提供了Cloud to Device Messaging(C2DM)服务,它是一个帮助开发者从服务器向Android应用程序发送数据的平台。C2DM服务简化了服务器与移动应用之间的通信,允许服务器向设备发送应用程序...

    android xmpp push实现

    在Android开发中,XMPP可以被用来构建服务器到设备的推送系统,尤其是当Google的C2DM(Cloud to Device Messaging)服务不能满足需求时。 C2DM是Google为Android提供的一个推送服务,但它仅支持2.2及更高版本的系统...

    AndroidPush_ServiceAndClient

    总的来说,Android Push涉及到服务器和客户端之间的交互,需要理解FCM的工作原理,掌握如何在服务器端发送消息,以及在Android客户端接收和处理这些消息。这是一个涉及网络通信、异步处理、服务和广播接收器等多个...

    使用android push notification service 实现即时通知

    在Android平台上,实现即时通知通常会借助Google的云消息推送服务(Google Cloud Messaging,简称GCM),但在iOS系统中,对应的则是Apple Push Notification service(APNs)。然而,这里提到的"android apns"可能是...

    Android wappush讲解

    ### Android WAPPush详解 #### 一、基本概念与应用场景 **WAPPush**是一种能够将特定站点或业务的链接通过短信形式发送到支持WAPPush功能手机的技术。这项技术的核心价值在于它能够极大地简化用户查找和访问所需...

    Android Server Push - MQTT

    在Android平台上实现Server Push技术,MQTT(Message Queuing Telemetry Transport)协议是一个常见的选择。MQTT是一个轻量级的发布/订阅模型的网络协议,主要用于低带宽、高延迟或不可靠的网络环境中,特别适合...

    android-push-applications-Google.pdf

    综上所述,Android推送应用的开发涉及到多个方面,包括数据同步策略的选择、高效的消息传递机制以及对底层通信机制的理解。通过采用合适的策略和技术,开发者可以构建出既能够提供实时信息更新又能有效保护用户设备...

    android 开发 push 短信协议解析

    在Android开发中,Push短信是一种常见的消息传递方式,特别是在MMS(Multimedia Messaging Service)不支持Push机制的情况下。Push短信协议解析是理解如何接收和处理此类短信的关键,这对于构建高效、可靠的通信应用...

    Android push notification方案比较

    在开发Android应用时,向用户实时推送通知是必不可少的功能,Android提供了多种推送通知方案,包括C2DM(Cloud to Device Messaging)、MQTT(Message Queuing Telemetry Transport)和XMPP(Extensible Messaging ...

    PUSH注册机制在JAVA移动应用程序开发中的使用.pdf

    PUSH注册机制在JAVA移动应用程序开发中的应用非常广泛,如在无线移动网络中,PUSH技术可以通过主动发送信息来实现用户信息查询,从而解决无线移动网络所存在的问题。 PUSH注册机制是JAVA移动应用程序开发中的一种...

    android几种push方式的实现

    附件里有3个压缩包,分别是基于udp,xmpp,wmqtt实现push机制的客户端代码,可以参考http://tokudu.com/post/50024574938/how-to-implement-push-notifications-for-android,哈哈,不过是英文的。

    android Push功能(Channel)

    1. **GCM (Google Cloud Messaging)**:早期Android系统中,Google提供了GCM服务,用于实现应用的后台消息推送。但自2018年起,GCM已被FCM(Firebase Cloud Messaging)取代。 2. **FCM (Firebase Cloud Messaging)...

    Server-push-to-Android.rar_Android push_push

    1. **Android Push通知概述**:Android系统提供了多种机制来实现推送通知,最常见的是Google的Firebase Cloud Messaging (FCM),前身为Google Cloud Messaging (GCM)。FCM是谷歌提供的免费服务,用于在服务器与...

    android 单通道多应用Push系统

    在Android平台上,构建一个单通道多应用Push系统是一项复杂但高效的设计,旨在优化资源使用,降低设备能耗,并确保消息的实时传递。以下是该系统中涉及的关键知识点的详细说明: 1. **AIDL(Android Interface ...

Global site tag (gtag.js) - Google Analytics