Android N preview上不允许向myserver.com发送明文HTTP流量

Android N preview上不允许向myserver.com发送明文HTTP流量,android,http,https,Android,Http,Https,昨天我升级了安卓N预览版。自从我升级后,我就不能再启动我的应用了 java.io.IOException: Cleartext HTTP traffic to myserver.com not permitted 我已尝试将清单中的usesCleartextTraffic设置为true,或添加network\u security\u config.xml <?xml version="1.0" encoding="utf-8"?> <network-security-conf

昨天我升级了安卓N预览版。自从我升级后,我就不能再启动我的应用了

java.io.IOException: Cleartext HTTP traffic to myserver.com not permitted
我已尝试将清单中的
usesCleartextTraffic
设置为
true
,或添加
network\u security\u 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>
<?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>
不太清楚为什么。文件在那里,一切看起来都很好


在谷歌的安卓问题跟踪器中找到建议。他们建议将
网络安全配置
定义移动到
元数据
。不过我还是遇到了同样的例外。

Android N Developer Preview 4中存在一个已知问题,即如果某个应用程序修改其
ApplicationInfo.flags
,它会触发来自该应用程序的明文通信阻塞,即使该应用程序没有请求明文通信阻塞。修复程序将在下一次开发人员预览中提供。因此,这与您的网络安全配置无关。事实上,看起来您甚至不需要声明自定义网络安全配置

如果你不能等到下一次Android N开发者预览,请检查你的应用程序是否有修改自己的
ApplicationInfo.flags
的地方。通常,其形式为
getApplicationInfo().flags&=ApplicationInfo.FLAG\u debugable
getApplicationInfo().flags=ApplicationInfo.FLAG\u debugable
。这些用法的修复程序是
(getApplicationInfo().flags&ApplicationInfo.FLAG\u debugable)

或者,作为一种解决方法,在应用程序的生命周期中尽早调用
NetworkSecurityPolicy.isClearTextTrafficAllowed()
。如果在篡改
ApplicationInfo.flags
的代码之前调用此变通方法,则此变通方法应该有效

android:usesCleartextTraffic="true"

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

创建一个XML res/XML/network\u security\u config.XML

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
<?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>

在应用程序标签中只尝试一行

android:UseClearTextTraffic=“true”


res/xml/network\u security\u 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>



这一条对我来说非常有效:)

我在这里提出的最佳解决方案是清单中应包含以下代码

android:usesCleartextTraffic="true"

从API级别28开始,默认情况下禁用
usesleartexttraffic
。因此,如果要启用它,请在androidManifest文件中将
usesCleartextTraffic
设置为true,如下所示

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


可以肯定的是,你真的告诉你的应用程序使用配置文件了吗?e、 g.
android:networkSecurityConfig=“@xml/network\u security\u config”
在您的应用程序清单中。至少在我刚刚测试的应用程序中,我似乎没有这个问题。纯文本HTTP通信是正常的。您可以尝试完全卸载并重新安装该应用程序。另外,您是否正在使用
StrictMode
?可能已经被卸载和重新安装了好几次,我没有使用StrictMode。但我无法在清单中定义networkSecurityConfig。我将更新问题“你在使用OKHttp吗?”“当我试图在清单中定义networkSecurityConfig时,我得到了一个编译错误”--移动到
CompilesDKVersion24
buildSdkTools“24.0.0”
。只是好奇,你是否发现你的应用程序意外地修改了它的
ApplicationInfo.flags
?是的。我们使用了一个
&=
进行检查,而不是Android P中的一个简单的
&
,我们需要指定自定义网络安全配置,该配置具有ClearTextTrafficAllowed=true,检查安全行为更改-这需要在应用程序标记下的清单文件中更新。对我来说很合适。
android:usesCleartextTraffic="true"
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
       ...
       android:usesCleartextTraffic="true"
       ...>
    </application>
</manifest>