프로그래밍 언어/Android

Android 8: Cleartext HTTP traffic not permitted 오류

Rateye 2021. 7. 12. 11:50
728x90
반응형

 

질문 : Android 8 : 일반 텍스트 HTTP 트래픽이 허용되지 않음

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 설정해도 도움이되지 않으며, 어쨌든 기본값입니다) 네트워크 보안 정보를 사용하지도 않습니다. 내가 전화하면 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted() , 그것은 반환 false 안드로이드 (8), 대한 true 같은 APK 파일을 사용하여 이전 버전에 대한. Android O에 대한 Google 정보에서 이에 대한 언급을 찾으려고했지만 성공하지 못했습니다.

답변

네트워크 보안 구성에 따라 -

Android 9 (API 레벨 28)부터 일반 텍스트 지원은 기본적으로 사용 중지됩니다.

또한 Android M과 일반 텍스트 트래픽에 대한 전쟁을 살펴보십시오.

Google의 Codelabs 설명

옵션 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로 설정할 수도 있습니다.이 속성을 2로 설정하면 앱이 다른 SELinux 샌드 박스로 전환됩니다. 수준 2 샌드 박스에는 다음 제한 사항이 적용됩니다.

  • 네트워크 보안 구성에서 usesCleartextTraffic 의 기본값은 false입니다.
  • Uid 공유는 허용되지 않습니다.

따라서 옵션 4-

<manifest>android:targetSandboxVersion 이 있으면 1

AndroidManifest.xml-

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

 

출처 : https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted
728x90
반응형