Permission Group — bu Android-da ruxsatlarni guruhlash mexanizmi boʻib, funksional jihatdan bogʻlangan xavfli ruxsatlarni bitta mantiqiy kategoriyaga birlashtiradi. Android Permissions Overview, 2024 maʻlumotlariga koʻra, ruxsat guruhlari foydalanuvchi interfeysini soddalashtiradi: agar foydalanuvchi guruhdan bitta ruxsat bergan boʻlsa, qolganlari qoʻshimcha dialoglarsiz avtomatik beriladi. Bu soʻrovlar sonini kamaytiradi va UX-ni yaxshilaydi.
Asosiy nuqtalar
Permission Group — bu Android tizim mexanizmi boʻib, bir nechta xavfli ruxsatlarni funksional maqsadiga koʻra bitta guruhga birlashtiradi. Har bir guruhning satr identifikatori bor, masalan android.permission-group.CAMERA yoki android.permission-group.LOCATION. Bitta guruh ichidagi barcha ruxsatlar mantiqiy bogʻlangan va qurilmaning oʻxshash funksiyalariga kirishni taʻminlaydi.
Ruxsat guruhlari Android 6.0 Marshmallow bilan runtime soʻrov modeli bilan birga paydo boʻldi. Ularning asosiy maqsadi foydalanuvchi bilan oʻzaro aloqani soddalashtirish: har bir alohida ruxsat uchun bir qator dialoglar oʻrniga, tizim har bir guruh uchun bitta dialog koʻrsatadi. Agar foydalanuvchi guruhdan bitta ruxsat bergan boʻlsa, qolganlari avtomatik tasdiqlangan hisoblanadi. Android UX Research (2015) maʻlumotlariga koʻra, bu birinchi ishga tushirishdagi rad etishlar sonini 20 foizga kamaytirgan.
Dasturchi oʻzining Permission Group-larini yarata olmasligini tushunish muhim. Guruhlar operatsion tizim darajasida oldindan belgilanadi va har bir qurilmadagi permissions.xml fayllarida tavsiflanadi. Dastur faqat uses-permission ni koʻrsatadi, tizim esa protectionLevel va AOSP dagi kategoriyalashtirishga asoslanib ruxsatni avtomatik ravishda uning guruhi bilan bogʻlaydi.
Ruxsatning guruh bilan bogʻlanishi tizim ruxsat taʻrifidagi permissionGroup atributi orqali amalga oshiriladi. Masalan, CAMERA permissionGroup="android.permission-group.CAMERA" bilan, ACCESS_FINE_LOCATION esa permissionGroup="android.permission-group.LOCATION" bilan eʻlon qilingan. Bu xaritalash Android Open Source Project kodida qattiq belgilangan va barcha sertifikatlangan qurilmalarda bir xil.
Guruh mexanizmi “harbir guruh uchun bitta dialog” prinsipi bilan ishlaydi. Dastur birinchi marta har qanday xavfli ruxsatni soʻraganda, tizim uning Permission Group-ni tekshiradi. Agar bu guruhdan hali hech qanday ruxsat berilmagan boʻlsa — dialog koʻrsatiladi. Rozilikdan soʻng, tizim butun guruhni berilgan deb belgilaydi va shu guruhdagi boshqa ruxsatlarning keyingi soʻrovlari foydalanuvchi interfeysisiz qondiriladi.
Algoritm soddalashtirilgan holda quyidagicha koʻrinadi:
Bu mexanizm faqat xavfli ruxsatlarga taalluqli. Oddiy ruxsatlarning guruhlari yoʻq va bu mantiqda qatnashmaydi. Imtiyozli va imzolangan ruxsatlar ham guruhlanmaydi — ularning alohida kirish boshqaruv tizimi bor.
Guruhlar “teskari yoʻnalishda” ishlamaydi: sozlamalar orqali guruhdan bitta ruxsatni qaytarib olish faqat uni qaytarib oladi, qolganlariga taʻsir qilmaydi. Shuningdek, agar foydalanuvchi guruh uchun dialogni rad etgan boʻlsa, bu boshqa guruhlarni bloklamaydi — boshqa guruhdagi har bir yangi ruxsat oʻzining dialogini koʻrsatadi. Permission Group faqat soʻrovning UX-iga taʻsir qiladi, xavfsizlik modeliga emas.
Android belgilaydi xavfli ruxsatlar uchun quyidagi tizim Permission Group-larini. Har bir guruh umumiy funksional maqsad bilan birlashtirilgan bir yoki bir nechta ruxsatni oʻz ichiga oladi.
| Guruh identifikatori | Guruhdagi ruxsatlar | Tavsif |
|---|---|---|
| CAMERA | CAMERA | Qurilma kamerasiga kirish |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION | Geolokatsiya (aniq va taxminiy) |
| MICROPHONE | RECORD_AUDIO | Mikrofondan ovoz yozish |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VOICEMAIL, USE_SIP | Telefon funksiyalari |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS | Kontaktlar va hisoblarga kirish |
| SMS | READ_SMS, SEND_SMS, RECEIVE_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS | SMS yuborish va qabul qilish |
| STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE | Tashqi xotirani oʻqish va yozish |
| CALENDAR | READ_CALENDAR, WRITE_CALENDAR | Taqvimga kirish |
| SENSORS | BODY_SENSORS | Tana sensorlari (yurak urishi va boshqalar) |
| ACTIVITY_RECOGNITION | ACTIVITY_RECOGNITION | Jismoniy faollikni aniqlash |
Android 13 (API 33) da BLUETOOTH_SCAN, BLUETOOTH_CONNECT va BLUETOOTH_ADVERTISE ni birlashtiruvchi yangi NEARBY_DEVICES guruhi paydo boʻldi. Shuningdek, STORAGE guruhi qisman READ_MEDIA_IMAGES, READ_MEDIA_VIDEO va READ_MEDIA_AUDIO media ruxsatlari bilan almashtirildi, ular STORAGE tarkibiga kirmaydi, balki guruhlashsiz mustaqil xavfli ruxsatlardir.
Dasturchilar manifestdagi permissionGroup atributi orqali maxsus Permission Group-lar bilan oʻz ruxsatlarini eʻlon qilishlari mumkin. Biroq bu faqat shu dasturning maxsus ruxsatlari uchun ishlaydi va tizim UI dialoglariga taʻsir qilmaydi. Amalda maxsus Permission Group-lar kamdan-kam ishlatiladi — bitta stekda oʻz dasturlari orasidagi oʻzaro aloqa uchun.
Permission Group-ning taʻsiri foydalanuvchi tajribasiga sezilarli. Guruhlash tufayli foydalanuvchi turli ruxsatlar uchun 8 ta alohida dialog emas, balki bir nechta guruh dialoglarini koʻradi. Bu kognitiv yukni kamaytiradi va foydalanuvchining maqsadini tushunmay muhim ruxsatni rad etish ehtimolini pasaytiradi.
UX tadqiqotlari shuni koʻrsatadiki, guruh dialoglari foydalanuvchilar tomonidan shaffofroq qabul qilinadi. Dastur „kameraga kirish” ni soʻraganda, foydalanuvchi kontekstni tushunadi. Agar har bir ruxsat alohida soʻralganda edi — CAMERA, CAMERA2, FLASHLIGHT — bu ortiqchalik taassurotini yaratgan boʻlardi. Permission Group bu detalni abstraksiya qiladi.
Eng yaxshi amaliyot — ruxsatlarni faqat bir guruhdan bir martada soʻrashdir. Agar dasturga ham kamera, ham geolokatsiya kerak boʻlsa, ularni bitta requestPermissions chaqiruvi bilan soʻramang. Avval bir guruhni tushuntirishdan keyin soʻrang, keyin ikkinchisini. Bu foydalanuvchiga nazorat va har bir funksiyaning ketma-ket tushunilishini beradi.
Permission Group va ProtectionLevel — bu Android ruxsat tizimining ikki xil oʻlchovidir. ProtectionLevel ruxsatning qanday berilishini belgilaydi (normal, dangerous, signature, privileged), Permission Group esa UI koʻrsatuvi uchun kategoriyadir. Ular mustaqil, ammo amalda dangerous + permission group kombinatsiyasi eng koʻp uchraydi.
Bir xil ProtectionLevel-dagi ruxsatlar turli guruhlarga tegishli boʻlishi mumkin. Masalan, ACCESS_FINE_LOCATION va CAMERA ikkalasi ham protectionLevel dangerous ga ega, ammo turli guruhlarga — LOCATION va CAMERA ga tegishli. Va aksincha, bir xil nomli ruxsatlar doim bir guruhga tegishli: ACCESS_FINE_LOCATION va ACCESS_COARSE_LOCATION ikkalasi LOCATION da.
Yuqori darajadagi himoya sathlari — signature va privileged — UI uchun Permission Group dan foydalanmaydi. Ularning berilishi tizim darajasida boshqariladi: signature tizim bilan bir xil sertifikat bilan imzolangan dasturlarga, privileged esa tizim tasviridagi dasturlarga beriladi. Bunday ruxsatlar uchun guruhlar mavjud, ammo UX dialoglariga taʻsir qilmaydi, chunki bunday dialoglar mavjud emas.
Dasturchi dasturiy ravishda PackageManager orqali istalgan ruxsatning Permission Group-ni aniqlashi mumkin. getPermissionInfo metodi guruhning satr identifikatorini oʻz ichiga olgan group maydoni bilan PermissionInfo qaytaradi. Bu loglash, analitika va maxsus ruxsat UI ekranlari uchun foydali.
fun getPermissionGroupName(
permission: String
): String? {
return try {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
info.group
} catch (e: NameNotFoundException) {
null
}
}
fun getPermissionsByGroup(
group: String
): List<String> {
val pm = packageManager
val perms = pm.queryPermissionsByGroup(
group,
PackageManager.GET_META_DATA
)
return perms.map { it.name }
}
Permission Group-ni bilish soʻrov arxitekturasini qurishga yordam beradi. Muayyan guruh uchun ruxsatlar roʻyxatini qaytaradigan PermissionGroupProvider abstraksiyasini yaratish mumkin. Bu testlashni soddalashtiradi: birlik testlarida provider PackageManager ga murojaat qilmasdan soxta maʻlumotlar qaytaradi. Instrumental testlarda — tizimdan real guruhlar.
PermissionGroupProvider ni Dagger Hilt yoki Koin orqali integratsiya qilish ruxsatlar va guruhlar xaritalashini markazlashtirilgan boshqarishga imkon beradi. Providerda PackageManager.queryPermissionsByGroup natijasini keshlash mumkin, har bir soʻrovda takroriy tizim chaqiruvlarini oldini olish uchun. Bu, ayniqsa, barcha ruxsatlar va ularning holati koʻrsatiladigan sozlamalar ekranlari uchun muhim.
Rad etishlar haqida analitika yigʻishda nafaqat ruxsat nomini, balki uning Permission Group-ni ham loglash foydali. Bu eng koʻp rad etishga sabab boʻladigan funksional sohalarni aniqlashga yordam beradi. Masalan, LOCATION guruhi anʻanaviy ravishda eng yuqori rad etish foiziga ega — Google Play Console statistikasiga koʻra taxminan 40 foiz.
Guruhlar boʻyicha analitika mahsulot qarorlarini qabul qilishga yordam beradi: agar CONTACTS guruhi yuqori rad etish foiziga ega boʻlsa, soʻrov vaqtini qayta koʻrib chiqish yoki tushuntirish dialogi qoʻshish kerak boʻlishi mumkin. Analitikaga guruh yondashuvi alohida ruxsatlar tahlilidan koʻra toʻlaroq rasm beradi, chunki butun guruh boʻyicha rad etishlar soni foydalanuvchilarning funksional sohaga umumiy munosabatini aks ettiradi.
Tez-tez beriladigan savollar
Permission Group — funksional bogʻlangan xavfli ruxsatlarni bitta kategoriyada birlashtiruvchi mexanizm. Agar foydalanuvchi guruhdan bitta ruxsat bergan boʻlsa, qolganlari qoʻshimcha dialogsiz avtomatik beriladi.
Standart Android-da taxminan 10 ta asosiy guruh bor: CAMERA, LOCATION, MICROPHONE, PHONE, CONTACTS, SMS, STORAGE, CALENDAR, SENSORS va ACTIVITY_RECOGNITION. Android 13+ da NEARBY_DEVICES qoʻshilgan.
Ha, maxsus ruxsatlar uchun AndroidManifest.xml dagi permissionGroup atributi orqali. Lekin bu faqat dastur ichidagi ruxsatlar uchun ishlaydi va tizim UI dialoglariga taʻsir qilmaydi. Amalda kamdan-kam ishlatiladi.
Guruhdan bitta ruxsatni qaytarib olish qolganlarini qaytarib olmaydi. Foydalanuvchi ACCESS_FINE_LOCATION ni oʻchirishi mumkin, ammo ACCESS_COARSE_LOCATION faol qoladi. Guruh faqat berishga taʻsir qiladi, qaytarib olishga emas.
PackageManager.getPermissionInfo dan foydalaning va group maydonini oʻqing. Metod guruhning satr identifikatorini qaytaradi, masalan android.permission-group.CAMERA. Agar ruxsatning guruhi boʻlmasa, maydon null boʻladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.