原文地址 http://blog.lytsing.org/archives/606.htmlAndroid 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 # lsAVMC_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_-2863385711196347958AVMC_UGIR_-4594342797900232749AVMC_UGIR_-5005302620309917353AVMC_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, 沒有用過。
還有很多很多細節的東西,不一一詳述。總之,做這麼一個平台,需要考慮的東西太多了,不是一個人可以搞出來的。