Davranış değişiklikleri: API düzeyi 28 ve sonraki sürümleri hedefleyen uygulamalar

Android 9 (API düzeyi 28), Android sisteminde bazı değişiklikler yaptık. Aşağıdaki davranış değişiklikleri yalnızca API düzeyi 28 veya üstünü hedefleyen uygulamalar için geçerlidir. targetSdkVersion ayarını API düzeyi 28 veya daha yüksek olarak ayarlayan uygulamalar, uygun olduğu durumlarda uygulamalarını bu davranışları doğru bir şekilde destekleyecek şekilde değiştirmelidir.

Hedefledikleri API düzeyinden bağımsız olarak, Android 9'da çalışan tüm uygulamaları etkileyen değişiklikler için Davranış değişiklikleri: tüm uygulamalar bölümüne bakın.

Ön plan hizmetleri

Android 9 veya sonraki sürümleri hedefleyen ve ön plan hizmetlerini kullanan uygulamalar FOREGROUND_SERVICE iznini talep etmelidir. Bu normal bir izin olduğundan sistem, bunu isteyen uygulamaya otomatik olarak verir.

Android 9 veya sonraki sürümleri hedefleyen bir uygulama FOREGROUND_SERVICE isteğinde bulunmadan ön plan hizmeti oluşturmaya çalışırsa sistem bir SecurityException gönderir.

Gizlilikle ilgili değişiklikler

Uygulamanız Android 9'u hedefliyorsa aşağıdaki davranış değişikliklerini göz önünde bulundurmalısınız. Cihaz seri ve DNS bilgilerinde yapılan bu güncellemeler, kullanıcı gizliliğini artırır.

Derleme seri numarasının kullanımdan kaldırılması

Android 9'da Build.SERIAL, kullanıcıların gizliliğini korumak için her zaman "UNKNOWN" olarak ayarlanmıştır.

Uygulamanızın bir cihazın donanım seri numarasına erişmesi gerekiyorsa bunun yerine READ_PHONE_STATE iznini talep edip getSerial() numaralı telefonu arayın.

DNS gizliliği

Android 9'u hedefleyen uygulamalar, gizli DNS API'lerini kullanmalıdır. Uygulamalar özellikle, sistem çözümleyicisi TLS üzerinden DNS yapıyorsa herhangi bir yerleşik DNS istemcisinin ya sistemle aynı ana makine adına şifrelenmiş DNS kullanması ya da sistem çözümleyicisi yerine devre dışı bırakılması gerekir.

Çerçeve güvenliği değişiklikleri

Android 9, uygulamanızın güvenliğini iyileştiren çeşitli davranış değişiklikleri içerir. Ancak bu değişiklikler yalnızca uygulamanız API düzeyi 28 veya üstünü hedeflediğinde geçerli olur.

Ağ TLS varsayılan olarak etkin

Uygulamanız Android 9 veya sonraki bir sürümü hedefliyorsa isCleartextTrafficPermitted() yöntemi varsayılan olarak false değerini döndürür. Uygulamanızın belirli alanlar için şifresiz metni etkinleştirmesi gerekiyorsa uygulamanızın Ağ Güvenliği Yapılandırması'nda bu alanlar için cleartextTrafficPermitted değerini bu alanlar için açıkça true olarak ayarlamanız gerekir.

İşleme göre ayrılmış web tabanlı veri dizinleri

Android 9'da uygulama kararlılığını ve veri bütünlüğünü iyileştirmek amacıyla uygulamalar, birden fazla işlem arasında tek bir WebView veri dizinini paylaşamaz. Bu tür veri dizinleri genellikle çerezleri, HTTP önbelleklerini ve web'e göz atmayla ilgili diğer kalıcı ve geçici depolama alanlarını depolar.

Çoğu durumda, uygulamanız android.webkit paketindeki sınıfları (ör. WebView ve CookieManager) yalnızca bir işlemde kullanmalıdır. Örneğin, WebView kullanan tüm Activity nesnelerini aynı işleme taşımanız gerekir. Uygulamanızın diğer işlemlerinde disableWebView() yöntemini çağırarak "yalnızca tek bir işlem" kuralını daha sıkı bir şekilde uygulayabilirsiniz. Bu çağrı, bağımlı bir kitaplıktan çağrılsa bile WebView ürününün bu diğer işlemlerde yanlışlıkla başlatılmasını engeller.

Uygulamanızın birden fazla işlemde WebView örneklerini kullanması gerekiyorsa bu işlemde belirli bir WebView örneğini kullanmadan önce WebView.setDataDirectorySuffix() yöntemini kullanarak her işlem için benzersiz bir veri dizini son eki atamanız gerekir. Bu yöntem, her işlemdeki web verilerini uygulamanızın veri dizini içindeki kendi dizinine yerleştirir.

Uygulama başına SELinux alanları

Android 9 veya sonraki sürümleri hedefleyen uygulamalar dünya genelinde erişilebilen Unix izinlerini kullanarak diğer uygulamalarla veri paylaşamaz. Bu değişiklik, Android Uygulama Korumalı Alanı'nın bütünlüğünü, özellikle de bir uygulamanın özel verilerine yalnızca o uygulama tarafından erişilebilir olma şartını iyileştirmektedir.

Diğer uygulamalarla dosya paylaşmak için bir içerik sağlayıcı kullanın.

Bağlantı değişiklikleri

Bağlantı verilerini sayma ve çoklu yol

