Android 8.0 Davranış Değişiklikleri

Yeni özelliklerin ve yeteneklerin yanı sıra Android 8.0 (API düzeyi 26) çeşitli sistem ve API davranışı değişikliklerini içerir. Bu doküman anlamanız ve hesaba katmanız gereken önemli değişikliklerden bazılarını vurgular. inceleyebilirsiniz.

Bu değişikliklerin çoğu, uygulamanızın hangi sürümünden Android'i hedefler. Ancak bazı değişiklikler yalnızca uygulama hedeflemeyi etkiler Android 8.0 En fazla netlik kazandırmak için, sayfa iki bölüme ayrıldı: Tüm uygulamalardaki değişiklikler ve Uygulama hedeflemesiyle ilgili değişiklikler Android 8.0

Tüm uygulamalar için değişiklikler

Bu davranış değişiklikleri, aşağıdaki durumlarda tüm uygulamalar için geçerli olur: bağlantısından bağımsız olarak Android 8.0 (API düzeyi 26) platformunda çalıştırılması Hedefledikleri API düzeyi. Tüm geliştiriciler incelemelidir ve uygulamalarını destekleyecek şekilde değişiklikler yapabilirler. .

Arka planda yürütme sınırları

Android 8.0'ın (API düzeyi 26) kullanıma sunduğu değişikliklerden biri, Bu da uygulamanızın pil ömrünü uzatmaya, önbelleğe alındı etkin olmayan eyalet bileşenleri sistem, uygulamanın tuttuğu uyanık kalma kilitlerini serbest bırakır.

Ayrıca, cihaz performansını iyileştirmek için sistem bazı ön planda çalışmayan uygulamaların davranışlarıyla ilgilidir. Özellikle:

  • Arka planda çalışan uygulamalarda artık özgürce çalışan uygulamalar arka plan hizmetlerine erişebilirler.
  • Uygulamalar, çoğu örtülü yayına kaydolmak için manifestlerini kullanamaz (yani, özel olarak uygulamaya hedeflenmeyen yayınlar).

Varsayılan olarak bu kısıtlamalar yalnızca O hedefini hedefleyen uygulamalar için geçerlidir. Ancak, Kullanıcılar, herhangi bir uygulama için bu kısıtlamaları Ayarlar ekranından etkinleştirebilirler. uygulama O'yu hedeflemese bile

Android 8.0 (API düzeyi 26), belirli yöntemlerde yapılan aşağıdaki değişiklikleri de içerir:

  • startService() yöntemi artık Uygulamaysa IllegalStateException Android 8.0'ı hedefleyen reklamlar, bu yöntemi kullanmaya arka plan hizmetlerinin oluşturulmasına izin verilmediği durumlarda.
  • Yeni Context.startForegroundService() yöntemi, ön plan hizmetini kullanabilirsiniz. Sistem, uygulamalara izin verir Uygulama şu anda bile Context.startForegroundService() numaralı telefonu aramak için arka planda çalışır. Ancak, uygulama beş içinde bu hizmetin startForeground() yöntemini çağırmalıdır saniye kadar sürebilecek.

Daha fazla bilgi için bkz. Arka Plan Yürütme Sınırları.

Android arka planda konum sınırları

Pili, kullanıcı deneyimini ve sistem sağlığını korumak için arka plandaki uygulamalar bir cihazda kullanıldığında konum güncellemelerini daha seyrek alır Android 8.0 yüklü halde. Bu davranış değişikliği tüm uygulamaları etkiler Google Play Hizmetleri de dahil olmak üzere konum güncellemeleri alan kullanıcılar için geçerlidir.

Bu değişiklikler aşağıdaki API'leri etkilemektedir:

  • Çok Kaynaklı Konum Sağlayıcı (FLP)
  • Coğrafi sınır çizme
  • GNSS Ölçümleri
  • Konum Yöneticisi
  • Wi-Fi Yöneticisi

Uygulamanızın beklendiği gibi çalıştığından emin olmak için aşağıdaki adımları tamamlayın:

  • Uygulamanızın mantığını inceleyin ve en son konumu kullandığınızdan emin olun API'ler.
  • Uygulamanızın her kullanım için beklediğiniz davranışı sergileyip sergilemediğini test edin dava açın.
  • Şu özelliklerden faydalanabilirsiniz: Kaynaşmış Konum Sağlayıcı (FLP) veya coğrafi sınır belirleme, Kullanıcının mevcut konumu.

Bu değişiklikler hakkında daha fazla bilgi için Arka Planda Konum Sınırlar.

Uygulama kısayolları

Android 8.0 (API düzeyi 26), uygulama kısayollarında aşağıdaki değişiklikleri içerir:

  • com.android.launcher.action.INSTALL_SHORTCUT yayın numarası artık uygulamanız üzerinde herhangi bir etkisi yoktur, çünkü yayınla. Bunun yerine, requestPinShortcut(). yöntemini ShortcutManager sınıfından alır.
  • ACTION_CREATE_SHORTCUT intent, artık ShortcutManager sınıf. Bu amaç ayrıca, etkileşimde bulunmayan eski başlatıcı kısayolları ShortcutManager Önceden bu amaç doğrultusunda yalnızca eski başlatıcı kısayolları oluşturabilir.
  • Kısayollar kullanılarak oluşturulanlar requestPinShortcut(). ve kısayolları da içeren bir özellik içeren ACTION_CREATE_SHORTCUT intent'ler artık tam kapsamlı uygulama kısayolları. Sonuç olarak uygulamalar artık bunları güncelleyebilir ShortcutManager yöntemlerinden birini kullanın.
  • Eski kısayollar, önceki sürümlerdeki işlevlerini korur ancak bunları uygulamanızda manuel olarak uygulama kısayollarına dönüştürmeniz gerekir.

