Android P禁止http明文传输

本文详细解析了Android 9及以上版本中对HTTP明文流量的限制,并提供了两种解决方案,包括设置安全网络配置和调整targetSdkVersion,帮助开发者避免网络请求异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

从Android P(即Android 9)开始,Android系统会限制了http明文流量的网络请求,若是使用http访问都会抛出java.io.IOException: Cleartext HTTP traffic to ... not permitted异常,使用https就可以正常进行网络请求
官方说明

二、异常现象

1、若是targetSdkVersion >= 28的应用发起http网络请求,会抛出类似以下的异常:

 Caused by: java.io.IOException: Cleartext HTTP traffic to a.gdt.qq.com not permitted
        at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:124)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:462)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
        at com.qq.gdt.action.a.a.e.a(Unknown Source:65)
        at com.qq.gdt.action.a.a.e.a(Unknown Source:65)
        at com.qq.gdt.action.a.a.a.a.a(Unknown Source:10)
        at com.qq.gdt.action.a.a.a.c.a(Unknown Source:43)
        at com.qq.gdt.action.a.a.a.e.a(Unknown Source:8)
        at com.qq.gdt.action.a.a.a.c.a(Unknown Source:43)
        at com.qq.gdt.action.a.a.a.f.a(Unknown Source:4)
        at com.qq.gdt.action.a.a.a.c.a(Unknown Source:43)
        at com.qq.gdt.action.a.a.a.d.a(Unknown Source:34)
        at com.qq.gdt.action.a.a.a.c.a(Unknown Source:43)
        at com.qq.gdt.action.a.a.a.b(Unknown Source:36)
        at com.qq.gdt.action.a.a.a.a(Unknown Source:0)
        at com.qq.gdt.action.a.a.a$1.run(Unknown Source:2) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:919) 

三、异常分析

1、面向 Android 9(API 级别 28)及更高版本应用的网络安全默认配置如下所示:

<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

也就是说,Android 9之后,系统默认是限制明文传输,而且也只信任系统级别的证书,用户自定义的证书默认是不会信任的

2、面向 Android 7.0(API 级别 24)到 Android 8.1(API 级别 27)的应用的网络安全默认配置如下所示:


    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>

也就是说,Android 7.0-Android 8.1系统默认是允许明文传输,但是也是只信任系统级别的证书,用户自定义的证书默认是不会信任的
3、面向 Android 6.0(API 级别 23)及更低版本应用的默认网络安全配置如下所示:

    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
    

也就是说,Android 6.0以及以下版本,系统默认是允许明文传输,同时信任系统级别的证书与用户自定义的证书

四、解决方案

1、方案一:设置安全网络配置
1)在res/xml目录下新建文件:network_security_config.xml,内容设置如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 设置允许http明文传输-->
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <!-- 设置信任系统级别证书-->
            <certificates src="system" />
            <!-- 设置信任用户自定义证书,设置之后才能用fiddler之类的抓取https请求,出包最好不要设置,防止被抓包-->
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

2)在AndroidManifest.xml的application标签下增加以下属性声明:

android:networkSecurityConfig="@xml/network_security_config"

2、方案二:设置targetSdkVersion <= 28亦可

<think>好的,我现在需要帮助用户解决在Android中允许明文传输的问题。首先,我得回想一下Android的网络安全性配置相关知识。用户提到“允许明文传输”或相关问题,这通常涉及到应用需要与使用HTTP而不是HTTPS的服务器通信的情况。从Android 9(API 28)开始,默认禁止明文传输,所以需要配置应用允许。 首先,用户可能需要在应用的清单文件中设置usesCleartextTraffic属性。这应该是在<application>标签里,设置为true。不过我记得在Android 9及以上版本,这个默认是false,所以需要显式设置。 另外,还有一种方法是通过网络安全配置文件,也就是res/xml/network_security_config.xml。在这里可以指定哪些域名允许明文传输,这样更灵活。比如可以创建一个配置文件,然后在清单中引用它。 然后,用户可能需要知道如何分域名允许明文,比如针对特定的测试环境或者本地服务器。这时候需要在network_security_config.xml中使用<domain-config>标签,设置cleartextTrafficPermitted为true,并指定相应的域。 还要考虑不同Android版本的区别。比如,在Android 9及以上,usesCleartextTraffic默认是false,而之前的版本是true。所以用户可能需要根据目标SDK版本来调整配置。 另外,用户可能会遇到在WebView中加载HTTP内容的问题,这时候除了上述配置,可能还需要在WebView设置中明确允许明文。不过我记得WebView可能默认遵循应用的网络安全配置,但可能需要额外的设置。 还要注意,如果用户的应用使用了一些第三方库或者特定的网络请求库,比如OkHttp或Retrofit,可能需要确保这些库的配置也允许明文传输,或者不强制使用HTTPS。 最后,可能需要提醒用户,允许明文传输会降低应用的安全性,建议仅在测试或必要的情况下使用,并最终迁移到HTTPS。 现在需要把这些步骤整理成清晰的配置方法,包括清单文件修改和网络安全配置文件的创建,以及注意事项。同时,根据用户提供的引用,可能涉及AndroidManifest.xml的解析过程,如引用[2]提到的PackageParser.parseBaseApk,说明配置的正确性会影响应用的解析和运行。此外,引用[1]和[3]可能不太相关,但需要确保答案的准确性。 另外,生成相关问题的时候,需要考虑用户可能进一步的问题,比如如何处理特定版本的配置,或者如何排除故障,以及安全建议等。</think>### Android允许明文传输的配置方法 在Android应用中允许明文传输HTTP协议),需根据目标API级别进行配置,以下是两种主要方法: #### 方法一:全局允许明文传输(适用于所有域名) 在$AndroidManifest.xml$文件中添加$android:usesCleartextTraffic$属性: ```xml <application android:usesCleartextTraffic="true" ...> </application> ``` *适用场景*:开发测试环境或内部网络请求[^2] #### 方法二:分域名允许明文传输(推荐) 1. 创建网络安全配置文件$res/xml/network_security_config.xml$: ```xml <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">example.com</domain> <domain includeSubdomains="true">192.168.1.100</domain> </domain-config> </network-security-config> ``` 2. 在$AndroidManifest.xml$中引用配置: ```xml <application android:networkSecurityConfig="@xml/network_security_config" ...> </application> ``` #### 特殊组件配置(如WebView) 对于需要加载HTTP内容的WebView组件,需额外配置: ```java webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值