Android 8 kullanan kullanıcılardan uygulamamın (arka uç beslemesini kullanan) içeriği göstermediğine dair raporlar aldım. Araştırmadan sonra Android 8'de aşağıdaki İstisnanın gerçekleştiğini buldum:
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)
(Paket adını, URL'yi ve diğer olası tanımlayıcıları kaldırdım)
Android 7 ve altında her şey çalışıyor, Manifest'te android:usesCleartextTraffic' ayarını yapmıyorum (ve
true' olarak ayarlamak yardımcı olmuyor, zaten varsayılan değer bu), Ağ Güvenliği Bilgilerini de kullanmıyorum. Eğer NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
çağırırsam, aynı apk dosyasını kullanarak Android 8 için false
, eski sürüm için true
döndürüyor.
Google'da Android O hakkında bilgi bulmaya çalıştım ama başarılı olamadım.
Ağ güvenliği yapılandırması]1'e göre -
Android 9 (API düzeyi 28) ile başlayarak, açık metin desteği devre dışı bırakılır varsayılan olarak.
Ayrıca bir göz atın - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Seçenek 1 -
res/xml/network_security_config.xml dosyasını oluşturun -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">domain.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>
Seçenek 2 -
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>
Ayrıca @david.s' answer'nin de belirttiği gibi `android:targetSandboxVersion' da bir sorun olabilir -
Manifest Docs]3'e göre
android:targetSandboxVersion
Bu uygulamanın kullanacağı hedef sanal alan. Sandbox sürümü ne kadar yüksekse sayısı, güvenlik seviyesi o kadar yüksek olur. Varsayılan değeri 1'dir; siz 2 olarak da ayarlayabilirsiniz. Bu özelliğin 2 olarak ayarlanması uygulamayı farklı bir SELinux sanal alanı. Aşağıdaki kısıtlamalar bir seviye 2 kum havuzu:
- Network Security Config'deki
usesCleartextTraffic
varsayılan değeri yanlıştır.- Uid paylaşımına izin verilmez.
Yani Seçenek 3 -
Eğer <manifest>
içinde android:targetSandboxVersion
varsa, bunu 1
e düşürün
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
AndroidManifest'te bu parametreyi buldum:
android:networkSecurityConfig="@xml/network_security_config"
ve @xml/network_security_config, network_security_config.xml içinde şu şekilde tanımlanır:
<?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>
sadece cleartextTrafficPermitted'i true olarak değiştirdim
Tamam, bunu çözdüm. Manifest parametresi android:targetSandboxVersion="2"
nedeniyle, Instant App sürümümüz de olduğu için ekledim - kullanıcı Instant App'ten normal uygulamaya yükselttiğinde, aktarımla verilerini kaybetmeyeceğinden emin olmalıdır. Ancak belirsiz açıklamanın önerdiği gibi:
Bu uygulamanın kullanmak istediği hedef sanal alanı belirtir. Daha yüksek sanbox sürümleri artan güvenlik seviyelerine sahip olacaktır.
Bu niteliğin varsayılan değeri 1'dir.
Açıkçası, en azından Android 8'de yeni bir güvenlik politikası seviyesi de ekliyor.