Uygulama kısayollarında yapılan değişiklikler hakkında daha fazla bilgi edinmek için şu sayfaya bakın: Kısayolları sabitleme ve Widget'lar özellik rehberi.

Yerel ayarlar ve uluslararasılaştırma

Android 7.0 (API düzeyi 24), ancak bazı API'ler varsayılan bir Kategori Yerel Ayarıdır ancak genel Locale.getDefault() yöntemini kullanmaları gerekir. Bunun yerine, varsayılan DISPLAY kategori Yerel Ayarı'nı kullanmaları gerekir. Android 8.0 (API düzeyi 26) sürümünde, Aşağıdaki yöntemlerde artık Locale.getDefault(Category.DISPLAY) yöntemi kullanılıyor (Locale.getDefault() yerine):

Locale.getDisplayScript(Locale) adlı kullanıcı da değeri Locale.getDefault() değerine düştüğünde Locale için displayScript değeri belirtildi bağımsız değişkeni kullanılamıyor.

Yerel ayarlar ve uluslararasılaştırmayla ilgili diğer değişiklikler aşağıdaki gibidir: şöyle olur:

  • Currency.getDisplayName(null) adlı kişiye NullPointerException gönderilir, davranışla tutarlı olması gerekir.
  • Saat dilimi adı ayrıştırma işlemi değişti. Daha önce Android cihazlar, başlatma sırasında örneklenen sistem saat değerini kullandı tarihi ayrıştırmak için kullanılan saat dilimi adlarını önbelleğe alma süresi kez. Sonuç olarak, sistem çalışır durumda değilse ayrıştırma işlemi olumsuz yönde etkilenebilir. veya nadiren görülen diğer durumlarda saat yanlış oluyordu.

    Yaygın durumlarda ayrıştırma mantığında ICU ve saat dilimi adlarını ayrıştırırken geçerli sistem saat değerine ayarlayın. Bu daha doğru sonuçlar verir ve bu sonuçlar öncekinden farklı olabilir. Uygulamanızda aşağıdaki gibi sınıfların kullanıldığı Android sürümleri: SimpleDateFormat

  • Android 8.0 (API düzeyi 26), ICU sürümünü 58 sürümüne günceller.

Uyarı aralıkları

Bir uygulama SYSTEM_ALERT_WINDOW kullanıyorsa izin verir ve aşağıdaki pencere türlerinden birini kullanarak diğer uygulamaların ve sistem pencerelerinin üzerinde uyarı pencereleri:

...bu pencereler her zaman TYPE_APPLICATION_OVERLAY pencere türü. Bir uygulama Android 8.0'ı (API düzeyi 26) hedefliyorsa, TYPE_APPLICATION_OVERLAY. pencere türünü seçin.

Daha fazla bilgi için Uygulamalara ilişkin davranış değişikliklerindeki uyarı pencereleri bölümü Android 8.0'ı hedefler.

Giriş ve gezinme

ChromeOS'te ve diğer geniş form faktörlerinde Android uygulamalarının ortaya çıkmasıyla yeni bir yeniden canlandığını gördük. Android uygulamaları. Android 8.0 (API düzeyi 26) sürümünde, klavyeyi gezinme giriş cihazı olarak kullanır ve böylece daha güvenilir, ok ve sekme tabanlı gezinme için tahmin edilebilir model

Özellikle öğe odağında aşağıdaki değişiklikler yapılmıştır davranış:

  • Belirli bir öğe için odak durumu rengi tanımlamadıysanız View nesne (ön planı veya arka planı) çekilebilirse) çerçeve, artık bu öğe için varsayılan odaklama rengi View. Odaklanılan bu öne çıkan özellik, bir e-posta alırsınız.

    Bir View nesnesinin bu varsayılanı kullanmasını istemiyorsanız üzerine gelindiğinde vurgulamayı, android:defaultFocusHighlightEnabled özelliğini false View veya false sonra şuraya geçin: setDefaultFocusHighlightEnabled().

  • Klavye girişinin kullanıcı arayüzü öğesinin odağını nasıl etkilediğini test etmek için Çizim > Düzen sınırlarını göster geliştirici seçeneği. Android'de 8.0'ı seçerseniz bu seçenekte "X" gösterilir üzerine geldiğinde odaklanacağız.

Ayrıca, Android 8.0'da tüm araç çubuğu öğeleri, otomatik olarak klavye gezinme kümeleri, bir araç çubuğuna giderek kullanıcıların her araç çubuğuna gitmesini ve araçtan çıkmasını bütün.

Klavyeyle gezinme desteğini nasıl iyileştirebileceğiniz hakkında hakkında daha fazla bilgi edinmek için Destekleyici Klavyeyle Gezinme rehberini inceleyin.

Web formlarını otomatik doldurma

