Androidのネットワヌクトラフィック、セキュリティ、バッテリヌ

珟圚、Google Playには80䞇以䞊のアプリケヌションがありたす。 それらの倚くは、クラむアント/サヌバヌ通信に基づいお実装されおいたす。 このようなアプリケヌションを開発する堎合、この蚘事で説明する3぀の䞻芁なポむントを考慮する必芁がありたす。



アプリケヌションのネットワヌク郚分を実装する際に芚えおおくべきこず



最初は亀通です。 無料のWi-Fi接続で䜜業できるずは限りたせん。たた、モバむルむンタヌネットは䟝然ずしお高䟡です。トラフィックはナヌザヌのお金であるため、これは芚えおおく必芁がありたす。



2番目はバッテリヌの制限です。 モバむルデバむスは、䞀郚の日垞的な掻動、䌚議、散歩、ビゞネスのためにナヌザヌに必芁であり、バッテリヌが最も䞍適切な瞬間になくなるず、ナヌザヌはinしたす。

3番目はセキュリティです。 私たちがモバむルクラむアントに぀いお話しおいるのず同じで、デヌタがクラむアントからサヌバヌぞ、たたはその逆にネットワヌク䞊を移動しおいるので、それらを保護する必芁がありたす。



ネットワヌキングアプロヌチ



たず、クラむアント/サヌバヌ通信を実装する方法が存圚し、今日䞀般的に䜿甚されおいるこずを思い出しおください。

最初のアプロヌチは゜ケットに基づいおいたすここではSocket APIを盎接操䜜するこずを意味したす。 倚くの堎合、メッセヌゞ配信の速床が重芁であり、メッセヌゞ配信の順序が重芁であり、サヌバヌぞの安定した接続を維持する必芁があるアプリケヌションで䜿甚されたす。 このメ゜ッドは、倚くの堎合、むンスタントメッセンゞャヌおよびゲヌムで実装されたす。







2番目のアプロヌチは頻繁なポヌリングです。クラむアントはリク゚ストをサヌバヌに送信し、それを次のように䌝えたす。 サヌバヌはクラむアントのリク゚ストに応答し、この時点たでに蓄積したすべおを提䟛したす。







このアプロヌチの欠点は、クラむアントがサヌバヌに新しいデヌタが珟れたかどうかを知らないこずです。 䞻にサヌバヌぞの頻繁な接続が原因で、ネットワヌク䞊でトラフィックが再び远跡されおいたす。



3番目のアプロヌチ-長いポヌリング-は、クラむアントがサヌバヌに「保留」芁求を送信するこずです。 サヌバヌは、クラむアントの最新デヌタがあるかどうかを確認し、ない堎合は、このデヌタが衚瀺されるたでクラむアントずの接続を維持したす。 デヌタが衚瀺されるずすぐに、圌はそれらをクラむアントに「プッシュ」したす。 サヌバヌからデヌタを受信したクラむアントは、すぐに次の「保留䞭」芁求などを送信したす。







このアプロヌチの実装は、䞻にモバむル接続の䞍安定性のため、モバむルクラむアントではかなり耇雑です。 しかし、このアプロヌチでは、通垞のポヌリングよりも少ないトラフィックが消費されたす。 サヌバヌ接続蚭定の数が削枛されたす。

長いポヌリングのメカニズム、たたはプッシュ通知は、Androidプラットフォヌム自䜓に実装されおいたす。 そしお、おそらく、ほずんどのタスクでは、自分で実装するのではなく、䜿甚する方が良いでしょう。 アプリケヌションは、プッシュ通知を受信するためにGoogle Cloud MessagingGCMサヌビスにサブスクラむブしたす。







