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에 대한 정보를 찾으려고했지만 성공하지 못했습니다.false
true
답변
에 따르면 네트워크 보안 구성 –
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 샌드 박스에는 다음 제한 사항이 적용됩니다.
- 기본값
usesCleartextTraffic
Network 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로부터의 변경 HTTP
에HTTPS
;
작동합니다 !!!
답변
<?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만큼 쉬워졌습니다. 메인 | 환경을 해제하십시오 .
그것에 큰 이점은 … 당신은 당신의 프로덕션 매니 페스트에 디버그 물건이 없으며 똑바로 쉽고 유지 보수가 쉬운 구조를 유지