Artık Android Otomatik Doldurma Çerçeve otomatik doldurma işlevi için yerleşik destek sunar. WebView nesneyle ilgili aşağıdaki yöntemler değiştirildi Android 8.0 (API düzeyi 26) çalıştıran cihazlarda yüklü uygulamalar için:

WebSettings
  • İlgili içeriği oluşturmak için kullanılan getSaveFormData(). yöntemi artık false değerini döndürüyor. Daha önce bu yöntem şu sonuçları döndürdü: Bunun yerine true.
  • Telefon etme setSaveFormData() kişi geri çevirdi artık bir etkisi olmaz.
WebViewDatabase
  • Telefon etme clearFormData() kişi geri çevirdi artık bir etkisi olmaz.
  • İlgili içeriği oluşturmak için kullanılan hasFormData() yöntem artık false değerini döndürüyor. Daha önce bu yöntem şu sonuçları döndürdü: Form veri içerdiğinde true.

Erişilebilirlik

Android 8.0 (API düzeyi 26), erişilebilirlikle ilgili aşağıdaki değişiklikleri içerir:

  • Erişilebilirlik çerçevesi artık tüm iki kez dokunma hareketlerini ACTION_CLICK. işlemlerdir. Bu değişiklik, TalkBack'in diğerlerine benzer davranışlarda bulunmasını sağlar. erişilebilirlik hizmetleri.

    Uygulamanızın View nesnesi özel dokunma kullanıyorsa TalkBack ile çalışmaya devam ettiğini doğrulamanız gerekir. En son haberleri sunan, View tıklama işleyicisini kaydetmeniz yeterlidir. bir örneğidir. TalkBack, bu alt sekmelerde gerçekleştirilen hareketleri hâlâ tanımıyorsa View nesne, geçersiz kılma performAccessibilityAction().

  • Erişilebilirlik hizmetleri artık Uygulamanızın içinde ClickableSpan örnek TextView nesne.

Uygulamanızı nasıl daha erişilebilir hale getirebileceğiniz hakkında daha fazla bilgi edinmek için Erişilebilirlik.

Ağ iletişimi ve HTTP(S) bağlantısı

Android 8.0 (API düzeyi 26), aşağıdaki davranış değişikliklerini içerir: ağ ve HTTP(S) bağlantısı:

  • Gövdesi olmayan OPTIONS istekte Content-Length: 0 var kullanabilirsiniz. Önceden, Content-Length başlıkları yoktu.
  • HttpURLConnection ifadesi boş yol içeren URL'leri ana makine veya yetkili adından sonra eğik çizgi koyun. Örneğin, http://example.com şuna dönüştürür: http://example.com/.
  • ProxySelector.setDefault() aracılığıyla ayarlanan özel bir proxy seçici yalnızca istenen URL'nin adresini (şema, ana makine ve bağlantı noktası) hedefler. Sonuç olarak, proxy seçiminde yalnızca bu değerler temel alınabilir. Bir URL özel proxy seçiciye iletilen, istenen URL'nin sorgu parametreleri veya parçaları içerebilir.
  • URI'lar boş etiketler içeremez.

    Önceden platform, boş etiketlerin kabul edilmesiyle ilgili bir geçici çözümü destekliyordu yasa dışı bir şekilde URI'ların kullanımını içeren ana makine adları. Bu geçici çözüm, eski libcore sürümleriyle uyumluluk. API'yi kullanan geliştiriciler şöyle bir ADB mesajı görür: "URI example..com'da boş etiketler var ana makine adını girin. Bu hatalı bilgi nedeniyle ileride Android cihazlarda kabul edilmeyecek artık geçerli değil. Android 8.0 bu geçici çözümü kaldırır; sistem, bozuk URI'lar için null.

  • Android 8.0’da HttpsURLConnection uygulaması güvenli olmayan TLS/SSL protokolü sürümü yedeği gerçekleştirmez.
  • Tünel HTTP(S) bağlantılarının işlenmesi aşağıdaki şekilde değiştirilmiştir:
    • Sistem, bağlantı üzerinden HTTPS bağlantısından tünel oluştururken bağlantı noktası numarasını (:443) doğru şekilde Ana Makine satırına yerleştirir bu bilgiyi ara sunucuya gönderebilirsiniz. Önceden, taşıma sayısı yalnızca CONNECT satırında oluştu.
    • Sistem artık kullanıcı aracısı ve proxy yetkilendirmesi göndermemektedir üstbilgilerini tanımlamaya çalışın.

      Sistem artık Search Ads 360'ı ayarlarken proxy'ye bağlantı yer alır. Sistem, bunun yerine bir proxy yetkilendirme üstbilgisi ve bu proxy, web sunucusu tarafından İlk isteğe yanıt olarak HTTP 407.

      Benzer şekilde, sistem artık kullanıcı aracısı başlığını kopyalamaz. isteğe bağlı şekilde, yer alır. Bunun yerine kitaplık, bu sorgu için bir kullanıcı aracısı isteğinde bulunabilirsiniz.

  • send(java.net.DatagramPacket) yöntemi, daha önce yürütülen connect() ise bir SocketException hatası verir yöntemi başarısız oldu.
    • Bir dahili hata. Android 8.0'dan önce, sonraki bir recv() çağrısı, send() çağrısı başarılı olsa bile bir SocketException hatası verdi. Tutarlılık için her iki çağrı da artık SocketException hatası veriyor.
  • InetAddress.isReachable(), ICMP'yi TCP Echo'ya geçmeden önce deniyor protokolü.
    • Bağlantı noktası 7'yi (TCP Echo) engelleyen google.com gibi bazı ana makineler ICMP Yankı protokolünü kabul ederlerse erişilebilir hale gelirler.
    • Gerçekten erişilemeyen ana makineler için bu değişiklik, arama geri dönmeden önce harcanan zamanın oranıdır.