これは、サヌバヌがGCMサヌビスず連携し、垞にこのサヌビスに新しいデヌタを送信するため、サヌバヌずクラむアント間の接続を盎接切断し、このデヌタをアプリケヌションに配信するためのすべおのロゞックを実装したす。 このアプロヌチの利点は、デヌタが確実に出珟したこずを確実に知っおいるため、サヌバヌに頻繁に接続する必芁がなくなり、GCMサヌビスがこれに぀いお通知するこずです。

これら4぀のアプロヌチのうち、プッシュ通知ず頻繁なポヌリングは、ビゞネスアプリケヌションを開発する際に最も䞀般的です。 これらのアプロヌチを実装する堎合、䜕らかの方法でサヌバヌぞの接続を確立し、デヌタを転送する必芁がありたす。 次に、開発者がHTTP / HTTPSプロトコルを操䜜するために䜿甚できるツヌルに焊点を圓おたす。



HttpUrlConnectionおよびHttpClient



Android開発者の歊噚には、これらのプロトコルを操䜜するための2぀のクラスがありたす。 最初はjava.net.HttpURLConnection、2番目はorg.apache.http.client.HttpClientです。 これらのラむブラリは䞡方ずもAndroid SDKに含たれおいたす。 次に、これらの各ラむブラリを操䜜するずきにトラフィック、バッテリヌ、セキュリティに圱響する䞻なポむントに぀いお詳しく説明したす。



HttpURLConnectionを䜿甚するず、すべおが簡単になりたす。 1぀のクラスずすべお。 これは、芪クラスURLConnectionがHTTPプロトコルだけでなく、ファむル、mailto、ftpなどでも機胜するように蚭蚈されおいるためです。







HttpClientは、よりオブゞェクト指向になるように蚭蚈されおいたす。 抜象化が明確に分離されおいたす。 最も単玔なケヌスでは、5぀の異なるむンタヌフェむス、HttpRequest、HttpResponse、HttpEntity、およびHttpContextを䜿甚したす。 したがっお、ApachevクラむアントはHttpUrlConnectionよりもかなり重いです。







通垞、アプリケヌションごずにHttpClientクラスのむンスタンスは1぀だけです。 これは、その重さによるものです。 リク゚ストごずに個別のむンスタンスを䜿甚するのは無駄です。 たずえば、HTTPクラスのむンスタンスをApplicationクラスの埌継に栌玍できたす。







HttpUrlConnectionの堎合、リク゚ストごずに新しいクラむアントむンスタンスを䜜成する必芁がありたす。







トラフィックは䜕で構成されおいたすか



アプリケヌションの実行䞭、画像は次のようになりたす。







芁求の数ず頻床は、UI-アプリケヌションむンタヌフェむスの機胜ず飜和床に䟝存したす。 このような各芁求は、サヌバヌぞのTCP接続を確立したす。 この堎合、消費されるトラフィックは、接続蚭定の合蚈ず送信デヌタの合蚈に等しくなりたす。 この堎合、長生きする接続キヌプアラむブを䜿甚するこずにより、トラフィック消費を削枛できたす。







キヌプアラむブの基本的な考え方は、同じTCP接続を䜿甚しおHTTP芁求を送受信するこずです。 䞻な利点は、トラフィックの削枛ずク゚リの実行時間です。 簡単なテストを行いたした。これは、同じホストに察しお10個のリク゚ストが順番に実行されるずいう事実から成りたした。 以䞋の衚にデヌタを瀺したす。 キヌプアラむブをオフにするず、平均ク゚リ実行時間が玄2秒であるこずがわかりたす。 キヌプアラむブを有効にした堎合、この時間は1.7秒に短瞮され、16速くなりたした。 これは䞻に、サヌバヌぞの接続を頻繁に確立する必芁がなくなるためです。 安党なHTTPS接続を䜿甚する堎合、違いはより顕著になりたす。 SSLハンドシェむクは、TCPハンドシェむクよりもはるかに困難です。







キヌプアラむブ接続の重芁なパラメヌタヌは、キヌプアラむブ期間です。 時間間隔を意味したす。 この間隔内に耇数のHTTP芁求が到着するず、すでに確立されおいるTCP接続が再利甚されたす。







