【问题标题】:Cleartext HTTP traffic to myserver.com not permitted on Android N previewAndroid N 预览版中不允许到 myserver.com 的明文 HTTP 流量
【发布时间】: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"

标签: android http https


【解决方案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"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-16
            • 2020-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多