Bluetooth

Android 8.0 (API düzeyi 26), ScanRecord.getBytes() tarafından sağlanan veriler yöntemi alır:

  • getBytes() yöntemi, alınan bayt sayısı. Bu nedenle uygulamalar, veya döndürülen maksimum bayt sayısı. Bunun yerine, elde edilen dizinin uzunluğu.
  • Bluetooth 5 uyumlu cihazlar Maksimum 60 bayttır.
  • Uzak cihaz tarama yanıtı sağlamıyorsa 60 bayttan az iade edilebilir.

Sorunsuz Bağlantı

Android 8.0 (API düzeyi 26), daha kolay seçim yapmak için Kablosuz Ayarlarında çok sayıda iyileştirme yapar. en iyi kullanıcı deneyimini sunan kablosuz ağ. Belirli değişiklikler şunlardır:

  • Kararlılık ve güvenilirlik iyileştirmeleri.
  • Sezgisel olarak daha okunabilir bir kullanıcı arayüzü.
  • Tek ve birleştirilmiş Kablosuz Tercihleri menüsü.
  • Uyumlu cihazlarda yüksek kaliteli kayıtlı bir ağ olduğunda kablosuz bağlantı otomatik olarak etkinleştirilir yakında.

Güvenlik

Android 8.0, güvenlikle ilgili aşağıdaki özellikleri içerir değişiklikler:

  • Platform artık SSLv3'ü desteklemiyor.
  • Doğru olmayan bir sunucuyla HTTPS bağlantısı kurarken TLS protokol sürümü iletişimini uygular, HttpsURLConnection artık geçici çözümü denmiyor eski TLS protokolü sürümlerine geri dönüyor ve yeniden deneniyor.
  • Android 8.0 (API düzeyi 26), Güvenli Bilişim (SECCOMP) uygular tüm uygulamaları gösterecek şekilde filtrele. İzin verilen syscall'lar listesi şunlarla sınırlıdır: maruz kalınıyor. Sağlanan birkaç syscall uyumlu değilse bu öğelerin kullanılmamasını öneririz.
  • Uygulamanızın WebView nesnesi artık çoklu işlemde çalışıyor yatırım yapmanız önemlidir. Web içeriği, uygulamanın gelişmiş güvenlik sürecini içeren
  • Artık APK'ların, adları ile biten dizinlerde bulunduğunu varsayamazsınız -1 veya -2'dir. Uygulamalar, sourceDir kazanmak için dizin biçimini kullanabilir, doğrudan dizin biçimine dayanmaz.
  • Yerel reklamlarla ilgili güvenlik geliştirmeleri hakkında bilgi için kitaplıklar için Yerel Kitaplıklar bölümüne bakın.

Ayrıca Android 8.0 (API düzeyi 26) sürümünde, uygulama yüklemeyle ilgili olarak aşağıdaki değişiklikler yapılmıştır. bilinmeyen kaynaklardan bilinmeyen uygulamalar:

Bilinmeyen uygulamaları yüklemeyle ilgili ek ayrıntılar için şuraya bakın: Bilinmeyen Uygulama İzinleri Yükleme rehberini inceleyin.

Uygulamanızı daha güvenli hale getirmeyle ilgili ek yönergeler için Android Geliştiricileri için Güvenlik.

Gizlilik

