20100918 android cache

21
AndroidHTTP Cache (失敗編) 2010-09-18 2010-10-03

description

 

Transcript of 20100918 android cache

Page 1: 20100918 android cache

AndroidでHTTP Cache

(失敗編)2010-09-18

2010-10-03

Page 2: 20100918 android cache

AndroidでHTTP通信する方法• java.net

• Java標準

• 簡単なHTTP通信を行うHttpURLConnectionクラス

• org.apache.http

• Apache HttpClient 4.0。Androidに標準組込

• HTTP通信のための細かな制御や機能を提供

• android.webkit

• Android固有。AndroidのUIにWebブラウザを組み込む

• HTTP通信ライブラリというか、Webサイト表示コンポーネント

2010-10-03

Page 3: 20100918 android cache

問題点(HTTP通信)

• AndroidのHTTP通信は、通信速度が遅い場合がある(3G接続時、300kbps~2000kbps)

• 通信速度が遅いと→レスポンスが悪い→ユーザーの使い勝手が悪い

→サーバから一旦取得したリソースは、キャッシュして通信を減らす

2010-10-03

Page 4: 20100918 android cache

問題点(キャッシュ)

• キャッシュ機能の仕様策定と実装は手間がかかる

• キャッシュの有効期限

• キャッシュの可否(何でもキャッシュすればよいわけではない)

• サーバ側でキャッシュが更新された場合

• 一から仕様策定と実装をするより既にあるものを使う

→HTTP/1.1 Caching

2010-10-03

Page 5: 20100918 android cache

HTTP/1.1 Caching

• RFC2616で定義

• 殆どのWebサーバ/Webブラウザで対応

• HTTP/1.1 Cachingは、HTTPヘッダでキャッシュ方式を制御

2010-10-03

Page 6: 20100918 android cache

HTTP/1.1 Caching

• リクエスト用 HTTPヘッダ

• If-Modified-Since

• 日時を指定。指定した日時より新しいコンテンツの場合のみデータを返却するようにサーバに指示。ローカルキャッシュの最新確認に使用される。

• If-None-Match

• 指定したエンティティタグに一致しない場合のみコンテンツを返却するようにサーバに指示。最新情報の取得や競合の排除のために指定される。

2010-10-03

Page 7: 20100918 android cache

HTTP/1.1 Caching

• レスポンス用 HTTPヘッダ

• Expires

• コンテンツの有効期限を示す

• Last-Modified

• コンテンツの最終更新時刻を示す。If-Modified-Sinceと対で使用

• ETag

• コンテンツの全体や一部を特定する固有値を示す。If-None-

Matchと対で使用

2010-10-03

Page 8: 20100918 android cache

HTTP/1.1 Caching

• リクエスト/レスポンス共通 HTTPヘッダ

• Cache-Control

• キャッシュのコントロールに関する指示や情報を示す

• Pragma

• 関連するクライアント/Proxy/サーバそれぞれに認識させるための特殊な追加情報を記述する。例: no-cache 指定で無条件に最新リソースを転送させる

2010-10-03

Page 9: 20100918 android cache

HTTP/1.1 Caching に対応したサーバの実装

• Apacheとかlighthttpdなどの殆どのWebサーバで実装しているかと

• 設定方法は、ググれば出てくる。