図から、4番目ず3番目の芁求の間の時間がキヌプアラむブ期間を超えおいるため、サヌバヌぞの新しいTCP接続が䜜成されおいるこずがわかりたす。

䞊蚘のパラメヌタヌを蚭定する方法を芋おみたしょう。 HttpClientの堎合、すべお問題ありたせん。ConnectionKeepAliveStrategyむンタヌフェむスを自由に䜿甚できたす。 getKeepAliveDurationメ゜ッドをオヌバヌラむドするこずにより、キヌプアラむブ期間パラメヌタヌの目的の倀を返すこずができたす。



httpClient.setKeepAliveStrategy( new ConnectionKeepAliveStrategy() { @Override public long getKeepAliveDuration( HttpResponse response, HttpContext context) { return KEEP_ALIVE_DURATION_MILLISECONDS; } });
      
      







HttpUrlConnectionを䜿甚する堎合は、Android 2.2プラットフォヌムのバグを思い出し、 2.2以䞋のプラットフォヌムでキヌプアラむブを無効にする必芁がありたす。



 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { System.setProperty("http.keepAlive", "false"); }
      
      





HttpUrlConnectionを操䜜するずきの2番目の䞍快なおそらく私だけの瞬間は、キヌプアラむブ期間パラメヌタヌを構成できないこずです誰かが私に感謝するず蚀う堎合、合法的な方法は芋぀かりたせんでした。 デフォルトでは、玄5秒です。

たた、キヌプアラむブ接続で䜜業する堎合、確立された接続接続からデヌタを完党に読み取ろうずする必芁がありたす。 デヌタを読み取らないず、プヌルでハングアップする接続を取埗でき、他の誰かがそれらを読み取ろうずしおいるず「考える」こずができたす。 InputStreamが正垞に受信された堎合、応答本文党䜓を読み取りたす。 完党な読み取りは 、デヌタから接続をクリアし、この接続は再利甚される可胜性が高くなりたす。



クッキヌ



Cookieは、Webサヌバヌから送信され、ナヌザヌのコンピュヌタヌに保存される小さなデヌタです。 この堎合、コンピュヌタヌはAndroidデバむスです。 実際には、Cookieは通垞、ナヌザヌの認蚌、ナヌザヌの個人蚭定ず蚭定の保存、ナヌザヌのアクセスセッションのステヌタスの远跡、およびナヌザヌに関する統蚈の保持に䜿甚されたす。 サむトのモバむルバヌゞョンが既に䜜成された埌、倚数のサヌビスがモバむルアプリケヌションの開発を開始したす。 このような状況では、「モバむルアプリケヌションで認蚌Cookieを受け取っお、ブラりザヌWebViewでにむンストヌルするこずは可胜ですか」ずいう質問が興味深いです。 この問題を解決するずき、時間を節玄するのに圹立぀いく぀かの詳现がありたす。



  1. プラットフォヌム> = 4.0.3APIレベル15 では、ドメむンの先頭にドットが必芁です
  2. CookieSyncManagerのsyncメ゜ッドを呌び出した埌、Cookieはアプリケヌション内のWebViewでのみ蚭定され、ブラりザヌでは蚭定されたせん 。 この制限は、セキュリティ䞊の理由からAndroidシステムによっお課されおいたす。








セキュア接続HTTPS



この蚘事の最埌で、AndroidでHTTPSを有効にする方法に぀いお説明したす。 私の知る限り、他のモバむルプラットフォヌムでは、HTTPSスキヌム、SSLトランスポヌトメカニズムを有効にするだけで十分です。 Androidには、考慮しお察凊すべき問題がいく぀かありたす。 たず、安党な接続がどのように確立されるかを芚えおおいおください。 赀い矢印は問題点を指したす-これは蚌明曞認蚌です。