Android 8.0 (API düzeyi 26), aşağıdaki işlemleri gizlilikle ilgilidir bazı değişiklikler var.

  • Platform artık tanımlayıcıları farklı şekilde işliyor.
    • Bir OTA sürümünden önce yüklenen uygulamalar için Android 8.0 (API düzeyi 26) (API düzeyi 26), ANDROID_ID aynı kaldı kaldırılmadığı ve OTA'dan sonra yeniden yüklenmediği anlamına gelir. Değerleri korumak için OTA'dan sonra yüklemeyi kaldırma işlemleri, geliştiriciler Anahtar/Değer Yedeklemesi.
    • Android 8.0 çalıştıran bir cihazda yüklü uygulamalar için ANDROID_ID artık kapsama dahil kullanıcı başına oturum sayısı seçebilirsiniz. The value of ANDROID_ID benzersiz kullanıcı ve cihaz kombinasyonlarını yönetmenizi sağlar. Sonuç olarak, aynı cihazda çalışan farklı imzalama anahtarları olan uygulamalar (aynı kullanıcı için olsa bile) artık aynı Android kimliğini görmez.
    • ANDROID_ID değeri paketin kaldırılması veya yeniden yüklenmesinde değişmeyeceğinden aynı olduğunu (ve uygulama, OTA'dan sürümü) ekleyebilirsiniz.
    • ANDROID_ID değeri bir sistem güncellemesi paket imzalama anahtarının değişmesine neden olsa bile değişmez.
    • Google Play Hizmetleri ve reklam kimliği ile gönderilen cihazlarda kullanmanız gereken Reklam kimliği. Uygulamalardan para kazanmak için basit, standart bir sistem, Reklam kimliği, reklamcılık için kullanılan ve kullanıcı tarafından sıfırlanabilen benzersiz bir kimliktir. Sağlanan .

      Diğer cihaz üreticileri devam edecek ANDROID_ID sağlamak için.

  • net.hostname sistem özelliği sorgulandığında boş değer üretiliyor yardımcı olur.

Yakalanmayan istisnaları günlüğe kaydetme

Uygulama, aşağıdaki özelliklere sahip bir Thread.UncaughtExceptionHandler yüklerse: Thread.UncaughtExceptionHandler öğesine çağrılmaz, sistem bunu yapar Yakalanmamış bir istisna oluştuğunda uygulamayı kapatmaz. Başlangıç tarihi: Android 8.0 (API düzeyi 26) yüklüyse sistem, istisna yığınını durum; eski sürümlerde sisteme istisna yığınını günlüğe kaydetti.

Özel Thread.UncaughtExceptionHandler kullanmanızı öneririz her zaman varsayılan işleyici; bu öneriyi uygulayan uygulamalar Android 8.0'daki değişiklik.

findViewById() imza değişikliği

findViewById() yönteminin tüm örnekleri artık View yerine <T extends View> T döndürüyor. Bu değişiklik aşağıdaki çıkarımları vardır:

  • Bu durum, mevcut kodun artık belirsiz bir dönüş türüne sahip olmasına neden olabilir. örneğin, hem someMethod(View) hem de someMethod(TextView) findViewById().
  • Java 8 kaynak dili kullanılırken bu, Dönüş türü kısıtlanmadığında View (örneğin, assertNotNull(findViewById(...)).someViewMethod()).
  • Nihai olmayan findViewById() yöntemlerinin geçersiz kılınması ( (ör. Activity.findViewById()) geri bildirimde bulunması gerekir. türü güncellendi.

Kişi sağlayıcı kullanım istatistikleri değişikliği

Android'in önceki sürümlerinde, Kişi Sağlayıcı bileşeni geliştiricilerin her kişi için kullanım verilerini almasını sağlar. Bu kullanım verileri Her e-posta adresine ve ilişkili her telefon numarasına ait bilgileri gösterir bir kişiyle iletişim kurma sayısı da dahil olmak üzere ve kişiyle en son ne zaman iletişim kurulduğu. Şunu isteyen uygulamalar: READ_CONTACTS. izni bu verileri okuyabilir.

Uygulamalar, isterlerse bu verileri okumaya devam edebilir READ_CONTACTS. izni gerekir. Android 8.0 (API düzeyi 26) ve sonraki sürümlerde kullanım verilerinin döndürülmesiyle ilgili sorgular kesin değerler değil, yaklaşımları kullanmak isteyebilirsiniz. Android sistemi, tam değerleri dahili olarak yansıtmadığından, bu değişiklik otomatik tamamlama API'si ile uyumludur.

Bu davranış değişikliği aşağıdaki sorgu parametrelerini etkiler:

Toplama işlemleri

AbstractCollection.removeAll(). ve AbstractCollection.retainAll() şimdi her zaman NullPointerException at; daha önce Koleksiyon şu durumdayken NullPointerException atılmadı: boştur. Bu değişiklik, davranışın belgelerle tutarlı olmasını sağlar.

Android Enterprise

Android 8.0 (API düzeyi 26) kurumsal uygulamalara ilişkin bazı API ve özelliklerin (cihaz dahil) davranışı politika denetleyicileri (DPC) olarak bilinir. Değişiklikler şunlardır:

  • Uygulamaların tümüyle yönetilen cihazlarda iş profillerini desteklemesine yardımcı olacak yeni davranışlar.
  • Sistem güncellemesini işleme, uygulama doğrulama ve cihaz ve sistem bütünlüğünü artırır.
  • Kullanıcı deneyiminde temel hazırlık, bildirimler, Son kullanılanlar ekranı ve her zaman açık VPN.

Android 8.0 (API düzeyi 26) sürümündeki tüm kurumsal değişiklikleri görmek ve bunların nasıl olabileceğini öğrenmek nasıl etkilediğini görmek için Enterprise'da Android.

Android 8.0'ı hedefleyen uygulamalar

Bu davranış değişiklikleri yalnızca şu hedeflemeyi hedefleyen uygulamalar için geçerlidir: Android 8.0 (API düzeyi 26) veya sonraki sürümler. Android 8.0, 2022 veya daha fazlasında ya da targetSdkVersion uygulamasını Android 8.0 veya sonraki bir sürüme ayarlamak için değişiklik yapmanız gerekir ve kendi uygulamalarını bu davranışları doğru şekilde desteklemesi için kullanabilirsiniz.

Uyarı aralıkları

SYSTEM_ALERT_WINDOW telefon numarasını kullanan uygulamalar izin, uyarı pencerelerini görüntülemek için artık aşağıdaki pencere türlerini kullanamaz diğer uygulamaların ve sistem pencerelerinin üzerinde:

Bunun yerine, uygulamalar için TYPE_APPLICATION_OVERLAY

TYPE_APPLICATION_OVERLAY pencere uygulamanızda uyarı pencereleri görüntülemek için yazın, aşağıdaki özellikleri koruyun göz önünde bulundurmanız gerekir:

  • Uygulamaların uyarı pencereleri her zaman kritik sistem pencerelerinin altında görünür: görebilirsiniz.
  • Sistem, TYPE_APPLICATION_OVERLAY. pencere türünü kullanarak ekran gösterimini iyileştirebilirsiniz.
  • Bildirim gölgesini açarak, kullanıcılar bir uyarı pencerelerini görüntülemesini engellemenize olanak tanır. TYPE_APPLICATION_OVERLAY. pencere türü.

İçerik değişikliği bildirimleri

Android 8.0 (API düzeyi 26) yeni sürümde ContentResolver.notifyChange(). ve registerContentObserver(Uri, boolean, ContentObserver) Android 8.0'ı hedefleyen uygulamalar için davranır.

Bu API'ler için artık geçerli bir ContentProvider tanımıdır. İlgili izinlere sahip geçerli bir ContentProvider tanımlamak, uygulamanızı kötü amaçlı uygulamalardan gelen içerik değişikliklerine karşı korumaya ve gizli olabilecek verilerin kötü amaçlı uygulamalara sızdırılmasını engeller.

Odağı göster

Tıklanabilir View nesneleri artık şunlara da odaklanabiliyor: varsayılandır. Bir View nesnesinin tıklanabilir olmasını istiyor ancak tıklanabilir olmasını istemiyorsanız odaklanılabilir, Düzende false öğesine android:focusable özelliği eklendi View içeren XML dosyası veya false içinde iletin uygulamanızın kullanıcı arayüzünde setFocusable() adresine mantığıyla başlayalım.

Tarayıcı algılamada kullanıcı aracısı eşleştirme

Android 8.0 (API düzeyi 26) ve sonraki sürümler derleme tanımlayıcı dizesi OPR. Bazı kalıp eşleşmeleri tarayıcı algılama mantığının Opera dışındaki bir tarayıcıyı yanlışlıkla Opera olarak tanımlamasına neden olur. Bu tür bir kalıp eşleşmesine ilişkin örnek aşağıdaki gibi olabilir:

if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}

Bu tür bir yanlış tanımlamadan kaynaklanan sorunları önlemek için OPR öğesini Opera tarayıcısı için kalıp eşleşmesi olarak kullanın.

Güvenlik

Aşağıdaki değişiklikler Android 8.0'da (API düzeyi 26) güvenliği etkiler:

  • Uygulamanızın ağ güvenliği yapılandırması optimizasyon desteğinin dışında, uygulamanızın WebView nesneleri, HTTP üzerinden web sitelerine erişemez. Her biri WebView nesnesi bunun yerine HTTPS kullanmalıdır.
  • Bilinmeyen kaynaklara izin ver sistem ayarı kaldırıldı; kendi Bilinmeyen uygulamaları yükleme izni bilinmeyen uygulama yüklemelerini yönetir bilinmeyen kaynaklardan gelen aramaları yapıyor. Bu yeni izin hakkında daha fazla bilgi edinmek için Bilinmeyen Uygulama İzinleri Yükleme rehberini inceleyin.

Uygulamanızı daha güvenli hale getirmeyle ilgili ek yönergeler için Android Geliştiricileri için Güvenlik.

Hesaba erişim ve bulunabilirlik

Android 8.0 (API düzeyi 26) sürümünde uygulamalar artık erişemez hesabın sahibi olmadığı sürece, kimlik doğrulayıcısı kullanıcı bu erişimi verdiğinde. İlgili içeriği oluşturmak için kullanılan GET_ACCOUNTS izin artık yeterli değil. Uygulamalara bir hesaba erişim izni verilmesi için: AccountManager.newChooseAccountIntent() kullanın veya kimlik doğrulayıcıya özgü yöntemidir. Hesaplara erişim elde ettikten sonra bir uygulama sizi arayabilir AccountManager.getAccounts(). erişebilir.

Android 8.0 kullanımdan kaldırılıyor LOGIN_ACCOUNTS_CHANGED_ACTION Uygulamalar bunun yerine addOnAccountsUpdatedListener(). almak için Google Analytics 4'te tarama yapar.

Hesap erişimi için eklenen yeni API'ler ve yöntemler hakkında bulunabilirlik için Hesap Erişimi ve Keşfedilebilirlik konularını ele alacağız.

Gizlilik

Aşağıdaki değişiklikler Android 8.0'da (API düzeyi 26) gizliliği etkiler.

  • net.dns1, net.dns2, net.dns3 ve net.dns4 artık değil da platformdaki gizliliği iyileştiren bir değişiklik yapıyoruz.
  • DNS sunucuları gibi ağ bilgilerini almak için ACCESS_NETWORK_STATE bir NetworkRequest veya NetworkCallback nesne. Bu sınıflar, Android 5.0 (API düzeyi 21) ve sonraki sürümlerde kullanılabilir.
  • Build.SERIAL desteği sonlandırıldı. Donanım seri numarasını bilmesi gereken uygulamalar bunun yerine yeni Build.getSerial() yöntemini kullanın. için READ_PHONE_STATE izni gerekir.
  • LauncherApps API artık iş profiline izin vermiyor birincil profil hakkında bilgi almak için uygulamalar. Kullanıcı bir işteyken LauncherApps API, hiç uygulama yokmuş gibi davranır aynı profil grubundaki başka profillere yüklenmiş olmalıdır. Daha önce olduğu gibi alakasız profillere erişmeye teşebbüs etmesi SecurityExceptions neden olur.

İzinler

Bir uygulama, Android 8.0'dan (API düzeyi 26) önce izin istediyse ve izin verilmişse sistem de hatalı bir şekilde uygulamaya, aynı kullanıcıya ait diğer izinleri de verdi ve manifest'te kayıtlı olan URL'leri içerir.

Android 8.0'ı hedefleyen uygulamalar için bu davranış düzeltildi. Uygulamaya yalnızca açıkça sahip olduğu izinler verilir istendi. Ancak kullanıcı uygulamaya izin verdiğinde söz konusu izin grubundaki izin istekleri için otomatik olarak verilir.

Örneğin, bir uygulamada hem READ_EXTERNAL_STORAGE hem de Manifest dosyasında WRITE_EXTERNAL_STORAGE. Uygulama READ_EXTERNAL_STORAGE ve kullanıcı izin verdiğinde. Uygulama, API düzeyi 25 veya altını hedefliyorsa sistem ayrıca aynı anda WRITE_EXTERNAL_STORAGE verir çünkü aynı STORAGE izin grubuna aittir ve aynı zamanda kayıtlı olması gerekir. Uygulama Android 8.0'ı (API düzeyi 26) hedefliyorsa, sistem o sırada yalnızca READ_EXTERNAL_STORAGE; Ancak, uygulama daha sonra WRITE_EXTERNAL_STORAGE isteğinde bulunursa sistem hemen bu ayrıcalığı kullanıcıya sormadan verir.

Medya

  • Çerçeve, performansı otomatik sesi kısma gerekir. Bu durumda, başka bir uygulama AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, uygulama daha az ilgi odağı oluşturmak için onAudioFocusChange() geri arama alır ve ses odağı kaybolacak. Aşağıdakiler için bu davranışı geçersiz kılacak yeni API'ler mevcut: duraklama yerine duraklatılması gereken uygulamaları içerir.
  • Kullanıcı telefon araması yaptığında etkin medya akışlarının sesi şu süre boyunca kapatılır: çağrısına bir tıklama URL'si eklemeniz gerekir.
  • Sesle ilgili tüm API'ler AudioAttributes kullanmalıdır. yerine ses yayını türlerini tanımlayın. Ses yayını türlerini yalnızca ses seviyesi kontrolleri için kullanmaya devam edin. Akış türlerinin diğer kullanımları çalışmaya devam eder (örneğin, desteği sonlandırılan streamType bağımsız değişkeni AudioTrack oluşturucu), ancak sistem bunu hata olarak kaydeder.
  • AudioTrack kullanırken, uygulama yeterince büyük bir ses arabelleği isterse çerçeve, varsa derin arabellek çıkışını kullanmaya çalışır.
  • Android 8.0 (API düzeyi 26) sürümünde medya düğmesi etkinliklerinin işlenmesi farklıdır:
    1. Medya düğmelerinin işlenmesi kullanıcı arayüzü etkinliğinde değişiklik olmadı: Ön plan etkinliklerinin işlenmesinde öncelikli olmaya devam eder medya düğmesi etkinlikleri.
    2. Ön plan etkinliği medya düğmesi etkinliğini işlemezse sistem etkinliği yönlendirir yerel olarak ses çalan en son Etkin durum, bayraklar ve oynatma hangi uygulamanın medya aldığı belirlenirken medya oturumunun durumu dikkate alınmaz düğme etkinlikleri.
    3. Uygulamanın medya oturumu yayınlandıysa sistem, medya düğmesi etkinliğini uygulamanın Varsa MediaButtonReceiver.
    4. Diğer her durumda sistem, medya düğmesi etkinliğini siler.

Yerel kitaplık

Android 8.0 (API düzeyi 26) sürümünü hedefleyen uygulamalarda, yerel kitaplıklar hayır hem yazılabilir hem de çalıştırılabilir olan herhangi bir yük segmenti yürütülebilir. Aşağıdaki özelliklere sahip olan bazı uygulamalar bu değişiklik nedeniyle çalışmayı durdurabilir: yerel kitaplıklar yanlış yükleme segmentlerine sahip olabilir. Bu, bir önlemdir.

Daha fazla bilgi için bkz. Yazılabilir ve Yürütülebilir Segmentler.

Bağlayıcı değişiklikleri, uygulamanın hedeflediği API düzeyine bağlanır. Varsa bağlayıcı değişikliğinden uygulama kitaplığı yükleyemez. Hedeflenen bağlayıcı değişikliğinin gerçekleştiği API düzeyinden daha düşük bir API düzeyi, logcat bir uyarı gösteriyor.

Toplama işlemleri

Android 8.0 (API düzeyi 26) sürümünde, Collections.sort() şurada uygulandı: en üstte List.sort(). Ters (API düzeyleri 24 ve 25) Android 7.x sürümünde (API düzeyleri 24 ve 25) doğrudur): Varsayılan List.sort() uygulaması adı Collections.sort().

