AndroidManifest Permissions — bu AndroidManifest.xml faylidagi ruxsatnoma deklaratsiyalari bo‘lib, ular ilovaning qaysi tizim resurslari va ma’lumotlariga kirish huquqini belgilaydi. Android har bir ruxsatnomani tegishli API dan foydalanishdan oldin manifestda ko‘rsatishni talab qiladi: kameradan va geolokatsiyadan SMS yuborish va kontaktlarga kirishgacha. Android Developer Documentation ga ko‘ra, har bir ruxsatnoma to‘rt himoya darajasidan biriga bo‘linadi: normal, dangerous, signature va special.
Asosiy ma’lumotlar
AndroidManifest Permissions — bu Android ilovalarning himoyalangan ma’lumotlar va tizim funksiyalariga kirishini boshqaruvchi xavfsizlik mexanizmidir. Har bir ilova AndroidManifest.xml faylida <uses-permission> elementi yordamida kerakli ruxsatnomalarni deklaratsiya qilishi kerak. Deklaratsiyasiz tegishli API ni chaqirish SecurityException xavfsizlik xatosi bilan tugaydi.
Android ruxsatnoma modeli bir necha evolyutsiya bosqichidan o‘tdi. Android 6.0 (API 23) dan oldin barcha ruxsatnomalar o‘rnatish vaqtida berilardi — foydalanuvchi to‘liq ro‘yxatni ko‘rar va ilova o‘rnatishga rozilik berar yoki rad etardi. Android 6.0 dan boshlab dangerous darajasidagi ruxsatnomalar bajarish vaqtida (Runtime Permissions) so‘raladi, bu foydalanuvchiga moslashuvchanroq nazorat beradi.
Ruxsatnomalar to‘rt himoya darajasiga bo‘linadi: normal (o‘rnatish vaqtida avtomatik beriladi), dangerous (bajarish vaqtida so‘rov talab qiladi), signature (faqat bir xil sertifikat bilan imzolangan ilovalar uchun mavjud) va special (sozlamalarda alohida yoqishni talab qiladi). Har bir daraja o‘zining berish va qaytarib olish mexanizmiga ega.
Google I/O 2024 ga ko‘ra, Android 15 da aniqroq ruxsatnomalar joriy etilishi rejalashtirilgan — foydalanuvchi butun media kutubxonasiga emas, balki faqat ma’lum fayllarga kirishni ta’minlashi mumkin bo‘ladi. Bu Androidning sukut bo‘yicha taqdim etiladigan ma’lumotlar hajmini minimallashtirish tendentsiyasini davom ettiradi.
Barcha ruxsatnomalar bajarish vaqtida (runtime) so‘raladigan iOS dan farqli o‘laroq, Android ruxsatnomalarni o‘rnatish (install-time) va bajarish (runtime) ga ajratadi. Normal daraja o‘rnatish vaqtida foydalanuvchiga xabardor qilmasdan avtomatik beriladi. Dangerous daraja iOS dagi kabi aniq dialog oynasini talab qiladi.
Yana bir farq: Android da ruxsatnomalar guruhlarga (permission groups) birlashtirilgan. Agar foydalanuvchi kameraga kirishga rozilik bersa, ilova avtomatik ravishda mikrofon ga kirish huquqini oladi — ular bir xil MICROPHONE guruhida. iOS da har bir ruxsatnoma guruhdan qat’iy nazar alohida so‘raladi.
| Android versiyasi | Ruxsatnoma modelidagi o‘zgarish |
|---|---|
| Android 1.0–5.x | Barcha ruxsatnomalar o‘rnatish vaqtida beriladi (install-time) |
| Android 6.0 (API 23) | Dangerous darajasi uchun Runtime Permissions joriy etildi |
| Android 10 (API 29) | Scoped Storage — fayl tizimiga kirish cheklangan |
| Android 11 (API 30) | Ruxsatnomalarni avtomatik qaytarish — ishlatilmagan ruxsatnomalar qaytariladi |
| Android 14 (API 34) | Media kirishi uchun Runtime ruxsatnomalari (foto, video, audio) |
Android ruxsatnomalar uchun to‘rt himoya darajasini (protection levels) belgilaydi, har biri o‘ziga xos berish qoidalariga ega. Har bir darajani batafsil ko‘rib chiqamiz.
Normal ruxsatnomalar ilova o‘rnatilayotganda foydalanuvchiga xabar bermasdan yoki so‘rovsiz avtomatik beriladi. Ular foydalanuvchi maxfiyligiga tahdid solmaydigan past xavfli funksiyalarga kirishni qamrab oladi: INTERNET, ACCESS_NETWORK_STATE, VIBRATE, BLUETOOTH. Foydalanuvchi rozilik dialogini ko‘rmaydi — ruxsatnoma o‘rnatish fakti bilan berilgan hisoblanadi.
Ishlab chiquvchi normal ruxsatnomalar uchun kodda so‘rovni qayta ishlashi shart emas — ularni manifestda deklaratsiya qilish kifoya. Biroq, Android 12+ da Google Play dan o‘rnatishda foydalanuvchi barcha normal ruxsatnomalar ro‘yxati bilan “Ruxsatnomalar” yorlig‘ini ko‘radi, bu shaffoflikni oshiradi. Statista (2024) ga ko‘ra, Google Play dagi ilovalarning 90% dan ortig‘i eng keng tarqalgan normal ruxsatnoma INTERNET dan foydalanadi.
Dangerous ruxsatnomalar maxfiylikni buzishi mumkin bo‘lgan ma’lumotlar va funksiyalarga kirishni qamrab oladi: kamera, mikrofon, geolokatsiya, kontaktlar, SMS, telefon, kalendar, tana sensorlari. Bu ruxsatnomalar ikki bosqichli mexanizmni talab qiladi: manifestda deklaratsiya + ActivityCompat.requestPermissions() orqali bajarish vaqtida so‘rov.
Foydalanuvchi dangerous ruxsatnomasini berishni rad etishi mumkin va ilova bu stsenariyni to‘g‘ri qayta ishlashi kerak. Android 11+ da agar foydalanuvchi ikki marta rad etgan bo‘lsa, keyingi so‘rovlar tizim dialogini ko‘rsatmaydi — tizim avtomatik ravishda DENIED qaytaradi. Bunday holda foydalanuvchini sozlamalarga yo‘naltirish kerak.
Signature darajasi — agar ilova tizim yoki ruxsatnomani belgilagan boshqa ilova bilan bir xil sertifikat bilan imzolangan bo‘lsa, ruxsatnoma avtomatik beriladi. Tizim va korporativ ilovalar uchun ishlatiladi. Misol: BIND_ACCESSIBILITY_SERVICE — faqat tizim ilovalari uchun mavjud.
Special darajasi (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, REQUEST_INSTALL_PACKAGES, MANAGE_EXTERNAL_STORAGE) — tizim sozlamalari orqali foydalanuvchining alohida harakatini talab qiladi. Ilova Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) bilan sozlamalar sahifasini ochishi mumkin. Google Play special ruxsatnomalaridan foydalanishni cheklaydi va nashr qilishda formada asoslashni talab qiladi.
Android 6.0 dan boshlab barcha dangerous ruxsatnomalari bajarish vaqtida so‘rov talab qiladi. Kotlin da runtime permissions bilan to‘liq ishlash siklini ko‘rib chiqamiz.
Dangerous ruxsatnomasini talab qiladigan API ni chaqirishdan oldin har doim joriy holatni ContextCompat.checkSelfPermission() orqali tekshiring. Agar holat PERMISSION_GRANTED bo‘lsa — API chaqirilishi mumkin. Agar PERMISSION_DENIED bo‘lsa — ActivityResultContract RequestPermission (AndroidX) yoki eskirgan requestPermissions() orqali ruxsatnoma so‘ralishi kerak.
Bir vaqtning o‘zida bir nechta ruxsatnomani so‘rash uchun ActivityResultContracts.RequestMultiplePermissions dan foydalanish tavsiya etiladi. Google bog‘liq ruxsatnomalarni (masalan, video yozish uchun kamera + mikrofon) bitta dialogda guruhlashni tavsiya qiladi, shunda foydalanuvchi so‘rovning to‘liq kontekstini ko‘radi.
import android.Manifest
import android.content.pm.PackageManager
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
class CameraActivity : AppCompatActivity() {
private val requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
openCamera()
} else {
explainWhyPermissionNeeded()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
checkCameraPermission()
}
private fun checkCameraPermission() {
when {
ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED -> {
openCamera()
}
shouldShowRequestPermissionRationale(
Manifest.permission.CAMERA
) -> {
showRationale()
}
else -> {
requestPermissionLauncher.launch(
Manifest.permission.CAMERA
)
}
}
}
}
Foydalanuvchi ruxsatnomani ikki marta rad etsa, Android so‘rovni “Never ask again” holatiga o‘tkazadi. Bunday holda shouldShowRequestPermissionRationale() false qaytaradi va tizim dialogi ko‘rsatilmaydi. Ilova foydalanuvchini Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) orqali tizim sozlamalariga yo‘naltirishi kerak.
Muhim: birinchi rad etishdan so‘ng darhol sozlamalarni ochishni taklif qiladigan dialog ko‘rsatmang — bu tajovuzkor xatti-harakat sifatida qabul qilinadi. Tushuntirishni ko‘rsatish kerakligini aniqlash uchun shouldShowRequestPermissionRationale() dan foydalaning. Material Design Guidelines faqat “Sozlamalarni och” tugmasi emas, balki kirish qiymatini tushuntiruvchi ekranni ko‘rsatishni tavsiya qiladi.
private fun openAppSettings() {
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", packageName, null)
).also { intent ->
startActivity(intent)
}
}
private fun showPermissionSettings() {
AlertDialog.Builder(this)
.setTitle("Kameraga kirish")
.setMessage("Sozlamalarda kameraga kirishga ruxsat bering, "
+ "profil uchun suratga olish uchun")
.setPositiveButton("Sozlamalarni och") { _, _ ->
openAppSettings()
}
.setNegativeButton("Bekor qilish", null)
.show()
}
AndroidManifest.xml fayli ilova ishlatadigan har bir ruxsatnoma uchun <uses-permission> elementini o‘z ichiga oladi. Ruxsatnomalar <manifest> darajasida <application> elementidan oldin e’lon qilinadi.
Har bir ruxsatnoma android:name atributi bilan to‘liq ruxsatnoma nomini ko‘rsatuvchi alohida <uses-permission> elementi sifatida e’lon qilinadi. Muayyan Android versiyalarida paydo bo‘lgan ruxsatnomalar uchun maxSdkVersion atributidan foydalanib, deklaratsiyani faqat kerakli versiyalar bilan cheklang — bu moslikni yaxshilaydi.
Masalan, WRITE_EXTERNAL_STORAGE ruxsatnomasi Android 10+ (Scoped Storage) da kerak emas, shuning uchun maxSdkVersion=“28” (Android 9) belgilang. Bu yangi versiyalarda foydalanuvchilardan keraksiz savollarning oldini oladi. Android Studio Lint orqali tavsiya etilgan maxSdkVersion haqida ogohlantiradi.
<!-- AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions (install-time) -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Dangerous permissions (runtime) -->
<uses-permission
android:name="android.permission.CAMERA" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Legacy storage permission limited to API 28 and below -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<application>
<!-- ... -->
</application>
</manifest>
<uses-feature> elementi ilova ma’lum bir apparatni (kamera, GPS, NFC) talab qilishini belgilaydi. android:required=“false” atributi ilovani ushbu apparatsiz qurilmalarga o‘rnatish imkonini beradi — mavjudlik tekshiruvi kodda amalga oshiriladi. Agar required=“true” bo‘lsa, Google Play ilovani filtrlaydi va u mos bo‘lmagan qurilmalar uchun mavjud bo‘lmaydi.
Barcha apparat funksiyalari uchun required=“false” belgilash va mavjudlikni PackageManager.hasSystemFeature() orqali dasturiy tekshirish tavsiya etiladi. Bu ilovangiz auditoriyasini kengaytiradi. Yagona istisno — funksiya ilova ishlashi uchun muhim bo‘lgan holat (GPSsiz taksi buyurtma ilovasi ma’nosiz).
Ruxsatnomalar bilan to‘g‘ri ishlash Android ilovasi sifatining asosiy jihatidir. Asosiy tavsiyalar va odatiy xatolarni ko‘rib chiqamiz.
Faqat ilova ishlashi uchun haqiqatan zarur bo‘lgan ruxsatnomalarni so‘rang. Har bir qo‘shimcha ruxsatnoma o‘rnatish konversiyasini kamaytiradi va rad etishlar sonini oshiradi. Google Play Console foydalanuvchilarning qanchasi ruxsatnomalar to‘plami tufayli o‘rnatishdan voz kechganini ko‘rsatadi. AppBrain (2024) ga ko‘ra, 10+ dangerous ruxsatnomasi bo‘lgan ilovalar 35% kamroq o‘rnatishga ega.
Muntazam ravishda ruxsatnomalar ro‘yxatini ko‘rib chiqing. Foydalanilmaydiganlarini olib tashlang, ayniqsa ba‘zi ruxsatnomalar ixtiyoriy bo‘lgan yangi Android versiyalariga o‘tishda. Masalan, Android 13+ da foto tanlash (ActivityResultContracts.PickVisualMedia) paydo bo‘lishi bilan media kutubxonasiga kirish READ_MEDIA_IMAGES dangerous ruxsatnomasisiz olinishi mumkin.
Dangerous ruxsatnomasini so‘rashdan oldin foydalanuvchiga bu ruxsatnoma nima uchun kerakligi va qanday qiymat berishini tushuntiruvchi ekranni ko‘rsating. Material Design belgi, qisqa matn va “Davom etish” tugmasi bilan bottom sheet yoki dialog oynasidan foydalanishni tavsiya qiladi. Rationale to‘g‘ridan-to‘g‘ri so‘rov bilan solishtirganda rozilikni 20–30% ga oshiradi.
launch() chaqirishdan oldin shouldShowRequestPermissionRationale() ni tekshiring. Agar true bo‘lsa — rationale ko‘rsating. Agar false bo‘lsa — yoki ruxsatnoma allaqachon berilgan yoki foydalanuvchi butunlay rad etgan (never ask again). Oxirgi holatda so‘rovni takrorlash o‘rniga “Sozlamalarni och” tugmasini ko‘rsating.
Barcha mumkin bo‘lgan stsenariylarni test qiling: ruxsatnomani berish, rad etish, butunlay rad etish, sozlamalarda ruxsatnomani qaytarib olish, ruxsatnomalarni qaytarish (Android 11+ auto-reset). Har bir stsenariy crash va ma’lumot yo‘qotishisiz qayta ishlanishi kerak. Android Testing Guide testlarni avtomatlashtirish uchun TestPermission kutubxonasidan foydalanishni tavsiya qiladi.
Foydalanuvchi ilova ishlayotganda ruxsatnomani qaytarib olgan stsenariyga alohida e’tibor bering (kichraytirilgan ilova → Sozlamalar → qaytarib olish). Ilovaga qaytganda barcha ruxsatnomalarni onResume() orqali qayta tekshiring. Ruxsatnoma holatini keshlashga ishonmang — foydalanuvchi ularni istalgan vaqtda o‘zgartirishi mumkin.
Tez-tez so‘raladigan savollar
Ha, agar SDK o‘z manifestiga ruxsatnomani kiritgan bo‘lsa, u qurish vaqtida ilova manifesti bilan birlashtiriladi. SDK ning keraksiz ruxsatnomasini AndroidManifest.xml da tools:node=“remove” bilan o‘chirib qo‘yishingiz mumkin.
Ruxsatnomasiz API chaqiruvi SecurityException ga sabab bo‘lib, ilovaning ishdan chiqishiga olib keladi. Har doim tegishli API dan foydalanishdan oldin ruxsatnoma holatini tekshiring va rad etishni to‘g‘ri qayta ishlang.
Qurilma sozlamalarida: Sozlamalar → Ilovalar → [sizning ilovangiz] → Ruxsatnomalar. Barcha ruxsatnomalarni qaytarish uchun adb buyrug‘idan foydalaning: adb shell pm reset-permissions.
Ha, Fragment yoki Service da ActivityResultLauncher yordamida. Biroq so‘rov dialogi har doim Activity UI kontekstini talab qiladi. Service uchun so‘rov bilan Activity ochadigan Intent bilan Notification ko‘rsatishingiz mumkin.
Masalan, WRITE_EXTERNAL_STORAGE Android 10+ (Scoped Storage) da kerak emas. android:maxSdkVersion=“28” belgilash orqali siz yangi versiyalarda ruxsatnoma deklaratsiyasini istisno qilasiz, bu moslikni yaxshilaydi va so‘raladigan ruxsatnomalar ro‘yxatini kamaytiradi.
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.