Android 6.0 Değişiklikleri

Android 6.0 (API seviyesi 23), yeni özellikler ve becerilerin yanı sıra çeşitli sistem değişiklikleri ve API davranışı değişiklikleri içerir. Bu dokümanda, uygulamalarınızda anlamanız ve hesaba katmanız gereken bazı önemli değişiklikler vurgulanmaktadır.

Daha önce Android için uygulama yayınladıysanız, platformdaki bu değişikliklerin uygulamanızı etkileyeceğini unutmayın.

Çalışma Zamanı İzinleri

Bu sürümde, kullanıcıların çalışma zamanında uygulama izinlerini doğrudan yönetebildikleri yeni bir izin modeli kullanıma sunuluyor. Bu model, uygulama geliştiricileri için yükleme ve otomatik güncelleme işlemlerini kolaylaştırırken kullanıcılara izinler üzerinde daha fazla görünürlük ve kontrol sağlar. Kullanıcılar yüklü uygulamalar için ayrı ayrı izin verebilir veya izinleri iptal edebilir.

Android 6.0 (API düzeyi 23) veya sonraki sürümleri hedefleyen uygulamalarınızda, çalışma zamanında izinleri kontrol edip istekte bulunduğunuzdan emin olun. Uygulamanıza izin verilip verilmediğini öğrenmek için yeni checkSelfPermission() yöntemini çağırın. İzin istemek için yeni requestPermissions() yöntemini çağırın. Uygulamanız Android 6.0'ı (API düzeyi 23) hedeflemiyor olsa bile uygulamanızı yeni izin modeliyle test etmeniz gerekir.

Uygulamanızda yeni izin modelini desteklemeyle ilgili ayrıntılar için Sistem İzinleriyle Çalışma bölümüne bakın. Uygulamanız üzerindeki etkinin nasıl değerlendirileceğiyle ilgili ipuçları için İzin Kullanım Notları'na bakın.

Doz ve Uygulamayı Beklemeye Alma

Bu sürümde, boşta olan cihazlar ve uygulamalar için yeni güç tasarrufu optimizasyonları sunulmaktadır. Bu özellikler tüm uygulamaları etkilediğinden, uygulamalarınızı bu yeni modlarda test etmeyi unutmayın.

  • Doz: Kullanıcı cihazın fişini çekip ekranı kapalıyken sabit bir süre bırakırsa cihaz belirli bir süre Doz moduna geçer ve burada sistemi uyku durumunda tutmaya çalışır. Bu modda cihazlar kısa süreliğine düzenli olarak normal şekilde çalışmaya devam eder. Böylece uygulama senkronizasyonu gerçekleştirilebilir ve sistem bekleyen işlemleri gerçekleştirebilir.
  • Uygulamayı Beklemeye Alma: Uygulamayı Beklemeye Alma özelliği, kullanıcı etkin olarak kullanmadığında uygulamanın boşta olup olmadığını belirlemesine olanak tanır. Bu tespiti, kullanıcı belirli bir süre boyunca uygulamaya dokunmadığında sistem yapar. Cihaz fişe takılı değilse sistem, ağ erişimini devre dışı bırakır ve boşta olarak gördüğü uygulamaların senkronizasyonlarını ve işlerini askıya alır.

Güç tasarrufu sağlayan bu değişiklikler hakkında daha fazla bilgi edinmek için Doz ve Uygulamayı Beklemeye Alma özelliklerini optimize etme sayfasına bakın.

Apache HTTP İstemcisini Kaldırma

Android 6.0 sürümü, Apache HTTP istemcisi desteğini kaldırmıştır. Uygulamanız bu istemciyi kullanıyorsa ve Android 2.3 (API düzeyi 9) veya sonraki sürümleri hedefliyorsa bunun yerine HttpURLConnection sınıfını kullanın. Bu API, şeffaf sıkıştırma ve yanıt önbelleğe alma yoluyla ağ kullanımını azalttığı ve güç tüketimini en aza indirdiği için daha verimlidir. Apache HTTP API'lerini kullanmaya devam etmek için önce build.gradle dosyanızda aşağıdaki derleme süresi bağımlılığını tanımlamanız gerekir:

android {
    useLibrary 'org.apache.http.legacy'
}

BoringSSL