Bu değişiklik sayesinde Collections.sort() optimize edilmiş List.sort() özelliklerinden yararlanabilirsiniz. ancak aşağıdaki kısıtlamalara sahiptir:

  • List.sort() uygulamaları Collections.sort(), çünkü bunu yapmak yığın taşmasına sonsuz yinelemeden kaynaklanmaktadır. Bunun yerine, List uygulamanızda bunu geçersiz kılmaktan kaçınmalısınız sort().

    Bir ebeveyn sınıfı sort() özelliğini uygunsuz bir şekilde uygularsa genellikle List.sort() geçersiz kılınabilir temel alınan bir uygulamayla List.toArray(), Arrays.sort() ve ListIterator.set(). Örnek:

    @Override
    public void sort(Comparator<? super E> c) {
      Object[] elements = toArray();
      Arrays.sort(elements, c);
      ListIterator<E> iterator = (ListIterator<Object>) listIterator();
      for (Object element : elements) {
        iterator.next();
        iterator.set((E) element);
      }
    }
    

    Çoğu durumda, List.sort(). şununla: farklı bir varsayılan ayara erişen uygulama uygulamaları hakkında bilgi edindik. Örnek:

    @Override
    public void sort(Comparator<? super E> comparator) {
      if (Build.VERSION.SDK_INT <= 25) {
        Collections.sort(this);
      } else {
        super.sort(comparator);
      }
    }
    

    İkincisini yalnızca bir sort() sahibi olmak istediğiniz için yapıyorsanız tüm API düzeylerinde kullanılabilir, benzersiz bir ad verin, geçersiz kılmak yerine sortCompat() gibi sort()

  • Collections.sort() artık şu şekilde sayılıyor: yapısal olarak sort() çağrısı yapan uygulamaları listeleyin. Örneğin, . ArrayList ve bu numarada sort() aranıyor iterasyonun ortasında ConcurrentModificationException atacaktım. düzenleme yapıldığını List.sort() numaralı telefonu arayarak. Collections.sort(). , istisna yapmadı.

    Bu değişiklik, platform davranışını daha tutarlı hale getirir: yaklaşımı artık ConcurrentModificationException ile sonuçlanıyor.

