Android N 预览版中不允许到 myserver.com 的明文 HTTP 流量
Posted
技术标签:
【中文标题】Android N 预览版中不允许到 myserver.com 的明文 HTTP 流量【英文标题】:Cleartext HTTP traffic to myserver.com not permitted on Android N preview 【发布时间】:2016-10-18 09:49:25 【问题描述】:昨天我获得了 android N 预览版的新升级。自从我升级后,我再也无法启动我的应用程序了。
java.io.IOException: Cleartext HTTP traffic to myserver.com not permitted
我尝试在清单中将usesCleartextTraffic
设置为true
或添加network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">myserver.com</domain>
</domain-config>
</network-security-config>
都没有工作。对那里发生的事情有任何想法吗?
当我尝试在清单中定义 networkSecurityConfig 时,出现编译错误
Error:(35) No resource identifier found for attribute 'networkSecurityConfig' in package 'android'
不太清楚为什么。文件在那里,一切看起来都很好。
在 Google 的 Android 问题跟踪器中找到 this 建议。他们建议将network_security_config
定义移动到meta-data
。不过,我仍然遇到同样的异常。
【问题讨论】:
为了确定,您实际上告诉您的应用程序使用配置文件?例如android:networkSecurityConfig="@xml/network_security_config"
在您的应用程序清单中。
我似乎没有这个问题,至少在我刚刚测试的应用程序中。纯文本 HTTP 流量很好。您可以尝试完全卸载并重新安装该应用程序。另外,你在用StrictMode
吗?也许detectCleartextNetwork()
正在开启
我已经卸载并重新安装了几次,但我没有使用 StrictMode。我无法在清单中定义 networkSecurityConfig。我会更新问题
你在用OKHttp吗?
“当我尝试在清单中定义 networkSecurityConfig 时,出现编译错误”——移至 compileSdkVersion 24
和 buildSdkTools "24.0.0"
。
【参考方案1】:
android:usesCleartextTraffic="true"
将此行放在清单文件中的应用程序标记中
【讨论】:
【参考方案2】:在 Android N Developer Preview 4 中存在一个已知问题,如果应用修改其 ApplicationInfo.flags
,它会触发阻止来自应用的明文流量,即使该应用未请求阻止明文流量也是如此。该修复程序在下一个开发者预览版中。因此,这与您的网络安全配置无关。事实上,看起来您甚至不需要声明自定义网络安全配置。
如果您不能等到下一个 Android N 开发者预览版,请检查您的应用是否有修改自己的ApplicationInfo.flags
的地方。通常采用getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE
或getApplicationInfo().flags = ApplicationInfo.FLAG_DEBUGGABLE
的形式。这些用法的修复是(getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)
。
或者,作为一种解决方法,请在应用的生命周期中尽早调用NetworkSecurityPolicy.isCleartextTrafficPermitted()
。如果在篡改ApplicationInfo.flags
的代码之前调用此解决方法应该可以工作。
【讨论】:
只是好奇,你有没有发现你的应用不小心修改了它的ApplicationInfo.flags
?
是的。我们使用&=
进行检查,而不是简单的&
在 Android P 中,我们需要指定具有 cleartextTrafficPermitted=true 的自定义网络安全配置,检查安全行为更改 - developer.android.com/preview/features/…【参考方案3】:
尝试在您的应用程序标签中只写一行
android:usesCleartextTraffic="true"
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
</application>
</manifest>
【讨论】:
【参考方案4】: res/xml/network_security_config.xml<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning"
android:networkSecurityConfig="@xml/network_security_config">
<activity android:name=".activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
【讨论】:
谢谢!!为我修复了它,将信任锚添加到 network_security_config.xml。【参考方案5】:<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
</application>
</manifest>
这个对我来说很完美:)
【讨论】:
【参考方案6】:我在这里提出的最佳解决方案是清单中应包含以下代码
android:usesCleartextTraffic="true"
【讨论】:
这需要在manifest文件中的application标签下进行更新。非常适合我。【参考方案7】:从 API 级别 28 开始,usesCleartextTraffic
默认被禁用。所以,如果你想启用它,然后像这样在 androidManifest 文件中将usesCleartextTraffic
设置为 true,
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
</application>
</manifest>
【讨论】:
【参考方案8】:创建一个 XML res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
在 AndroidManifest.xml 内的标记应用程序中引用此文件。喜欢:
android:networkSecurityConfig="@xml/network_security_config"
【讨论】:
以上是关于Android N 预览版中不允许到 myserver.com 的明文 HTTP 流量的主要内容,如果未能解决你的问题,请参考以下文章
Android-L 预览版中的 AppCompat / Chromecast
适用于 Android 的 Android 地图 SDK 在发行版中不工作
Flutter Firebase GoogleSignIn 在发行版中不起作用