Android, OpenSSL'den BoringSSL kitaplığına taşınıyor. Uygulamanızda Android NDK'yı kullanıyorsanız libcrypto.so ve libssl.so gibi NDK API'sinin parçası olmayan şifreleme kitaplıklarına bağlantı vermeyin. Bu kitaplıklar, herkese açık API'ler değildir ve farklı sürümlerde ve cihazlarda haber verilmeksizin değiştirilebilir veya bozulabilir. Ayrıca, güvenlik açıklarına maruz kalabilirsiniz. Bunun yerine, yerel kodunuzu JNI aracılığıyla Java kriptografi API'lerini çağıracak veya seçtiğiniz bir şifreleme kitaplığına statik olarak bağlantı verecek şekilde değiştirin.

Donanım Tanımlayıcıya Erişim

Android, kullanıcılara daha fazla veri koruması sağlamak amacıyla bu sürümden itibaren kablosuz bağlantı ve Bluetooth API'lerini kullanan uygulamalar için cihazın yerel donanım tanımlayıcısına programatik erişimi kaldırıyor. WifiInfo.getMacAddress() ve BluetoothAdapter.getAddress() yöntemleri artık 02:00:00:00:00:00 değerinde sabit bir değer döndürüyor.

Bluetooth ve kablosuz ağ taramaları aracılığıyla yakındaki harici cihazların donanım tanımlayıcılarına erişmek için uygulamanızın artık ACCESS_FINE_LOCATION veya ACCESS_COARSE_LOCATION izinlerine sahip olması gerekir:

Not: Android 6.0 (API düzeyi 23) çalıştıran bir cihaz arka planda kablosuz ağ veya Bluetooth taraması başlattığında, işlem harici cihazlar tarafından rastgele bir MAC adresinden kaynaklanmış olarak görülebilir.

Bildirimler

Bu sürüm, Notification.setLatestEventInfo() yöntemini kaldırır. Bildirimler oluşturmak için bunun yerine Notification.Builder sınıfını kullanın. Bir bildirimi tekrar tekrar güncellemek için Notification.Builder örneğini yeniden kullanın. Güncellenmiş Notification örneklerini almak için build() yöntemini çağırın.

adb shell dumpsys notification komutu artık bildirim metninizi yazdırmaz. Bir bildirim nesnesindeki metni yazdırmak için adb shell dumpsys notification --noredact komutunu kullanın.

AudioManager Değişiklikleri

AudioManager sınıfı aracılığıyla ses düzeyini doğrudan ayarlama veya belirli akışları yoksayma artık desteklenmemektedir. setStreamSolo() yöntemi kullanımdan kaldırıldığı için bunun yerine requestAudioFocus() yöntemini çağırmalısınız. Benzer şekilde, setStreamMute() yöntemi de kullanımdan kaldırılmıştır. Bunun yerine, adjustStreamVolume() yöntemini çağırın ve ADJUST_MUTE veya ADJUST_UNMUTE yön değerine iletin.

Metin Seçimi

Kayan bir araç çubuğundaki yeni metin seçimi özelliklerini gösteren ekran

Kullanıcılar uygulamanızda metin seçtiğinde, artık Kes, Kopyala ve Yapıştır gibi metin seçimi işlemlerini bir kayan araç çubuğunda gösterebilirsiniz. Kullanıcı etkileşimi uygulaması, Bağımsız görünümler için bağlamsal işlem modunu etkinleştirme bölümünde açıklandığı gibi, bağlamsal işlem çubuğunun uygulanmasına benzerdir.

Metin seçimi için kayan araç çubuğu uygulamak üzere mevcut uygulamalarınızda aşağıdaki değişiklikleri yapın:

  1. View veya Activity nesnenizde startActionMode(Callback) olan ActionMode çağrılarınızı startActionMode(Callback, ActionMode.TYPE_FLOATING) olarak değiştirin.
  2. Bunun yerine, mevcut ActionMode.Callback uygulamanızı alıp ActionMode.Callback2 kapsamını genişletin.
  3. Görünümde içerik Rect nesnesinin koordinatlarını (metin seçimi dikdörtgeni gibi) sağlamak için onGetContentRect() yöntemini geçersiz kılın.
  4. Dikdörtgen konumlandırması artık geçerli değilse ve geçersiz kılınacak tek öğe buysa invalidateContentRect() yöntemini çağırın.

