Android网络应用开发

Android网络应用开发

反复研究了 Android Market,总结一下,之前发在新浪微博上,但不够详细,主要是提高用户体验。

1.网络异常处理,重试机制。
上wifi常常网络断开,那就看运用程序是否健壮。可以用Android 提供的 frameworks/base/core/java/android/net/NetworkConnectivityListener.java 监控网络变化,然后做相应的处理。

2.Cache
这个是必须的。比如手机QQ的头像,不可能每一次登录,重新把头像下载一遍。可以是内存cache,也可以写入SD卡。

3. 本地数据与服务器同步机制

4.请求异步处理机制
给一个app打分,打分后,马上回到之前的界面,而不是一直在等是否把数据发送到了服务器再响应。

5. push消息通知
有软件可以更新,在状态栏提示。新浪微博在右上方显示有新数据。

6.lazyload
延时加载,比如图标,头像,分页。

7.数据交换格式:对象序列化/protobuf/json/xml。

8. 设计模式:MVC,chain。

c2dm 使用心得总结

关于 c2dm是什么? 不就多说了,翻墙从youtube下载 Google I/O 2010 – Building push applications for Android (C2DM) 转发到youku 方便观看, 地址为:http://v.youku.com/v_show/id_XMjQ3MTg1NzA0.html

c2dm开发组提供的两个demo,似乎不是那么容易上手,可以试试最简单的的实例, Mark Murphy __The Busy Coder’s Guide To Advanced Android Development__ 的一个例子: https://github.com/commonsguy/cw-advandroid/tree/master/Push/C2DM

程序跑起来了,才有个直观的感受。c2dm整个流程是这样的:
C2DM 流程图

简要说明一下:Android 客户端收到 registration_id 后,给你的app server发个http post,保存registration_id起来。然后你的appserver 给 https://android.apis.google.com/c2dm/send 这个url发送一些参数,就行了。

Mark Murphy的例子用到了Chrome to Phone 一个可重用的包com.google.android.c2dm 用于处理底层的 C2DM 交互事务 (例如配置,任务队列管理等)。但是这个包也是有一些问题的,遇到 “C2DM E Registration error SERVICE_NOT_AVAILABLE” 这个的Error,默认是没有去处理,你需要在AndroidManifest.xml 里声明处理 com.google.android.c2dm.intent.RETRY。

在申请google c2dm 记得ssh 翻墙 注册就行了,firefox + autoproxy, 在规则添加 .google.com 即可。不然会遇到: “Sign Up for Android Cloud to Device Messaging” 链接被重置,提交时总是说还有一两项信息没有填写(其实都填全了)。

服务器端的实现

就是给 c2dm 服务器发 https post 请求,加上一些参数。 写得最简单明了,是这个帖子 Android push notifications (tutorial) 例子中的脚本可以再改进的, Google Auth Token 过一段时间才会失效,我测试所知道的是1个多月,所以可以把它保持起来,提供下次发送数据时使用。我自个儿也写了php实现的版本。关于发送效率,我也是感到比较头疼的,发送数据到几万个终端,如何并发处理?c2dm不支持并发发送数据。目前我只做到重用 http 连接,把registerIds放到队列里,发送失败了,放到队列尾部,重发。

除此之外,c2dm服务在国内很不稳定,把 app server 放在在国外才比较靠谱。

参考:
1. http://goobr.blogspot.com/2010/11/c2dm-sending-messages.html

Andrord Market Filters base on Device configuration

http://developer.android.com/guide/appendix/market-filters.html

In this document it described the filtering rules. But what exactly it is? In the past year, I payed lots of time to debug the market, gapps.So I decide to write a small tool to show Android Market collect your device configuration , mainly use for Android porting debug. You can easily to see why your device can’t search some apps in Android Market if it has not the featrues meets the market filter. The quick way to find out what happen is that compares with other phone install this same app

The QR code as bellow, your android version should be >= 2.2

Code Review

每周六下午都对自己的代码进行一次 code review.通过 svn log记录,总结主要修改的:

1. 先阅读一遍Android编码风格
2. 添加文件头版权信息
3. 添加注释
4. tab to 4 spaces , 通过 trac 阅读代码,很容易找出。
5. 重命名函数名及参数,让它看起来更合理。
6. 去掉 magic number
7. 删除重复的代码,没用的代码
8. 减少大函数,拆分成小函数
9. 源代码后面要空一行
10. 更新设计文档

对于第7点,比如boolean 函数力求简凑,

-            if (deviceRegistrationId == null) {
-                return false;
-            } else {
-                return true;
-            }
+
+            return (deviceRegistrationId != null);

下面是对应的 ddx 格式

133     .local v0, deviceRegistrationId:Ljava/lang/String;
134     if-nez v0, :cond_0
135     
136     .line 383
137     const/4 v2, 0x0
138     
139     .line 385
140     :goto_0
141     return v2
142 
143     :cond_0
144     const/4 v2, 0x1
145 
146     goto :goto_0
147 .end method


