Android N 预览版不允许使用明文 HTTP 流量访问 myserver.com。

20

昨天我收到了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 问题跟踪器中发现了建议。他们建议将 network_security_config 定义移动到 meta-data 中。尽管如此,我仍然遇到相同的异常。


1
你确定已经让你的应用程序使用了配置文件吗?例如,在你的应用清单中添加 android:networkSecurityConfig="@xml/network_security_config" - vcsjones
我似乎没有这个问题,至少在我刚测试的应用程序中是这样。纯文本HTTP流量很好。您可以尝试完全卸载并重新安装应用程序。另外,您是否使用了StrictMode?也许detectCleartextNetwork()被打开了。 - CommonsWare
我已经卸载并重新安装了几次,而且我没有使用StrictMode。然而,我无法在清单中定义networkSecurityConfig。我将更新问题。 - SimonSays
你正在使用OKHttp吗? - Ruchira Randana
当我尝试在清单文件中定义networkSecurityConfig时,会出现编译错误--请将compileSdkVersionbuildSdkTools版本升级至"24.0.0"。 - CommonsWare
除了添加network_security_config文件外,你还在清单文件中链接它了吗?例如:<application android:networkSecurityConfig="@xml/network_security_config" ...> - Ruchira Randana
8个回答

19
android:usesCleartextTraffic="true"

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


16

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

如果您无法等待下一个 Android N 开发者预览版,请检查应用程序是否有修改自己的 ApplicationInfo.flags 的地方。通常采用以下形式:getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLEgetApplicationInfo().flags = ApplicationInfo.FLAG_DEBUGGABLE。解决这些用法的方法是 (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)

或者,作为一种变通方法,在应用程序生命周期的尽早阶段调用 NetworkSecurityPolicy.isCleartextTrafficPermitted()。如果在篡改 ApplicationInfo.flags 的代码之前调用此解决方法,则应该可以正常工作。


只是好奇,你是否发现你的应用程序意外修改了其“ApplicationInfo.flags”? - Alex Klyubin
是的,确实如此。我们在检查时使用了&=而不是简单的& - SimonSays
4
从Android P开始,我们需要指定自定义的网络安全配置,其中包含cleartextTrafficPermitted=true选项,请参考Security Behavior Changes - https://developer.android.com/preview/features/security-behav#tls-enabled。 - Hrishikesh Kadam

5
尝试在应用程序标签中添加以下一行代码:

android:usesCleartextTraffic="true"

这将允许您的应用程序使用明文流量进行网络请求。请注意,这可能会影响应用程序的安全性和隐私性。
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
       ...
       android:usesCleartextTraffic="true"
       ...>
    </application>
</manifest>

3

enter image description here

<?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>

<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中解决了问题。 - 68060

1
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
       ...
       android:usesCleartextTraffic="true"
       ...>
    </application>
</manifest>

这个对我来说完美地运作了 :)


你救了我的一周。 - UNREAL

1

从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>

0

创建一个 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"

0
我在这里提供的最佳解决方案是将以下代码放在清单文件中。
android:usesCleartextTraffic="true"

这需要在应用程序标签下的清单文件中进行更新。对我来说完美地运作。 - Nikhil Dinesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接