Android Support Library düzeltmesinin 22.2 sürümünü kullanıyorsanız, kayan araç çubuklarının geriye dönük uyumlu olmadığını ve appcompat öğesinin varsayılan olarak ActionMode nesnelerini kontrol ettiğini unutmayın. Bu, kayan araç çubuklarının görüntülenmesini engeller. AppCompatActivity öğesinde ActionMode desteğini etkinleştirmek için getDelegate() yöntemini, ardından döndürülen AppCompatDelegate nesnesinde setHandleNativeActionModesEnabled() çağrısı yaparak giriş parametresini false olarak ayarlayın. Bu çağrı, ActionMode nesnelerinin denetimini çerçeveye döndürür. Çerçevenin ActionBar veya kayan araç çubuğu modlarını desteklemesine olanak tanıyan Android 6.0 (API düzeyi 23) sürümünü çalıştıran cihazlarda, Android 5.1 (API düzeyi 22) veya önceki sürümleri çalıştıran cihazlarda ise yalnızca ActionBar modları desteklenir.

Tarayıcı Yer İşareti Değişiklikleri

Bu sürüm genel yer işaretleri desteğini kaldırır. android.provider.Browser.getAllBookmarks() ve android.provider.Browser.saveBookmark() yöntemleri kaldırılmıştır. Benzer şekilde READ_HISTORY_BOOKMARKS ve WRITE_HISTORY_BOOKMARKS izinleri de kaldırılır. Uygulamanız Android 6.0 (API düzeyi 23) veya sonraki bir sürümü hedefliyorsa global sağlayıcıdaki yer işaretlerine erişmeyin veya yer işareti izinlerini kullanmayın. Bunun yerine, uygulamanız yer işareti verilerini dahili olarak depolamalıdır.

Android Anahtar Deposu Değişiklikleri

Bu sürümle birlikte, Android Anahtar Deposu sağlayıcısı artık Dinamik Arama Ağı Reklamlarını desteklememektedir. ECDSA desteklenmektedir.

Aktif olmayan şifreleme gerektirmeyen anahtarlar, güvenli kilit ekranı devre dışı bırakıldığında veya sıfırlandığında (ör. kullanıcı veya cihaz yöneticisi tarafından) artık silinmez. Kullanımda olmayan verilerin şifrelenmesi gereken anahtarlar bu etkinlikler sırasında silinir.

Kablosuz Ağ ve Ağ İletişimi Değişiklikleri

Bu sürümde, kablosuz ağ ve ağ iletişimi API'lerinde aşağıdaki davranış değişiklikleri tanıtılmaktadır.

  • Uygulamalarınız artık WifiConfiguration nesnelerinin durumunu yalnızca bu nesneleri siz oluşturduysanız değiştirebilir. Kullanıcı veya diğer uygulamalar tarafından oluşturulan WifiConfiguration nesnelerini değiştirmenize veya silmenize izin verilmez.
  • Daha önce, bir uygulama disableAllOthers=true ayarıyla enableNetwork() özelliğini kullanarak cihazı belirli bir kablosuz ağa bağlanmaya zorlarsa cihazın hücresel veri gibi diğer ağlarla bağlantısı kesilirdi. Bu sürümde, cihazın diğer ağlarla olan bağlantısı artık kesilmez. Uygulamanızın targetSdkVersion değeri “20” veya daha düşükse seçili kablosuz ağa sabitlenir. Uygulamanızın targetSdkVersion değeri “21” veya daha yüksekse ağ trafiğinin seçilen ağda gönderildiğinden emin olmak için çoklu ağ API'lerini (openConnection(), bindSocket() ve yeni bindProcessToNetwork() yöntemi gibi) kullanın.

Kamera Hizmeti Değişiklikleri

Bu sürümde, kamera hizmetindeki paylaşılan kaynaklara erişim modeli, önceki "ilk gelen alır" erişim modelinden, yüksek öncelikli işlemlerin tercih edildiği bir erişim modeline dönüştürüldü. Hizmet davranışında yapılan değişiklikler şunlardır:

  • Kamera cihazı açma ve yapılandırma da dahil olmak üzere kamera alt sistemi kaynaklarına erişim izni, istemci uygulama işleminin "önceliğine" göre verilir. Kullanıcı tarafından görülebilen veya ön plan etkinlikleri olan uygulama süreçlerine genellikle daha yüksek öncelik verilir. Bu da kamera kaynağı edinme ve kullanımını daha güvenilir hale getirir.
  • Daha yüksek öncelikli bir uygulama kamerayı kullanmaya çalıştığında, daha düşük öncelikli uygulamalar için etkin kamera istemcileri "çıkarılabilir". Kullanımdan kaldırılan Camera API'de bu durum, çıkarılan istemci için onError() çağrısına yol açar. Camera2 API'de onDisconnected(), çıkarılan istemci için çağrılıyor.
  • Uygun kamera donanımına sahip cihazlarda, ayrı uygulama işlemleri ayrı kamera cihazlarını aynı anda bağımsız olarak açıp kullanabilir. Ancak aynı anda erişimin açık kamera cihazlarından herhangi birinin performansında veya becerilerinde önemli düşüşlere neden olduğu çok işlemli kullanım alanları artık kamera hizmeti tarafından tespit edilir ve bunlara izin verilmez. Bu değişiklik, aynı kamera cihazına doğrudan erişmeye çalışan başka bir uygulama olmasa bile daha düşük öncelikli istemcilerde "çıkarılmasına" neden olabilir.
  • Mevcut kullanıcının değiştirilmesi, önceki kullanıcı hesabına ait uygulamalardaki etkin kamera istemcilerinin çıkarılmasına neden olur. Kameraya erişim, geçerli cihaz kullanıcısına ait kullanıcı profilleriyle sınırlıdır. Pratikte bu, örneğin bir "Misafir" hesabının, kullanıcı farklı bir hesaba geçiş yaptığında kamera alt sistemini kullanan işlemlerden ayrılamayacağı anlamına gelir.

