Android 8 : 일반 텍스트 HTTP 트래픽이 허용되지 않습니다 not permitted at

Android 8 사용자의 백엔드 피드를 사용하는 내 앱에 콘텐츠가 표시되지 않는다는보고가있었습니다. 조사 결과 Android 8에서 다음과 같은 예외가 발생했습니다.

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(패키지 이름, URL 및 기타 가능한 식별자를 제거했습니다)

Android 7 이하에서는 모든 것이 작동하지만 android:usesCleartextTraffic매니페스트에서 설정 true하지 않으며 (어쨌든 기본값으로 도움이되지 않도록 설정 ) 네트워크 보안 정보를 사용하지 않습니다. 를 호출 하면 동일한 apk 파일을 사용하여 이전 버전의 Android 8에서 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()반환 됩니다. Google에서 Android O에 대한 정보를 찾으려고했지만 성공하지 못했습니다.falsetrue



답변

에 따르면 네트워크 보안 구성

Android 9 (API 레벨 28)부터 일반 텍스트 지원이 기본적으로 사용되지 않습니다.

또한 살펴보십시오- https://koz.io/android-m-and-the-war-on-cleartext-traffic/을

코드 랩 설명 – https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

옵션 1 –

먼저 “http : //”대신 “https : //”로 URL을 누르십시오.

옵션 2-

res / xml / network_security_config.xml 파일 작성-

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

AndroidManifest.xml-

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

옵션 3-

android : usesCleartextTraffic Doc

AndroidManifest.xml-

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

또한 @ david.s의 답변이 지적한 것처럼 android:targetSandboxVersion문제가 될 수 있습니다.

매니페스트 문서 에 따르면 –

android:targetSandboxVersion

이 앱에서 사용할 대상 샌드 박스입니다. 샌드 박스 버전 번호가 높을수록 보안 수준이 높아집니다. 기본값은 1입니다. 이 속성을 2로 설정하면 앱이 다른 SELinux 샌드 박스로 전환됩니다. 레벨 2 샌드 박스에는 다음 제한 사항이 적용됩니다.

  • 기본값 usesCleartextTrafficNetwork Security Config에서 은 false입니다.
  • UI 공유는 허용되지 않습니다.

따라서 옵션 4-

당신이있는 경우 android:targetSandboxVersion<manifest>그 다음에 그것을 감소1

AndroidManifest.xml-

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

답변

AndroidManifest 에서이 매개 변수를 찾았습니다.

android:networkSecurityConfig="@xml/network_security_config"

@ xml / network_security_config는 network_security_config.xml에서 다음과 같이 정의됩니다.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

방금 cleartextTrafficPermitted를 true로 변경했습니다.


답변

나의 문제 안드로이드 9 http로 도메인을 통해 웹보기에에서 솔루션을 탐색 한 이 답변

<application
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

과:

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>

답변

디버깅하는 동안 일반 텍스트 만 허용하고 프로덕션 환경에서 일반 텍스트를 거부하면 보안 상 이점을 유지할 수 있습니다. https를 지원하지 않는 개발 서버에 대해 앱을 테스트하기 때문에 유용합니다. 다음은 프로덕션 환경에서 https를 적용하는 방법이지만 디버그 모드에서 일반 텍스트를 허용합니다.

build.gradle에서 :

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

AndroidManifest.xml의 애플리케이션 태그에서

android:usesCleartextTraffic="${usesCleartextTraffic}"

답변

당신의 URL로부터의 변경 HTTPHTTPS ;

작동합니다 !!!


답변

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

위에 제공된 제안에서 http://xyz.abc.com/mno/ 로 내 URL을 제공하고있었습니다.

xyz.abc.com으로 변경 한 다음 작동하기 시작했습니다.


답변

좋아, 그것은 ⇒⇒ 아닙니다 . 수천 번 반복해서 매니페스트추가 하지만 이것에 근거하는 힌트이지만 추가 이점 (및 배경 정보)을 제공합니다.

Android에는 src-Directory에 대한 일종의 덮어 쓰기 기능이 있습니다.

기본적으로

/ app / src / 메인

그러나 AndroidManifest.xml을 덮어 쓰는 디렉토리를 추가 할 수 있습니다. 작동 방식은 다음과 같습니다.

  • 디렉토리 만들기 / app / src / debug를
  • 내부에서 AndroidManifest.xml 생성

이 파일 안에 모든 규칙을 넣을 필요는 없지만 / app / src /에서 덮어 쓰려는 규칙 만 main / AndroidManifest.xml 쓰려

요청 된 CLEARTEXT-Permission에 대한 예는 다음과 같습니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

이 지식을 통해 디버그 에 따라 권한을 오버로드하는 것이 1,2,3만큼 쉬워졌습니다. 메인 | 환경을 해제하십시오 .

그것에 큰 이점은 … 당신은 당신의 프로덕션 매니 페스트에 디버그 물건이 없으며 똑바로 쉽고 유지 보수가 쉬운 구조를 유지