133     .local v0, deviceRegistrationId:Ljava/lang/String;
134     if-eqz v0, :cond_0
135 
136     const/4 v2, 0x1
137 
138     :goto_0
139     return v2
140 
141     :cond_0
142     const/4 v2, 0x0
143 
144     goto :goto_0

编译器编译出来的 ddx是一样的。

解决android 2.2 market搜索结果偏少的问题

那是很久很久以前的事了,大概花了两个星期去折腾,整理整理,与朋友们分享一下。

我们开始移植到 2.2时,market运行很好,过一段时间测试组提出bug。问题现象:Android market 搜素记录严重偏少,比如搜索 qq,在我们的broncho a1上,只有1条记录。

首先,确定apk包是没有问题的。同样的包安装在G1上,可以找到300多条记录。此外,特意让上海龙旗的一位网友看了他们公司的手机,说可以搜索到25条qq记录,他们的分辨率是 800 * 600, 我们的是480 * 320。他把apk包发给我,在我们机器上还是同样的结果。

其次,在javaeye上,有网友说跟机器有 root权限有关,他发布一款软件到market上,他的机器是root权限,搜索不到他刚发布的程序,改为普通用户后,就可以了。这有可能,因为我们的机器一直是root权限,重新编译kernel,改为普通用户,还是不行。

后来有人说,跟market上设置的protected权限有关。我为此还花了25$注册 market开发者,写个小程序放上去,关闭权限,结果还是没有生效。

解决问题最好的方法是找差异。为此,getprop 获取G1系统参数做比较,还是没有找到有异常嫌疑之处。gpps包是从cm上获取的,我们没有通过正规的渠道拿到,怀疑是跟授权有关,如果真的是这样,那就没办法了,不过,上海龙旗既然可以搜索到25条记录,我想应该跟这没关系。

用 tcpdump与 wireshark 工具观察 market请求发出的数据包找出url,那是一串经过序列化然后再经过base64加密后的字符串。有开源的 android market api,基于protobuf协议,之前也是运行好好的,最近就不行了。翻遍它的 google groups,说什么帐号跟手机的deviceId挂钩了,我重新注册个gmail帐号,还是一样。又有说根据ip来源,返回不同的搜索结果。我干脆把程序放在美国的服务器上跑,还是没成功。

绝望,绝望!!! 一个android手机,如果电子市场不能使用,那简直是暗淡无光。

正值网络上爆出android暗含高达40% 的扣费短信。wusong童鞋无聊给我发个帖子链接《近期 Android 平台扣费软件检测的分析心得与思路分享》,说是如何扫描apk包含扣费短信的,文章中说通过反编译apk,插入 Log.v 打印出非法信息。灵光一闪,既然我无法全部理解那长长的url,那何不如让它自己打印出自己的信息呢?

修改ProtoBuf里的insertObject函数,添加Object toString()打印对象,如果是vector,就遍历打印。

结果发现,我们只有这个信息:

1222 insertObject: W tag=10 index=0com.google.android.feature.GOOGLE_BUILD

相应的g1的有很多信息,经查询, 问题出现在 FeatureInfo[] systemAvailableFeatures =
packageManager.getSystemAvailableFeatures(); 这个函数。

运行时,PackageManagerService.java 从 /system/etc/permissions/ 下所有
的文件读取 features/permissions。这个目录下,我们只有一个features.xml, 而这个文件还是从gapps里拷贝过来的。
所以,应该把以下文件

frameworks/base/data/etc:
android.hardware.camera.autofocus.xml
android.hardware.location.gps.xml
android.hardware.telephony.gsm.xml
android.hardware.touchscreen.multitouch.xml
android.hardware.wifi.xml
handheld_core_hardware.xml

生成image时拷贝到

/system/etc/permissions/

如果是cdma,
请把 android.hardware.telephony.gsm.xml
替换为
android.hardware.telephony.cdma.xml

测试,OK。

我把问题解决后,才发现一下别人的帖子:
APAD IMX515 安装 Android Market 方法

Working Android market and all google app (for 2.2)

问题解决后再回顾:

1. 如果我早用 Quick system info 这个工具,会很快找到问题,这个工具可以显示 system availabe features信息,两机器都同时安装,跟G1一对比,一目了然。

2. 如果把 market的数据清空,再抓数据包,在 base64 decode,虽然不能看出所有的含义,但至少也看到 xxx.xx.xx 这样可显示的字符串,也可以尽快找出问题。market 手机系统信息,是第一次运行时才收集,后面的url请求只需要从cache里获取系统信息即可。

3. DeviceConfiguration.java 有 toString(),注入调试信息也可以显示出来。

4. 仔细阅读官方文件 http://developer.android.com/guide/appendix/market-filters.html, 有提到getSystemAvailableFeatures()这个函数.

Pages: Prev 1 2 3 ... 7 8 9 10 11 12 13 ... 19 20 21 Next