Süre

ART çalışma zamanı artık newInstance() yöntemi için erişim kurallarını doğru şekilde uyguluyor. Bu değişiklik, Dalvik'in önceki sürümlerde erişim kurallarını yanlış kontrol ettiği bir sorunu düzeltmektedir. Uygulamanız newInstance() yöntemini kullanıyorsa ve erişim kontrollerini geçersiz kılmak istiyorsanız giriş parametresi true olarak ayarlanmış şekilde setAccessible() yöntemini çağırın. Uygulamanız v7 appcompat kitaplığını veya v7 geri dönüşüm kitaplığını kullanıyorsa bu kitaplıkların en yeni sürümlerini kullanacak şekilde uygulamanızı güncellemeniz gerekir. Aksi takdirde, XML'den başvurulan tüm özel sınıfların, sınıf kurucularının erişilebilir olacak şekilde güncellendiğinden emin olun.

Bu sürüm, dinamik bağlayıcının davranışını günceller. Dinamik bağlayıcı artık bir kitaplığın soname ve yolu arasındaki farkı ( genel hata 6670) anlıyor ve soname ile arama uygulanmaya başladı. Bozuk DT_NEEDED girişleri (genellikle derleme makinesinin dosya sistemindeki mutlak yollar) içeren daha önce çalışan uygulamalar yüklendiğinde başarısız olabilir.

dlopen(3) RTLD_LOCAL işareti artık doğru şekilde uygulanmış. Varsayılan değer RTLD_LOCAL olduğundan, açıkça RTLD_LOCAL kullanmayan dlopen(3) çağrıları etkilenecektir (uygulamanız açık bir şekilde RTLD_GLOBAL kullanmadığı sürece). RTLD_LOCAL ile birlikte, daha sonra dlopen(3) çağrılarıyla yüklenen kitaplıklarda (DT_NEEDED girişlerine referans vermek yerine) semboller kullanıma sunulmaz.

Android'in önceki sürümlerinde, uygulamanız sistemden metin konumlarını içeren bir paylaşılan kitaplığı yüklemesini istediyse sistem bir uyarı gösteriyordu ancak yine de kitaplığın yüklenmesine izin veriyordu. Uygulamanızın hedef SDK sürümü 23 veya üzeriyse bu sürümden itibaren sistem bu kitaplığı reddeder. Bir kitaplığın yüklenemediğini tespit etmenize yardımcı olmak için uygulamanız, dlopen(3) hatasını günlüğe kaydetmeli ve dlerror(3) çağrısının döndürdüğü sorun açıklaması metnini içermelidir. Metin taşıma işlemlerini ele alma hakkında daha fazla bilgi edinmek için bu kılavuza bakın.

APK Doğrulaması

Platformda artık APK'lar daha sıkı bir şekilde doğrulanıyor. Bir dosya, manifest dosyasında tanımlanmışsa ancak APK'nın kendisinde bulunmuyorsa APK bozuk olarak kabul edilir. İçeriklerden herhangi biri kaldırılırsa APK yeniden imzalanmalıdır.

USB Bağlantısı

USB bağlantı noktasından yapılan cihaz bağlantıları artık varsayılan olarak yalnızca şarj moduna ayarlıdır. Cihaza ve içeriğine USB bağlantısı üzerinden erişmek için kullanıcılar bu tür etkileşimlere açıkça izin vermelidir. Uygulamanız, USB bağlantı noktası üzerinden cihazla kullanıcı etkileşimlerini destekliyorsa etkileşimin açıkça etkinleştirilmesi gerektiğini unutmayın.

