Android 8を使用しているユーザーから、私のアプリ(バックエンドフィードを使用している)でコンテンツが表示されないという報告を受けました。調査の結果、Android 8では以下のような例外が発生していることがわかりました。
08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
(パッケージ名、URL、その他可能性のある識別子は削除しています)
Android 7以下では、マニフェストでandroid:usesCleartextTraffic
を設定していませんし(true
に設定しても効果はありません、どちらにしてもそれがデフォルト値です)、ネットワークセキュリティ情報も使っていません。NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()を呼び出すと,同じapkファイルを使って,Android 8ではfalse
,古いバージョンではtrue`が返されます。
GoogleのAndroid Oに関する情報で、この件に関する記述を見つけようとしましたが、成功しませんでした。
ネットワークセキュリティの設定]1による。
Android 9 (APIレベル28)から、平文サポートが無効になります。 デフォルトでは
https://koz.io/android-m-and-the-war-on-cleartext-traffic/ もご参照ください。
**オプション1
ファイル res/xml/network_security_config.xml を作成する。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">domain.com (to be adjusted)</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml - の作成
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
オプション2 -
android:usesCleartextTraffic Docを参照してください。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
また、@david.s' answerで指摘されているように、android:targetSandboxVersion
も問題になります。
Manifest Docs][3]によると-。
android:targetSandboxVersion
です。このアプリが使用するサンドボックスのバージョンです。サンドボックスのバージョンが高ければ高いほど 番号が高いほど、セキュリティのレベルが高くなります。デフォルト値は1です。 この属性を2に設定すると、アプリが別のSELinuxサンドボックスに切り替わります。 別のSELinuxサンドボックスに切り替わります。レベル2のサンドボックスには次のような制限があります。 レベル2のサンドボックスには次のような制限があります。
- Network Security Config の
usesCleartextTraffic
のデフォルト値は false です。- UID の共有は許可されていません。
だからオプション3 -。
もし <manifest>
に android:targetSandboxVersion
があれば、それを 1
にしてください。
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
[3]: https://developer.android.com/guide/topics/manifest/manifest-element#targetSandboxVersion
AndroidManifestの中に、このようなパラメータがありました。
android:networkSecurityConfig="@xml/network_security_config"
また、@xml/network_security_configはnetwork_security_config.xmlで次のように定義されています。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--Set application-wide security config using base-config tag.-->
<base-config cleartextTrafficPermitted="false"/>
</network-security-config>
ただ、cleartextTrafficPermittedをtrueに変更しました。
OK、これを理解しました。インスタントアプリのバージョンもあるので追加したマニフェストパラメータandroid:targetSandboxVersion="2"
が原因です。これにより、ユーザーがインスタントアプリから通常のアプリにアップグレードしても、データが転送中に失われることはないはずです。しかし、漠然とした説明の通りです。
このアプリが使用したいターゲットサンドボックスを指定します。サンドボックスのバージョンが上がれば上がるほど、セキュリティのレベルも上がります。
この属性のデフォルト値は1です。
また、少なくともAndroid 8では、明らかに新しいレベルのセキュリティポリシーが追加されています。