Sınıf yükleme davranışı

Android 8.0 (API düzeyi 26), sınıf yükleyicilerin yeni sınıfları yüklerken çalışma zamanı varsayımlarını ortadan kaldırabilirsiniz. Bu kontroller sınıfa Java'dan ( forName()), Dalvik bayt kodu veya JNI. Platform, Java'dan loadClass() yöntemini de kontrol etmez emin olmanız gerekir. Bu davranış, sağlıklı kelimelerin çalışmasını etkilememelidir. sınıf yükleyiciler.

Platform, sınıf yükleyicisinin döndürdüğü sınıfın tanımlayıcısını kontrol eder beklenen tanımlayıcıyla eşleşir. Döndürülen tanımlayıcı eşleşmezse platform bir NoClassDefFoundError hatası verir ve ise tutarsızlığı belirten ayrıntılı bir mesaj yer alır.

Platform, istenen sınıfların tanımlayıcılarının da geçerli olup olmadığını kontrol eder. Bu check, GetFieldID() gibi sınıfları dolaylı olarak yükleyen JNI çağrılarını yakalar, bu sınıflara geçersiz tanımlayıcılar geçirmeye karar verir. Örneğin, imzalı bir alan Bu imza geçersiz olduğundan java/lang/String bulunamadı; Ljava/lang/String; olmalı.