• というか、サーバ周りの設定は詳しくないので(略

2010-10-03

Page 10: 20100918 android cache

HTTP/1.1 Caching に対応したクライアントの実装

• android.webkitは、HTTP/1.1 Caching の機能を実装

• しかし、プログラムから使いにくい。

• しかし、自前で実装するには、手間がかかる。

→Apache HttpClient-Cacheを使用する

2010-10-03

Page 11: 20100918 android cache

Apache HttpClient-Cacheとは

• Apache HttpClient 4.1の新機能

• HTTP/1.1 Cachingに対応したクライアント機能

• まだ、alpha版(2010年9月現在)

2010-10-03

Page 12: 20100918 android cache

Apache HttpClient-Cacheの入手先

• 公式URL

• http://hc.apache.org/

• Subversion URL

• http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient-cache

• jarファイルを作成する場合、http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/

以下をsvn getして、mvn package

• Revision: 990924 を指定してダウンロードする(2010-09-05現在)。990925の修正でSerialize

時にNotSerializableExceptionが発生

• Maven URL

• http://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient-cache/

2010-10-03

Page 13: 20100918 android cache

Apache HttpClient-Cacheの特徴

• Cachingの実装が、インターフェース: org.apache.http.client.HttpClient の実装クラス: CachingHttpClient に隠蔽

• アプリケーションからは、DefaultHttpClientをCachingHttpClientに変更するだけ

• Android組込のApache HttpClient 4.0でも使用可能(細かい部分は未確認)。

• alpha版なので、まだ安定していない(クラス名の変更もあったり)

2010-10-03

Page 14: 20100918 android cache

Apache HttpClient-Cacheの特徴

• Cache対象になるHTTPリクエスト

• HTTP 1.1

• Method: GET

• No Header: "Pragma"

• No Header: "Cache-Control: no-store"

• No Header: "Cache-Control: no-cache"

• ※デフォルトの定義は、org.apache.http.impl.client.cache.CacheableRequestPolicy

2010-10-03

Page 15: 20100918 android cache

Androidプロジェクトへの組込

• Eclipseを起動

• Androidプロジェクトの新規作成

• Java Build PathにApache HttpClient 4.1のjarファイルを追加

2010-10-03

Page 16: 20100918 android cache

Androidプロジェクトの実装

• Apache HttpClient-Cacheは、HTTP通信周りしか面倒を見てくれない

• Cache Data Read/Write周りの実装が必要

• 必要な機能

• Cache Data Serialize

• キャッシュサイズ管理

• ※org.apache.http.client.cache.HttpCacheStorageインターフェースの実装クラスが必要

2010-10-03

Page 17: 20100918 android cache

実測結果

条件 CachingHttpClient DefaultHttpClient

Expires: なしLast-Modified: あり

Etag: ありFile Size: 295 KB

281(ms) 122(ms)

Expires: ありLast-Modified: あり

Etag: なしFile Size: 4KB

50(ms) 125(ms)

Expires: ありLast-Modified: なし

Etag: なしFile Size: 8KB

200 (ms) 128 (ms)

※HTTP GETしてからHTTP Responseが返ってくるまでの時間を測定。※5回連続して測定した結果の平均値。※Nexus One (Android 2.2) で測定。Wi-FI接続。※測定ソース: http://www1.axfc.net/uploader/Sc/so/154474.zip

遅い!

遅い!

2010-10-03

Page 18: 20100918 android cache

Cachingありの方が遅い原因

→CachingHttpClient#execute() が、呼び出している シリアライズの処理が重い?

2010-10-03

Page 19: 20100918 android cache

まとめ

• Apache HttpClient-Cache を使うと、アプリケーションの変更最小限で、キャッシュ機能を追加できる

• 但し、キャッシュのシリアライズに時間がかかるので、CachingありのほうがCachingなしより遅い→全HTTP Responseをシリアライズしている

• 2010年9月現在、アルファ版なので今後、改善される可能性あり。

• より、パフォーマンスを求めるのであれば、必要なHTTP ResponseだけをCachingするandroid.webkitと同等の処理を実装したほうがいいかも。

2010-10-03

Page 20: 20100918 android cache

参考URL

• HTTP/1.1: Caching in HTTP

• http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

• 事例に学ぶWebシステム開発のワンポイント

• http://www.atmarkit.co.jp/fjava/rensai2/webopt12/webopt12.html

• Android によるネットワーキング

• http://www.ibm.com/developerworks/jp/opensource/library/os-android-networking/

2010-10-03

Page 21: 20100918 android cache

参考書籍

• Webを支える技術

• http://www.amazon.co.jp/dp/4774142042

2010-10-03