Android 6.0 Değişiklikleri

Android 6.0 (API düzeyi 23), yeni özellikler ve özelliklerin 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 bir 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önetebileceği yeni bir izin modeli kullanıma sunuluyor. Bu model, kullanıcılara izinler üzerinde daha fazla görünürlük ve kontrol sunarken uygulama geliştiriciler için yükleme ve otomatik güncelleme süreçlerini basitleştirir. Kullanıcılar yüklü uygulamalar için tek tek 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 izin olup olmadığını kontrol edip gerekli izinleri verdiğinizden emin olun. Uygulamanıza izin verilip verilmediğini belirlemek 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) hedeflemese bile uygulamanızı yeni izin modeliyle test etmelisiniz.

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 etkiyi nasıl değerlendireceğinizle 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ı kullanıma sunulmuştur. Bu özellikler tüm uygulamaları etkilediğinden, uygulamalarınızı bu yeni modlarda test ettiğinizden emin olun.

  • Doz: Kullanıcı, bir cihazın fişini çekip ekranı kapalıyken hareketsiz halde bırakırsa bir süre boyunca Doz moduna geçer ve bu modda 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şir ve sistem bekleyen tüm işlemleri gerçekleştirebilir.
  • Uygulamayı Beklemeye Alma: Uygulama Bekletme, sistemin bir uygulamayı aktif olarak kullanmadığı sırada boşta olup olmadığını belirlemesine olanak tanır. Sistem bu tespiti, kullanıcı belirli bir süre boyunca uygulamaya dokunmadığında yapılır. Cihaz fişe takılı değilse sistem ağ erişimini devre dışı bırakır ve boşta olduğunu düşündüğü uygulamalara ilişkin senkronizasyonları ve işleri 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 bölümüne bakın.

Apache HTTP İstemcisini Kaldırma

Android 6.0 sürümü, Apache HTTP istemcisi desteğini kaldırı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 zamanı bağımlılığını beyan etmeniz gerekir:

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

BoringSSL

Android, OpenSSL'den BoringSSL kitaplığına geçiyor. Uygulamanızda Android NDK'yı kullanıyorsanız NDK API'sinin parçası olmayan libcrypto.so ve libssl.so gibi kriptografik kitaplıklara bağlantı vermeyin. Bu kitaplıklar, herkese açık API'ler değildir ve sürümler ile cihazlar arasında haber verilmeden 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 kriptografi kitaplığına statik olarak bağlantı kuracak ş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ıracaktır. WifiInfo.getMacAddress() ve BluetoothAdapter.getAddress() yöntemleri artık 02:00:00:00:00:00 sabit değerini döndürüyor.

Yakındaki harici cihazların Bluetooth ve kablosuz ağ taramaları üzerinden 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 rastgele bir MAC adresinden geldiğiyle harici cihazlar tarafından 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 bunun yerine adb shell dumpsys notification --noredact komutunu kullanın.

Audio Manager 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ılır. Bunun yerine, adjustStreamVolume() yöntemini çağırın ve yön değerini ADJUST_MUTE veya ADJUST_UNMUTE olarak geçirin.

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örüntüleyebilirsiniz. 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ğuna benzerdir.

Metin seçimi için kayan bir 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çim 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üzeltme 22.2'sini kullanıyorsanız, kayan araç çubuklarının geriye dönük uyumlu olmadığını ve appcompat'ın 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() çağrısı yapın, ardından döndürülen AppCompatDelegate nesnesinde setHandleNativeActionModesEnabled() çağrısı yapın ve 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 ise Android 5.1 (API düzeyi 22) veya önceki sürümleri çalıştıran cihazlarda yalnızca ActionBar modları desteklenir.

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

Bu sürümle birlikte genel yer işaretleri desteği kaldırılmıştır. android.provider.Browser.getAllBookmarks() ve android.provider.Browser.saveBookmark() yöntemleri artık 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 genel sağlayıcının 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. Aktif olmayan şifreleme gerektiren anahtarlar bu etkinlikler sırasında silinir.

Kablosuz Bağlantı 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 kullanıma sunulmuştur.

  • 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() 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 bağlantısı artık kesilmez. Uygulamanızın targetSdkVersion değeri “20” veya daha düşükse seçili kablosuz ağa sabitlenmiştir. 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 (ör. openConnection(), bindSocket() ve yeni bindProcessToNetwork() yöntemi) kullanın.

Kamera Hizmeti Değişiklikleri