Bu, FindClass() ile yapılan bir JNI çağrısından farklıdır Bu örnekte java/lang/String, geçerli ve tam bir addır.

Android 8.0 (API düzeyi 26), birden fazla sınıf yükleyicinin sınıf tanımlamaya çalışmasını desteklemez aynı DexFile nesnesini kullanır. Bunu yapmaya çalışmak, Android çalışma zamanının InternalError. "<filename> dex dosyasını kaydetmeye çalışılıyor birden fazla sınıf yükleyici ile".

DexFile API desteği sonlandırılmıştır ve platform sınıf yükleyicilerinden biri, PathClassLoader veya Bunun yerine BaseDexClassLoader.

Not: dosya sistemindeki aynı APK veya JAR dosya kapsayıcısını içermelidir. Bu yöntem normal bir şekilde ek bellek yüküne neden olur: Kapsayıcıdaki DEX dosyaları sıkıştırıldığında, platform şunun yerine bunlar üzerinde bir mmap işlemi gerçekleştirebilir: ayıklayabilir. Ancak platformun, DEX dosyasını kapsayıcıdan çıkarması gerekiyorsa bir DEX dosyasına bu şekilde referans olması çok fazla bellek kullanabilir.

Android'de tüm sınıf yükleyiciler paralel yetenekli olarak kabul edilir. Birden fazla iş parçacığı aynı sınıfla aynı sınıfı yüklemek için yarıştığında işlemi tamamlayan ilk iş parçacığı kazanır ve sonuç, ileti dizileri. Bu davranış, sınıf yükleyicisinin aynı sınıfı döndürdü, farklı bir sınıf döndürdü veya bir istisnaya neden oldu. Platform bu tür istisnaları sessizce yoksayar.

Dikkat: Platformun sürümlerinde daha düşük bir sürüm olduğundan bu varsayımların yıkılması, sınıf karışıklığı nedeniyle yığın bozulması, ve diğer istenmeyen etkilerden bahsedeceğiz.