Android 9以降でHTTPを利用する


Android 9から「セキュリティを強化する」という名目でアプリ内での通信はHTTPSが必須になり、HTTPで通信しようとすると以下のような例外を吐くようになりました。

Java.IO.IOException: Cleartext HTTP traffic to localhost not permitted

HTTPSの問題点 編集

デバッグがめんどくさい 編集

ただデバッグのときはHTTPSオレオレ証明証だと色々とめんどくさいし捗らない。

暗号化によるデータ増大 編集

HTTPSはHTTPと比較してデータ量が約10〜20倍に膨れ上がることがあります。 とくに小さいデータでは最低2〜3KBが追加され影響が大きくなります。 極端にいえば1バイトを送信したいのに鍵交換などだけで3000バイトくらいになります。

これは格安SIMの低速モードでは割と重大は問題になります。公称128Kbpsや64kbpsなどの携帯回線では実測値が公称値付近と絶好調に出たとしても、TLS暗号化を噛ますことによるデータ量の増大で実質的には9600bps程度しか流せないこともザラにあります。

小さいデータの代表格であるゲームなんかだと割と影響が大きいです。 よって、どう考えても重要ではないデータはHTTPで通信した方がよい。

すべてのドメインでHTTP通信を許可する 編集

applicationタグの属性「android:usesCleartextTraffic="true"」で全許可となる。 当然ながらオススメされない方法である。 この方法はそのうちGoogle Playの審査で弾かれるようになるかもしれない。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.monobook.app1">
	<uses-sdk 
        android:minSdkVersion="21" 
        android:targetSdkVersion="28" />
    
    <!-- network_security_config.xmlを適用する -->
	<application 
        android:label="app1.Android" 
        android:usesCleartextTraffic="true" />
    
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
</manifest>

特定のドメインのみHTTP通信を許可する 編集

xmlフォルダを作る 編集

上記フォルダの中に「xmlフォルダ」を新規作成する。

network_security_config.xmlを作る 編集

さきほど作ったxmlフォルダ内にnetwork_security_config.xmlを新規作成する。

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>

  <!-- デフォルトの設定 -->
  <base-config cleartextTrafficPermitted="false" />

  <!-- ドメイン毎の設定 -->
  <domain-config cleartextTrafficPermitted="true"> 
    <!-- domainタグでHTTP通信を許可するドメインやIPアドレスを列挙する -->
    <domain includeSubdomains="true">yahoo.co.jp</domain>
    <domain includeSubdomains="true">google.co.jp</domain>
    <domain includeSubdomains="true">monobook.org</domain>
  </domain-config>

</network-security-config>

AndroidManifest.xmlを書き換える 編集

AndroidManifest.xmlをマウスで右クリックして「プログラムから開く」の「ソースコードエディター」を選ぶ。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.monobook.app1">
	<uses-sdk 
        android:minSdkVersion="21" 
        android:targetSdkVersion="28" />
    
    <!-- network_security_config.xmlを適用する -->
	<application 
        android:label="app1.Android" 
        android:networkSecurityConfig="@xml/network_security_config">
        />
    
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
</manifest>


関連項目 編集