Android 9 veya sonraki sürümleri hedefleyen uygulamalarda sistem, varsayılan ayar olmayan ağlardaki ağ trafiğini (ör. cihaz kablosuz bağlantı açıkken gerçekleşen hücresel trafik) sayar ve bu trafiği sorgulamak için NetworkStatsManager sınıfında yöntemler sağlar.

Özellikle, getMultipathPreference() artık yukarıda belirtilen ağ trafiğine dayalı bir değer döndürüyor. Android 9'dan itibaren, yöntem hücre verileri için true değerini döndürür, ancak bir gün içinde belirli bir miktardan fazla trafik biriktiğinde false döndürmeye başlar. Android 9'da çalışan uygulamalar yöntemi çağırmalı ve bu ipucuna uymalıdır.

ConnectivityManager.NetworkCallback sınıfı artık uygulamalara VPN'ler hakkında bilgi gönderir. Bu değişiklik, uygulamaların eşzamanlı ve eşzamansız çağrıları birlikte kullanmak ve sınırlı API'ler kullanmak zorunda kalmadan bağlantı etkinliklerini dinlemesini çok daha kolay hale getirir. Ayrıca, bir cihaz aynı anda birden fazla kablosuz ağa veya birden fazla hücre ağına bağlandığında bilgi aktarımı beklendiği gibi çalışır.

Apache HTTP istemcisini kullanımdan kaldırma

Android 6.0'da Apache HTTP istemcisi desteğini kaldırdık. Android 9'dan itibaren bu kitaplık, bootclasspath'dan kaldırılır ve varsayılan olarak uygulamalar tarafından kullanılamaz.

Android 9 ve sonraki sürümleri hedefleyen uygulamalar Apache HTTP istemcisini kullanmaya devam etmek için aşağıdakileri AndroidManifest.xml kodlarına ekleyebilir:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Çalışma zamanı Apache kitaplığını kullanmaya alternatif olarak uygulamalar, org.apache.http kitaplığının kendi sürümlerini APK'larında paketleyebilirler. Bunu yaparsanız çalışma zamanında sağlanan sınıflarla ilgili sınıf uyumluluğu sorunlarını önlemek için kitaplığı yeniden paketlemeniz (Jar Jar gibi bir yardımcı programla) gerekir.

Kullanıcı arayüzü değişiklikleri

Odağı göster

Alanı 0 olan (genişlik veya yüksekliği 0 olan) görünümlere artık odaklanılamaz.

Ayrıca, dokunma modunda artık etkinlikler ilk odağı dolaylı yoldan atamaz. Bunun yerine, ilk odaklamayı açıkça istemek size bağlıdır.

CSS RGBA onaltılık değeri işleme

Android 9 veya sonraki sürümleri hedefleyen uygulamalar, 4 ve 8 on altılık CSS renklerini işlemeyle ilgili taslak CSS Renk Modülü Düzey 4 davranışını etkinleştirmelidir.

CSS Renk Modülü Düzey 4, Chrome tarafından 52. sürümünden beri desteklense de mevcut Android uygulamalarının Android sıralamasında (ARGB) 32 bit onaltılık renkler içerdiği tespit edildiğinden, Web Görünümü şu anda bu özelliği devre dışı bırakmaktadır. Bu durum, oluşturma hatalarına neden olabilir.

Örneğin, #80ff8080 rengi şu anda API düzeyi 27 veya altını hedefleyen uygulamalar için Web Görünümü'nde opak açık kırmızı (#ff8080) olarak oluşturulmaktadır. İlk bileşen (Android tarafından alfa bileşeni olarak yorumlanır) şu anda yoksayılıyor. Bir uygulama API düzeyi 28 veya üstünü hedefliyorsa #80ff8080% 50 şeffaf açık yeşil (#80ff80) olarak yorumlanır.

Dosya için MIME türü yoklama: URI'ler

Android 9'dan önceki Android sürümleri, MIME türlerini dosya içeriklerinden belirleyebilir. Android 9'dan başlayarak (API düzeyi 28) uygulamalar, file: URI'lerini Web Görünümü'ne yüklerken doğru dosya uzantısını kullanmalıdır.

MIME türlerini anlamak için dosya içeriğinin kullanılması güvenlik hatalarına yol açabilir ve modern tarayıcılar buna genellikle izin vermez.

Bir dosyanın .html, .txt, .js veya .css gibi tanınan bir dosya uzantısı varsa MIME türü, uzantıya göre belirlenir. Bir dosyanın uzantısı yoksa veya tanınmayan bir dosya varsa MIME türü düz metin olur.

Örneğin, file:///sdcard/test.html gibi bir URI HTML olarak oluşturulur, ancak file:///sdcard/test gibi bir URI, dosya HTML verileri içerse bile düz metin olarak oluşturulur.

Doküman kaydırma öğesi

Android 9, bir dokümanın kök öğesinin kaydırma öğesi olduğu durumları düzgün şekilde ele alır. Önceki sürümlerde, kaydırma konumu gövde öğesinde ayarlıydı ve kök öğe sıfır kaydırma değerine sahipti. Android 9, kaydırma öğesinin kök öğe olduğu standartlarla uyumlu davranışı sağlar.

Ayrıca document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop veya document.documentElement.scrollLeft ürünlerine doğrudan erişmek, hedef SDK'ya bağlı olarak farklı şekilde davranır. Görüntü alanı kaydırma değerlerine erişmek için varsa document.scrollingElement değerini kullanın.

Askıya alınmış uygulamalardan gelen bildirimler

Android 9'dan önce, askıya alınmış uygulamalardan gelen bildirimler iptal ediliyordu. Android 9'dan itibaren, askıya alınan uygulamalardan gelen bildirimler uygulama devam ettirilene kadar gizlenir.