Bu sürümde, kamera hizmetinde 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ışındaki değişiklikler şunlardır:

  • Kamera alt sistemi kaynaklarına erişim (kamera cihazı açma ve yapılandırma dahil), istemci uygulama işleminin "önceliğine" göre verilir. Kullanıcı tarafından görülebilen veya ön plan etkinlikleri olan uygulama işlemlerine 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, düşük öncelikli uygulamalar için etkin kamera istemcileri "çıkarılabilir". Kullanımdan kaldırılan Camera API'de bu durum, onError() tarafından çıkarılan istemci için çağrılmasına neden olur. 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ı bağımsız olarak aynı anda 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 algılanıp bunlara izin verilmemektedir. Bu değişiklik, başka bir uygulama aynı kamera cihazına doğrudan erişmeye çalışmasa bile daha düşük öncelikli istemcilerde "çıkarma işlemleri" yapı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. Örneğin, pratikte bu durum, kullanıcı farklı bir hesaba geçiş yaptığında "Misafir" hesabının, kamera alt sistemini kullanan işlemleri çalışır durumda bırakamayacağı anlamına gelir.

Süre

ART çalışma zamanı artık newInstance() yöntemi için erişim kurallarını düzgün bir ş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 görüntüleme kitaplığını kullanıyorsa bu kitaplıkların en yeni sürümlerini kullanmak için 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 öğesi ile yolu ( herkese açık hata 6670) arasındaki farkı anlıyor ve soname ile arama uygulanıyor. Daha önce çalışan ancak bozuk DT_NEEDED girişleri (genellikle derleme makinesinin dosya sistemindeki mutlak yollar) olan uygulamalar yüklendiğinde başarısız olabilir.

dlopen(3) RTLD_LOCAL işareti artık doğru şekilde uygulanmış. Varsayılan RTLD_LOCAL olduğundan, açıkça RTLD_LOCAL kullanmayan dlopen(3) çağrıları bu durumdan etkilenecektir (uygulamanız açık bir şekilde RTLD_GLOBAL kullanmadığı sürece). RTLD_LOCAL ile birlikte semboller, DT_NEEDED girişleriyle başvurulmaz ve daha sonra dlopen(3) çağrılarıyla yüklenen kitaplıklarda kullanılamaz.

Android'in önceki sürümlerinde, uygulamanız sistemden metinlerin yerlerini değiştirerek paylaşılan bir kitaplık yüklemesini isterse sistem bir uyarı gösteriyordu ancak yine de kitaplığın yüklenmesine izin veriyordu. Bu sürümden itibaren, uygulamanızın hedef SDK sürümü 23 veya üstü ise sistem bu kitaplığı reddeder. Bir kitaplığın yüklenip yüklenemeyeceğ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ılavuzu inceleyin.

APK Doğrulama

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ı üzerinden 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ın bu tür etkileşimlere açıkça izin vermesi gerekir. 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çerir:

  • Kişisel bağlamda iş iletişim bilgileri. Google Çevirici Arama Kaydı, kullanıcı geçmiş aramaları görüntülediğinde artık iş kişilerini de gösteriyor. setCrossProfileCallerIdDisabled() true olarak ayarlanırsa Google Çevirici Arama Kaydı'ndaki iş profili kişileri gizlenir. Cihazlarda, iş kişileri özel kişilerle birlikte görüntülenebilir. Bunun için setBluetoothContactSharingDisabled() ayarını false yapmanız gerekir. Varsayılan olarak true şeklinde ayarlanmıştır.
  • Kablosuz ağ yapılandırmasını kaldırma: Bir Profil Sahibi tarafından eklenen kablosuz ağ yapılandırmaları (örneğin, addNetwork() yöntemine yapılan çağrılar aracılığıyla) artık iş profili silindiğinde artık kaldırılmaktadır.
  • Kablosuz yapılandırması tam kilitleme: WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN sıfır dışında bir değerse etkin bir Cihaz Sahibi tarafından oluşturulan herhangi bir kablosuz ağ yapılandırması artık kullanıcı tarafından 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 yapılandırmaları 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ış, Ayarlar > Hesaplar aracılığıyla ve ilk cihaz kurulumu 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. Kameranın 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ı ayarlayabilir:
    • 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 ayarlanıyor. 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ırlanan cihazın NFC dokundurma temel hazırlığı programatik olarak açılamaz.
    • Artık yönetilen cihazın NFC temel hazırlığı sırasında cihaz sahibinin uygulamasına veri iletmek için EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE ekstrasını kullanabilirsiniz.
    • Android for Work API'leri; İş profilleri, destek katmanı ve benzeri M çalışma zamanı izinleri için optimize edilmiştir. Yeni DevicePolicyManager izni API'leri, M öncesi uygulamaları etkilemez.
    • Kullanıcılar bir ACTION_PROVISION_MANAGED_PROFILE veya ACTION_PROVISION_MANAGED_DEVICE amacı aracılığıyla başlatılan kurulum akışının eşzamanlı bölümünden çıktığında sistem artık RESULT_CANCELED sonuç kodu döndürür.
  • 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: