Android 6.0 ve sonraki sürümlerde Android uygulama izinleri modeli, izinleri kullanıcılar için daha anlaşılır, yararlı ve güvenli hale getirmek üzere tasarlanmıştır. Bu model, tehlikeli izinler gerektiren Android uygulamalarını (Etkilenen izinler bölümüne bakın) yükleme zamanı izin modelinden çalışma zamanı izin modeline taşıdı:
- Yükleme sırasındaki izinler
(Android 5.1 ve önceki sürümler) Kullanıcılar, uygulamaları yüklerken veya güncellerken tehlikeli izinler verir. Cihaz üreticileri ve operatörler, kullanıcıyı bilgilendirmeden önceden izin verilmiş izinlere sahip uygulamaları önceden yükleyebilir.
- Çalışma zamanı izinleri
(Android 6.0 ile 9) Kullanıcılar, uygulama çalışırken uygulamaya tehlikeli izinler verir. İzinlerin ne zaman isteneceği (ör. uygulama başlatıldığında veya kullanıcı belirli bir özelliğe eriştiğinde) uygulamaya bağlıdır ancak kullanıcı, uygulamanın belirli izin gruplarına erişmesine izin verir/izin vermez. OEM'ler/operatörler uygulamaları önceden yükleyebilir ancak istisna sürecini tamamlamadıkça izinleri önceden veremez. (İstisna oluşturma başlıklı makaleyi inceleyin.)
(Android 10) Kullanıcılar daha fazla şeffaflık görür ve hangi uygulamaların etkinlik algılama (AR) çalışma zamanı izinlerine sahip olduğu üzerinde kontrol sahibi olur. Kullanıcılardan çalışma zamanı izinleri iletişim kutusunda izinlere her zaman izin vermeleri, kullanım sırasında izin vermeleri veya izinleri reddetmeleri istenir. Android 10'a yükseltme yapıldığında uygulamalara verilen izinler korunur ancak kullanıcılar Ayarlar'a giderek bu izinleri değiştirebilir.
Çalışma zamanında istenen izinler, uygulamaların kullanıcının izni olmadan özel verilere erişmesini engeller ve kullanıcılara, uygulamaların istediği veya kendisine verilen izin türleri hakkında ek bağlam ve görünürlük sağlar. Çalışma zamanı modeli, geliştiricilerin kullanıcıların uygulamaların neden istenen izinlere ihtiyaç duyduğunu anlamalarına yardımcı olmalarını teşvik eder ve kullanıcıların izinleri verme veya reddetme konusunda daha iyi kararlar alabilmeleri için daha fazla şeffaflık sağlar.
Etkilenen izinler
Android 6.0 ve sonraki sürümlerde, çalışma zamanında izin modeli kullanmak için tehlikeli izinler gerekir.
Tehlikeli izinler, istek yapan uygulamalara gizli kullanıcı verilerine erişim veya cihaz üzerinde kontrol sağlayan ve kullanıcıyı olumsuz yönde etkileyebilecek daha yüksek riskli izinlerdir (READ_CALENDAR
gibi). Tehlikeli izinlerin listesini görüntülemek için şu komutu çalıştırın:
adb shell pm list permissions -g -d
Android 6.0 ve sonraki sürümler, normal izinlerin davranışını değiştirmez. Bunlar normal, sistem ve imza izinleri dahil olmak üzere tehlikeli olmayan izinlerdir. Normal izinler, istek yapan uygulamalara diğer uygulamalar, sistem veya kullanıcı için minimum riskle izole uygulama düzeyindeki özelliklere erişim izni veren daha düşük riskli izinlerdir (SET_WALLPAPER
gibi). Android 5.1 ve önceki sürümlerde olduğu gibi, sistem yükleme sırasında istek yapan uygulamaya normal izinleri otomatik olarak verir ve kullanıcıdan onay istemez. İzinlerle ilgili ayrıntılar için <permission> öğesi belgelerine bakın.
Android 10'daki katı ve yumuşak kısıtlamalar
Bir izin, tehlikeli olmasının yanı sıra katı veya yumuşak şekilde kısıtlanmış olabilir. Her iki durumda da kısıtlanmış izin de izin verilenler listesine eklenmelidir. İzin verilenler listesine eklenmemiş katı kısıtlamalar, izin verilenler listesine eklenmemiş yumuşak kısıtlamalardan farklı şekilde çalışır:
- (Katı kısıtlamalar) Uygulamalara izin verilenler listesinde olmayan izinler verilemez.
- (Yumuşak kısıtlamalar) İzin verilenler listesine eklenmemiş uygulamalar, istedikleri belirli izinlere göre çalışır. Bu davranış, istenen iznin herkese açık dokümanlarında açıklanır.
Yükleyici (ör. Google Play Store), uygulamayı yüklerken uygulamanın kısıtlanmış izinlerini izin verilenler listesine eklememeyi seçebilir. İzinler platform tarafından kısıtlanır ve yalnızca uygulama platform politikasına göre özel ölçütleri karşılıyorsa verilebilir. Katı şekilde kısıtlanmış izin türlerine örnek olarak SMS ve Arama Kaydı izinleri verilebilir.
İzin verilenler listesine ekleme işlemi, kurulum sırasında ve aşağıdaki durumlarda gerçekleşir:
- Android 9'dan 10'a geçiş sırasında bir uygulama zaten yüklüyse
- Bir izin önceden verilmişse veya bir uygulama önceden yüklenmişse
- İzni izin verilenler listesine eklemek için önceden tanımlanmış bir rol için izin gerekir.
- Yükleyici (ör. Google Play Store), izni izin verilenler listesinde olarak işaretler.
Kullanıcılar izinleri manuel olarak izin verilenler listesine ekleyemez.
Şartlar
Çalışma zamanında izin modeli, önceden yüklenmiş uygulamalar ve kurulum sürecinin bir parçası olarak cihaza dağıtılan uygulamalar da dahil olmak üzere tüm uygulamalar için geçerlidir. Uygulama yazılımı gereksinimleri şunları içerir:
- Çalışma zamanı izin modeli, Android 6.0 ve sonraki sürümleri çalıştıran tüm cihazlarda tutarlı olmalıdır. Bu, Android Compatibility Test Suite (CTS) testleri tarafından zorunlu kılınmaktadır.
- Uygulamalar, kullanıcılardan çalışma zamanında uygulama izinleri vermesini istemelidir. Ayrıntılar için Uygulamaları güncelleme başlıklı makaleyi inceleyin. Cihazın beklenen şekilde çalışması için temel cihaz işlevlerini sağlayan varsayılan uygulamalara ve işleyicilere sınırlı istisnalar verilebilir.
(Örneğin, cihazın
ACTION_CALL
işlevini yerine getiren varsayılan telefon uygulamasının Telefon izni erişimi olabilir.) Ayrıntılar için İstisna oluşturma başlıklı makaleyi inceleyin. - Tehlikeli izinlere sahip önceden yüklenmiş uygulamalar, API düzeyi 23'ü hedeflemeli ve çalışma zamanında istenen izin modelini korumalıdır. Yani uygulama yükleme sırasındaki kullanıcı arayüzü akışı, PermissionController'ın AOSP uygulamasından farklı olmamalıdır, kullanıcılar önceden yüklenmiş uygulamaların tehlikeli izinlerini iptal edebilir vb.
- Başsız uygulamalar, izin istemek veya gerekli izinlere sahip başka bir uygulamayla UID paylaşmak için bir etkinlik kullanmalıdır. Ayrıntılar için Başsız uygulamalar başlıklı makaleyi inceleyin.
İzin taşıma
Android 5.x'te uygulamalara verilen izinler, Android 6.0 veya sonraki bir sürüme güncellendikten sonra da geçerliliğini korur ancak kullanıcılar bu izinleri istedikleri zaman iptal edebilir.
Android 9'dan 10'a geçiş güncellemesinde, tüm katı şekilde kısıtlanmış izinler izin verilenler listesine eklenir. Ön plan/arka plan ayrı izinlerini uygulama hakkında ayrıntılı bilgi için Arka planda konum iste ile başlayan Android 10 gizlilik değişikliği başlıklı makaleyi inceleyin.
Entegrasyon
Android 6.0 ve sonraki sürümler için uygulama çalışma zamanında izin modelini entegre ederken önceden yüklenmiş uygulamaları yeni modelle çalışacak şekilde güncellemeniz gerekir. Ayrıca, temel işlev için varsayılan işleyiciler/sağlayıcılar olan uygulamalar için istisnalar tanımlayabilir, özel izinler tanımlayabilir ve PermissionController
uygulamasında kullanılan temayı özelleştirebilirsiniz.
Uygulamaları güncelleme
Sistem görüntüsünde ve önceden yüklenmiş uygulamalarda otomatik olarak önceden izin verilmez. Geliştirici yönergelerini kullanarak gerekli uygulama değişikliklerini yapmak için önceden yüklenmiş uygulama geliştiricilerle (OEM, operatör ve üçüncü taraf) çalışmanızı öneririz. Daha açık belirtmek gerekirse, önceden yüklenmiş uygulamaların, kullanıcılar izinleri iptal ettiğinde kilitlenme ve diğer sorunların yaşanmaması için değiştirildiğinden emin olmanız gerekir.
Önceden yüklenmiş uygulamalar
Android 9 ve önceki sürümlerde, tehlikeli izinler kullanan önceden yüklenmiş uygulamalar API düzeyi 23 veya üstünü hedeflemeli ve Android 6.0 ve sonraki sürümlerin AOSP izin modelini korumalıdır. Örneğin, uygulama yükleme sırasındaki kullanıcı arayüzü akışı, PermissionController
için AOSP uygulamasından farklı olmamalıdır. Kullanıcılar, önceden yüklenmiş uygulamaların tehlikeli izinlerini bile iptal edebilir.
Android 6.0 ile 9 arasında bazı izinler yükleme akışı sırasında verilir. Ancak 10'dan itibaren yükleme akışı (Package
Installer
uygulaması tarafından gerçekleştirilir), izin verme işlevinden (Permission Controller
uygulamasında) ayrı bir işlevdir.
Gözetimsiz uygulamalar
Yalnızca etkinlikler izin isteğinde bulunabilir. Hizmetler doğrudan izin isteğinde bulunamaz.
- Android 5.1 ve önceki sürümlerde, başlıksız uygulamalar yüklenirken veya etkinlik kullanılmadan önceden yüklenmişse izin isteyebilir.
- Android 6.0 ve sonraki sürümlerde, headless uygulamalar izin istemek için aşağıdaki yöntemlerden birini kullanmalıdır:
- İzin istemek için bir etkinlik ekleyin. (Tercih edilen yöntem budur.)
- Gerekli izinlere sahip başka bir uygulamayla UID paylaşın. Bu yöntemi yalnızca platformun birden fazla APK'yı tek bir uygulama olarak işlemesine ihtiyaç duyduğunuzda kullanın.
Amaç, bağlam dışı izin istekleriyle kullanıcıların kafasını karıştırmaktır.
PackageInstaller kullanıcı arayüzünü özelleştirme
İsterseniz PackageInstaller tarafından kullanılan varsayılan cihaz temalarını (Theme.DeviceDefault.Settings
ve Theme.DeviceDefault.Light.Dialog.NoActionBar
) güncelleyerek İzinler kullanıcı arayüzü temasını özelleştirebilirsiniz. Ancak uygulama geliştiriciler için tutarlılık çok önemli olduğundan izin kullanıcı arayüzünün yerleşimini, konumunu ve ne zaman görüneceğini belirten kuralları özelleştiremezsiniz.
Ek diller için dizeler eklemek istiyorsanız dizeleri AOSP'ye gönderin.
İstisna oluşturma
PackageManager'daki DefaultPermissionGrantPolicy.java
sınıfını kullanarak, temel OS işlevleri için varsayılan işleyici veya sağlayıcı olan uygulamalara önceden izin verebilirsiniz. Örnekler:
ACTION_CALL (Dialer) Default Phone, Contacts, SMS, Microphone
SMS_DELIVER_ACTION (SMS/MMS) Default Phone, Contacts, SMS
Özel izinler tanımlama
Android 5.x ve önceki sürümlerde yapabildiğiniz gibi, özel izinleri ve grupları normal veya tehlikeli olarak tanımlayabilir ve mevcut izin gruplarına OEM/operatöre özgü izinler ekleyebilirsiniz.
Android 6.0 ve sonraki sürümlerde yeni bir tehlikeli izin eklerseniz bu izin, diğer tehlikeli izinlerle aynı şekilde ele alınmalıdır (uygulama çalışma zamanında istenir ve kullanıcılar tarafından iptal edilebilir). Özellikle:
- Mevcut bir gruba yeni izinler ekleyebilirsiniz ancak tehlikeli izinlerin ve tehlikeli izin gruplarının AOSP eşlemesini değiştiremezsiniz. (Başka bir deyişle, bir izini bir gruptan kaldırıp başka bir gruba atayamazsınız).
- Cihaza yüklenen uygulamalara yeni izin grupları ekleyebilirsiniz ancak platform manifest dosyasına yeni izin grupları ekleyemezsiniz.
İzinleri test etme
Android, bireysel izinlerin doğru gruplarla eşlendiğini doğrulayan Compatibility Test Suite (CTS) testlerini içerir. Bu testleri geçmek, Android 6.0 ve sonraki sürümlerde CTS uyumluluğu için gereklidir.
İzinleri iptal etme
Android 13 ve sonraki sürümlerde, Context.revokeSelfPermissionsOnKill()
kullanarak kendi verdiğiniz çalışma zamanındaki izinleri iptal edebilirsiniz.
İptal işlemi, kullanıcının kesintiye uğramaması durumunda güvenli olduğunda eşzamansız olarak tetiklenir. İptal tetiklendiğinde, arayan UID'de çalışan tüm işlemler sonlandırılır.
Tek bir iznin iptal edilmesinin, izinleri gruba göre işleyen ayarlar kullanıcı arayüzüne yansıtılmayabileceğini unutmayın. Genellikle, bir izin grubundaki izinlerden en az biri verildiği sürece izin grubu verilmiş olarak gösterilir. Kullanıcıların ayarlarda iptal işlemini onaylayabilmesi sizin için önemliyse izin grubundaki tüm izinleri iptal ettiğinizden emin olun. Belirli bir gruba ait izinleri öğrenmek için PackageManager.getGroupOfPlatformPermission
ve PackageManager.getPlatformPermissionsForGroup
kullanabilirsiniz.
Sistem, istenen izinleri iptal ettiğinde, ilgili ön plan izinlerinden hiçbiri hâlâ verilmemişse ilgili arka plan izinlerini de iptal eder.
Süreç ön planda kaldığı sürece iptal işlemi tetiklenmez ancak mevcut kullanıcı kimliğinde çalışan tüm süreçler manuel olarak kapatılarak (ör. System.exit()
kullanılarak) hemen de tetiklenebilir.
Ancak ne zaman tetikleneceğine sistemin karar vermesi önerilir.
İzin iptal edildikten sonra izni tekrar isteyebilirsiniz. Bu durumda kullanıcıdan isteği kabul etmesi veya reddetmesi istenir. Daha önce kullanıcı tarafından reddedilen bir izin isteğinde bulunulamaz. Şu anda sahip olduğunuz ancak artık gerekli olmayan izinleri iptal etmeniz önerilir. Ancak kullanıcıyı, iptal işlemi geçerli hale gelene kadar iptal işlemi hakkında bilgilendirmemeye dikkat etmeniz gerekir.