Android for Work Değişiklikleri

Bu sürüm, Android for Work için aşağıdaki davranış değişikliklerini içermektedir:

  • Kişisel bağlamda iş iletişim bilgileri. Google Çevirici Arama Kaydı'nda artık kullanıcı geçmiş aramaları görüntülediğinde iş kişileri gösteriliyor. setCrossProfileCallerIdDisabled() true olarak ayarlandığında, Google Çevirici Arama Kaydı'ndaki iş profili kişileri gizlenir. İş kişileri, yalnızca setBluetoothContactSharingDisabled() öğesini false olarak ayarlarsanız Bluetooth üzerinden cihazlarda özel kişilerle birlikte görüntülenebilir. Varsayılan olarak true değerine ayarlanmıştır.
  • Kablosuz yapılandırmasının kaldırılması: Bir Profil Sahibi tarafından eklenen kablosuz yapılandırmaları (örneğin, addNetwork() yöntemine yapılan çağrılar) artık o iş profili silinirse kaldırılmaktadır.
  • Kablosuz yapılandırması tam kilitleme: WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN değeri sıfır değilse etkin bir Cihaz Sahibi tarafından oluşturulan herhangi bir kablosuz ağ yapılandırması artık değiştirilemez veya silinemez. Kullanıcı yine de kendi kablosuz ağ yapılandırmalarını oluşturabilir ve değiştirebilir. Etkin Cihaz Sahipleri, kendileri tarafından oluşturulmayanlar da dahil olmak üzere tüm kablosuz ağ yapılandırmalarını düzenleme veya kaldırma ayrıcalığına sahiptir.
  • Google Hesabı ekleyerek cihaz politikası denetleyiciyi indirme: Cihaz politikası denetleyici (DPC) uygulaması aracılığıyla yönetim gerektiren bir Google hesabı, yönetilen bağlam dışındaki bir cihaza eklendiğinde, hesap ekleme akışı artık kullanıcıdan uygun WPC'yi yüklemesini ister. Bu davranış aynı zamanda Ayarlar > Hesaplar aracılığıyla ve ilk cihaz kurulum sihirbazında eklenen hesaplar için de geçerlidir.
  • Belirli DevicePolicyManager API davranışlarında yapılan değişiklikler:
    • setCameraDisabled() yönteminin çağrılması yalnızca arayan kullanıcı için kamerayı etkiler. Yönetilen profilden çağrılması birincil kullanıcıda çalışan kamera uygulamalarını etkilemez.
    • Ek olarak, setKeyguardDisabledFeatures() yöntemi artık hem Profil Sahipleri hem de Cihaz Sahipleri tarafından kullanılabilir.
    • Profil Sahibi şu tuş koruyucu kısıtlamalarını belirleyebilir:
    • DevicePolicyManager.createAndInitializeUser() ve DevicePolicyManager.createUser() yöntemleri kullanımdan kaldırılmıştır.
    • setScreenCaptureDisabled() yöntemi, artık belirli bir kullanıcının uygulaması ön plandayken destek yapısını da engelliyor.
    • EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM artık varsayılan olarak SHA-256 değerine ayarlıdır. SHA-1, geriye dönük uyumluluk için hâlâ desteklense de gelecekte kaldırılacaktır. EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM artık yalnızca SHA-256'yı kabul ediyor.
    • Android 6.0'da (API düzeyi 23) mevcut olan cihaz başlatıcı API'leri kaldırıldı.
    • EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS kaldırıldığında, fabrika ayarlarına sıfırlanmış bir cihazın NFC dokundurma temel hazırlığı programatik olarak açılamaz.
    • Yönetilen cihazın NFC temel hazırlığı sırasında cihaz sahibinin uygulamasına veri aktarmak için artık EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE extra özelliğini kullanabilirsiniz.
    • Android for Work API'leri; İş profilleri, destek katmanı ve benzeri M çalışma zamanı izinleri için optimize edilmiştir. Yeni DevicePolicyManager izin API'leri, M öncesi uygulamaları etkilemez.
    • Kullanıcılar bir ACTION_PROVISION_MANAGED_PROFILE veya ACTION_PROVISION_MANAGED_DEVICE amacı ile başlatılan kurulum akışının eşzamanlı kısmından çıktığında sistem artık RESULT_CANCELED sonuç kodu döndürüyor.
  • Diğer API'lerde yapılan değişiklikler:
    • Veri Kullanımı: android.app.usage.NetworkUsageStats sınıfının adı NetworkStats olarak değiştirildi.
  • Genel ayarlarda yapılan değişiklikler: