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 24buildSdkTools "24.0.0" 【参考方案1】:
android:usesCleartextTraffic="true"

将此行放在清单文件中的应用程序标记中

【讨论】:

【参考方案2】:

在 Android N Developer Preview 4 中存在一个已知问题,如果应用修改其 ApplicationInfo.flags,它会触发阻止来自应用的明文流量,即使该应用未请求阻止明文流量也是如此。该修复程序在下一个开发者预览版中。因此,这与您的网络安全配置无关。事实上,看起来您甚至不需要声明自定义网络安全配置。

如果您不能等到下一个 Android N 开发者预览版,请检查您的应用是否有修改自己的ApplicationInfo.flags 的地方。通常采用getApplicationInfo().flags &amp;= ApplicationInfo.FLAG_DEBUGGABLEgetApplicationInfo().flags = ApplicationInfo.FLAG_DEBUGGABLE 的形式。这些用法的修复是(getApplicationInfo().flags &amp; ApplicationInfo.FLAG_DEBUGGABLE)

或者,作为一种解决方法,请在应用的生命周期中尽早调用NetworkSecurityPolicy.isCleartextTrafficPermitted()。如果在篡改ApplicationInfo.flags 的代码之前调用此解决方法应该可以工作。

【讨论】:

只是好奇,你有没有发现你的应用不小心修改了它的ApplicationInfo.flags 是的。我们使用&amp;= 进行检查,而不是简单的&amp; 在 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 在发行版中不起作用

.NET Core 3 预览版:不允许同步操作

如何在 Windows 10 开发者预览版中启用 Bash?

在相机预览中不工作 setAlpha