Categories
Android

Android Market 架构设计解析

1. 没有源代码。
2. 通过反编译工具(apktool/dex2jar),察看网络数据包工具(tcpdump/wireshark)研究,不能保证100%的正确,但整体的思路还是能看出来的。国内也有很多第三方电子市场,但形像神不像。

Android Market Overview : Client & Server

大致的代码目录(android 1.5版本, 后续版本比较复杂):

Vending
|-- AndroidManifest
|-- res
|   |-- drawable
|   |-- drawable-finger
|   |-- layout
|   |-- menu
|   |-- values
|   `-- xml
`-- src
    `-- com
        |-- android
        |   `-- vending
        |       |-- SuggestionsProvider.java
        |       |-- ...
        |       |-- VendingNotificationManager.java
        |       |-- adapters
        |       |   |-- AggregatedAdapter.java
        |       |   `-- SectionAdapter.java
        |       |-- api
        |       |   |-- ApiException.java
        |       |   |-- ...
        |       |   `-- UninstallReasonService.java
        |       |-- cache
        |       |   |-- CacheManager.java
        |       |   |-- CacheManagerImpl.java
        |       |   `-- Cacheable.java
        |       |-- controller
        |       |   |-- ActivityAccessor.java
        |       |   |-- ...
        |       |   `-- ResultsController.java
        |       |-- licensing
        |       |   |-- ILicenseResultListener.aidl
        |       |   |-- ILicensingService.aidl
        |       |   `-- LicensingService.java
        |       |-- model
        |       |   |-- Address.java
        |       |   |-- ...
        |       |   `-- UninstallReasonResponseProto.java
        |       `-- util
        |           |-- Base64.java
        |           |-- ...
        |           `-- Util.java
        `-- google
            `-- android
                |-- googleapps
                |-- googlelogin
                `-- providers

代码文件命名规则

每个Activity,以Activity为后缀,比如AssetCategoryBrowserActivity.java
api目录中,继承BaseService的类,以Service为后缀,比如AssetService.java
model目录中,提供Protobuf TAG的类,以Proto为后缀,比如UninstallReasonResponseProto.java

用到的设计模式

MVC, COR(Chain Of Responsibility), Observer(Notification机制), State ,Singleton,Abstact Factory等,看Android的源代码,这些都很常见。除此之外,对于Server/Client 网络系统,Service Locator, Request-Response,lazyload等设计方法也用到。

数据交换格式protobuf

Protocol Buffers in Android 稍有提到过,protobuf传输的是二进制,比Json、XML有速度上的优势和使用的方便,服务器端可以用C/C++,Java,python等实现。

API

http://code.google.com/p/android-market-api/
Android Market 的开源 API 项目,非官方提供的,基于Google Protocol Buffers 协议实现。

Cache 机制
Cache 可以保存在内存,也可以写入disk上。

/data/data/com.android.vending/cache # ls
AVMC_UAR{-5434199881535588028_}_____0_10_rei___
AVMC_UAR{8501175443043592143_}_____0_10_rei___
AVMC_UAR{}APPLICATION__APP_WALLPAPER_POPULAR_ALL_0_10____
AVMC_UAR{}APPLICATION__APP_WALLPAPER_POPULAR_ALL_10_10____
AVMC_UAR{}_____0_10__rvh__
AVMC_UCR-5434199881535588028_0_3_self_
AVMC_UCR8501175443043592143_0_3_self_
AVMC_UGIR_-2863385711196347958
AVMC_UGIR_-4594342797900232749
AVMC_UGIR_-5005302620309917353
AVMC_UGIR_-543419988153558802
......

AVMC_UGIR_-543419988153558802的格式是这样的:
“AVMC_” + “U”/”S” + “GIR_” + assetId

其他类似。

具体实现,可以参考libaddressinput 里的 Cache.java

本地数据库

/data/data/com.android.vending/databases/assets.db

把它 pull 出来,用 sqlite3 工具可以看到数据表。这个主要用来保存下载过的apk信息。

PUSH 通知

有软件更新时,就用push推送消息,com/google/android/server/checkin/CheckinService 收到消息后,给market发送一个 “com.android.vending.UPDATES_AVAILABLE” intent。push机制,android froyo之前,用的是XMPP协议,之后是c2dm。

支付系统

Google checkout, 没有用过。

还有很多很多细节的东西,不一一详述。总之,做这么一个平台,需要考虑的东西太多了,不是一个人可以搞出来的。

If you enjoyed this post, make sure you subscribe to my RSS feed!

3 replies on “Android Market 架构设计解析”

我最近也在研究vending的源码,主要是想学习下他的push机制。
不过反编译出来的源码读起来很费劲,不知道博主在这个上有资料积累没?
可否分享下?

hi, 如果想学习push机制,估计找错地方了。2.2之后,gmail,电子市场,Google plus都是靠c2dm来做。

Leave a Reply

Your email address will not be published. Required fields are marked *