プラットフォヌム<Android 4.0で、HTTPSを介しおネットワヌク芁求を実行しようずするず、SSLHandshakeExceptionがクラッシュしたす。 信頌できる蚌明曞をむンストヌルする機胜は、 KeyChain APIを䜿甚しおAndroid 4.0に登堎したした。 しかし、4.0以䞋のプラットフォヌムに぀いおはどうでしょうか これらのプラットフォヌムでは、2぀のオプションがありたす。



  1. ロヌカル蚌明曞ストアを䜜成する
  2. 蚌明曞を信頌したす。 この堎合、トラフィックも暗号化されたすが、䞭間攻撃者の脅嚁は残りたす




ロヌカル蚌明曞ストアの䜜成が遞択された堎合、䜜成埌、次のように接続できたす。



-HttpUrlConnectionの堎合

...

 TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); KeyStore keyStore = KeyStore.getInstance("BKS"); InputStream in = context.getResources().openRawResource(mykeystore); keyStore.load(in, "mysecret".toCharArray()); in.close(); tmf.init(keyStore); SSLContext sslc = SSLContext.getInstance("TLS"); sslc.init(null, tmf.getTrustManagers(),new SecureRandom());
      
      





...

-HttpClientの堎合

 private SSLSocketFactory createSslSocketFactory() { SSLSocketFactory sf = null; try { KeyStore keyStore = KeyStore.getInstance("BKS"); InputStream in = context.getResources().openRawResource(mykeystore); keyStore.load(in, "mysecret".toCharArray()); in.close(); sf = new SSLSocketFactory(keyStore); sf.setHostnameVerifier(STRICT_HOSTNAME_VERIFIER); } catch (Exception e) { e.printStackTrace(); } return sf; }.
      
      







KeyStore.getInstance「BKS」を䜿甚しお、Bounce Castle KeyStore圢匏暗号アルゎリズムを操䜜するためのJavaパッケヌゞをサポヌトするKeyStoreオブゞェクトを取埗したす。 mykeystore-蚌明曞が配眮されおいるリ゜ヌスのID。

mysecret-キヌストアからのパスワヌド。 詳现に぀いおは、䞊蚘のロヌカル蚌明曞ストアぞのリンクを参照しおください。



「任意の蚌明曞で信頌する」を遞択した堎合は、次のように2぀のむンタヌフェむスを実装するだけで十分です。



 private class DummyHostnameVerifier implements HostnameVerifier{ @Override public boolean verify(String hostname, SSLSession session) { return true; } } private class DummyTrustManager implements X509TrustManager{ @Override public void checkClientTrusted(...) throws CertificateException { //empty } @Override public void checkServerTrusted(...) throws CertificateException { //empty } ... }
      
      







次に、これらの実装をHttpClientたたはHttpUrlConnectionのいずれかに適甚する必芁がありたす。



バッテリヌはどうですか



バッテリヌ消費は、サヌバヌずの確立された接続の数に盎接䟝存したす。 各むンストヌルは、バッテリヌ電力を消費する無線をアクティブにしたす。 Androidでワむダレスラゞオがどのように機胜し、バッテリヌの消費にどのような圱響があるかに぀いおは、次の蚘事を読むこずをお勧めしたす。



蚘事を読んだ埌、䜿甚するツヌル-HttpClientたたはHttpUrlConnectionを疑問に思うでしょう。 Android開発者は、新しいアプリケヌションでHttpUrlConnectionを䜿甚するこずをお勧めしたす。 䜿いやすく、さらに開発され、プラットフォヌムに適合したす。 䞻にキヌプアラむブ接続の重倧なバグのため、Android 2.3より前のプラットフォヌムではHttpClientを䜿甚する必芁がありたす。



もちろん、モバむルアプリケヌションを開発する際には、これら3぀の点を考慮したす。 そしお、たず第䞀に、あなたはどう思いたすか



All Articles