Android P - NetworkSecurityPolicy.isCleartextTrafficPermitted false当network-security-config base-config cleartextTrafficPermitted为true时

Dan*_*ols 2 https android http android-9.0-pie

这是在Android P上使用支持库版本28.0.0-rc01.

我已根据几个SO帖子关注此问题的说明/解决方案:

如何解决Android P DownloadManager停止"不允许使用明文HTTP流量到127.0.0.1"?

Android 8:不允许使用Cleartext HTTP流量

以及其他几个人.

问题是即使network-security-config base-config将此值设置为true,当我检查NetworkSecurityPolicy.isCleartextTrafficPermitted时它返回false.导航到WebView中的非https页面时,会导致ERR_CLEARTEXT_NOT_PERMITTED错误.

这是AndroidManifest的一个片段

<application
    ...
    android:supportsRtl="true"
    android:networkSecurityConfig="@xml/network_security_config"
    android:usesCleartextTraffic="true">
Run Code Online (Sandbox Code Playgroud)

我试过这个包括'usesCleartextTraffic',只是'networkSecurityConfig'和两者的组合.

这是相关的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>
Run Code Online (Sandbox Code Playgroud)

请注意,我已经尝试过使用和不使用'trust-anchors'.我确实有AndroidManifest和network-security-config以及调试版本.但是,两者都具有相同的设置(除系统外,debug还允许用户证书).

我还通过检查logcat来验证正在读取安全策略.在这一点上,我感到茫然,因为它似乎没有被尊重.

任何帮助,将不胜感激.

Dan*_*ols 7

出于某种原因,即使设置几乎相同,调试AndroidManifest和network-security-config也会导致问题 - 唯一的区别是调试版本也允许用户生成证书.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:networkSecurityConfig="@xml/network_security_config"
        tools:targetApi="n" />

</manifest>
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <base-config cleartextTrafficPermitted="true" >
           <trust-anchors>
               <!-- Trust user added CAs while debuggable only -->
               <certificates src="user" />
               <certificates src="system" />
           </trust-anchors>
        </base-config>
    </debug-overrides>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)

删除调试AndroidManifest.xml和network_security_config.xml文件解决了该问题.我仍然不确定为什么会这样,但我们不再需要调试清单,所以现在就这样做.


小智 6

我只有:

android:usesCleartextTraffic="true" 
Run Code Online (Sandbox Code Playgroud)

在清单中并删除network_security_config.xml。这似乎有效!