Normal Permission — دستهای از مجوزها در Android است که سیستم بدون درخواست از کاربر به طور خودکار اعطا میکند. به گفته Android Developer Documentation, 2024، مجوزهای عادی دارای ProtectionLevel normal هستند و برخلاف مجوزهای خطرناک، به دیالوگ runtime نیاز ندارند. آنها دسترسی به اینترنت، وضعیت شبکه و لرزش را پوشش میدهند بدون اینکه خطری برای دادههای محرمانه کاربر ایجاد کنند.
نکات اصلی
Normal Permission — نوعی از مجوزهای سیستمی Android با ProtectionLevel normal است که در لحظه نصب به طور خودکار به برنامه اعطا میشود. توسعهدهنده نیازی به نوشتن کد برای درخواست ندارد — کافیست مجوز را در AndroidManifest.xml مشخص کند. کاربر هیچ دیالوگی نمیبیند و نمیتواند normal permission را جداگانه لغو کند، فقط با حذف کامل برنامه.
سیستم Android مجوزهای عادی را کمخطر طبقهبندی میکند — آنها به دادههای شخصی، دوربین یا میکروفون دسترسی نمیدهند. نمونههای معمول: دسترسی به اینترنت، کنترل لرزش، خواندن وضعیت Wi-Fi. طبق Android Security Model (2024)، حدود ۴۰ درصد از تمام مجوزهای سیستمی در رده عادی قرار دارند.
ویژگی مهم — مجوزهای عادی در زمان اجرا از طریق Settings لغو نمیشوند. اگر کاربر میخواهد دسترسی را ممنوع کند، تنها راه حذف برنامه است. توسعهدهندگان باید این را در معماری در نظر بگیرند، اما برای کاربران چنین رویکردی تعامل را ساده میکند: بدون هیچ دیالوگی در اولین راهاندازی.
تقسیمبندی به مجوزهای عادی و خطرناک در Android 6.0 Marshmallow (API 23) ظاهر شد. قبل از این نسخه، همه مجوزها هنگام نصب درخواست میشدند — کاربر یک فهرست واحد میدید و آن را به طور کامل میپذیرفت یا رد میکرد. Normal Permission این مدل را برای عملیات کمخطر حفظ کرد و Dangerous به درخواست runtime تغییر یافت. این تغییر تجربه کاربری را بهبود بخشید و همزمان امنیت را افزایش داد.
بسیاری از APIهای سیستمی Android نیاز به ذکر صریح مجوز عادی دارند، حتی اگر دسترسی خودکار باشد. به عنوان مثال، کلاس ConnectivityManager نیاز به ACCESS_NETWORK_STATE دارد، VibratorService نیاز به VIBRATE دارد، WifiManager نیاز به ACCESS_WIFI_STATE دارد. بدون اعلان uses-permission مربوطه، فراخوانی این APIها منجر به SecurityException میشود.
ProtectionLevel normal — حداقل سطح حفاظت در Android Permission System است. مجوزهای با این سطح در مانیفست اعلام میشوند و سیستم هنگام نصب اعلامیه را بررسی کرده و بدون دخالت کاربر دسترسی را اعطا میکند. هیچ عنصر UI نمایش داده نمیشود، هیچ callbackی فراخوانی نمیشود.
مکانیسم بررسی در سطح PackageManager کار میکند. هنگام نصب APK، سیستم تمام تگهای uses-permission را اسکن میکند، سطح حفاظت هر مجوز را از طریق تطبیق با تعاریف سیستمی در فایلهای permissions.xml تعیین میکند و برای normal-level به سادگی دسترسی را ثبت میکند. این فرآیند میلیثانیه طول میکشد و نیازی به تعامل با رابط کاربری ندارد.
الگوریتم اعطا به صورت زیر است:
کاربر نمیتواند مجوز عادی را از طریق رابط کاربری لغو کند. در تنظیمات برنامه در بخش مجوزها فقط مجوزهای خطرناک نمایش داده میشوند. این در تضاد با iOS است، جایی که هر مجوز صرفنظر از سطح حساسیت عملکرد نیاز به تأیید جداگانه دارد.
Normal و Dangerous Permission — دو دسته حفاظتی متضاد در Android. تفاوت اصلی در روش اعطا است: مجوزهای عادی هنگام نصب به طور خودکار داده میشوند، مجوزهای خطرناک نیاز به رضایت صریح از طریق دیالوگ runtime دارند. این تفاوت در معماری امنیتی Android از نسخه ۶.۰ Marshmallow تعبیه شده است.
مقایسه ویژگیهای کلیدی:
| ویژگی | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| درخواست از کاربر | نیاز نیست | دیالوگ runtime الزامی |
| امکان لغو | خیر، فقط حذف برنامه | بله، از طریق تنظیمات در هر لحظه |
| بررسی در کد | همیشه PERMISSION_GRANTED | checkSelfPermission الزامی |
| نمونهها | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
کاربر در درخواست Normal Permission هیچ دیالوگی نمیبیند. اگر برنامه به INTERNET نیاز دارد — آن را بیصدا دریافت میکند. برای Dangerous Permission سیستم یک دیالوگ مودال با توضیح دسترسی درخواستی نشان میدهد. کاربر دکمه Allow یا Deny را فشار میدهد و بعداً میتواند در هر لحظه از طریق Settings مجوز را لغو کند. این تفاوت اصلی UX است که استراتژی توسعه رابط را تعیین میکند.
Normal باید در تمام مواردی که دسترسی به دادههای حساس مربوط نیست استفاده شود. ACCESS_NETWORK_STATE برای بررسی اتصال، VIBRATE برای بازخورد لمسی، INTERNET برای درخواستهای HTTP — همه اینها مجوزهای عادی هستند. استفاده از سطح dangerous در جایی که normal کافی است، رویه بدی است که دیالوگهای اضافی ایجاد میکند و اعتماد کاربر به برنامه را کاهش میدهد.
Android تعریف میکند دهها مجوز عادی که هر کدام با یک تابع سیستمی خاص مطابقت دارند. همه آنها از طریق ثابتهای کلاس Manifest.permission قابل دسترسی هستند. در زیر فهرست پرکاربردترینها در توسعه برنامه آورده شده است.
| ثابت | دسترسی | توضیح |
|---|---|---|
| INTERNET | شبکه | باز کردن سوکتهای شبکه برای درخواستهای HTTP |
| ACCESS_NETWORK_STATE | شبکه | دریافت اطلاعات درباره وضعیت شبکه |
| ACCESS_WIFI_STATE | Wi-Fi | خواندن اطلاعات درباره اتصالات Wi-Fi |
| VIBRATE | لرزش | کنترل موتور لرزش دستگاه |
| BLUETOOTH | Bluetooth | اتصال به دستگاههای Bluetooth |
| WAKE_LOCK | تغذیه | جلوگیری از خواب رفتن پردازنده |
| SET_ALARM | زنگ هشدار | تنظیم زنگ هشدار از طریق AlarmManager |
| CHANGE_NETWORK_STATE | شبکه | تغییر وضعیت اتصال شبکه |
مجوزهای عادی برای اهداف نمایش در UI در Permission Group گروهبندی نمیشوند. گروهها در Android برای صفحه تنظیمات در نظر گرفته شدهاند، جایی که فقط مجوزهای خطرناک نمایش داده میشوند. با این حال، منطقاً میتوان مجوزهای عادی را به دستههایی تقسیم کرد: شبکه (INTERNET, ACCESS_NETWORK_STATE)، سختافزاری (VIBRATE, WAKE_LOCK)، سیستمی (SET_ALARM) و مجوزهای Bluetooth.
برخی ثابتهای Manifest.permission ممکن است سطح حفاظت را در نسخههای مختلف Android تغییر دهند. به عنوان مثال، BLUETOOTH_CONNECT در Android 12+ به یک مجوز خطرناک با درخواست runtime تبدیل شد، اگرچه در نسخههای قدیمیتر normal بود. به توسعهدهندگان توصیه میشود protectionLevel فعلی را برای API هدف از طریق مستندات بررسی کنند.
توسعهدهنده میتواند به صورت برنامهنویسی از طریق PackageManager بررسی کند که آیا مجوز عادی است یا خیر. متد getPermissionInfo یک PermissionInfo برمیگرداند که فیلد protectionLevel آن حاوی پرچم PermissionInfo.PROTECTION_NORMAL است. این برای پردازش پویا و اشکالزدایی مفید است.
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
اعلان Normal Permission در AndroidManifest.xml سادهترین عملیات است که یک تگ uses-permission نیاز دارد. پیکربندی اضافی protectionLevel لازم نیست، زیرا سطح حفاظت توسط تعریف سیستمی تعیین میشود، نه مانیفست برنامه. توسعهدهنده به سادگی نام کامل ثابت را مشخص میکند.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.VIBRATE" />
سیستم هنگام نصب تمام اعلامیهها را پردازش میکند. اگر حداقل یکی از مجوزهای مشخص شده دارای protectionLevel غیر از normal باشد، درخواست runtime لازم خواهد بود. INTERNET — محبوبترین مجوز عادی، موجود در اکثر برنامههای Android، به ویژه آنهایی که درخواستهای HTTP انجام میدهند یا محتوا را از شبکه بارگذاری میکنند.
مثال کامل AndroidManifest.xml با مجوزهای عادی و خطرناک تفاوت را نشان میدهد: از نظر نحوی تگهای uses-permission یکسان هستند، اما در مرحله اجرا INTERNET و VIBRATE به طور خودکار اعطا میشوند، در حالی که CAMERA نیاز به دیالوگ دارد.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.VIBRATE" />
<!-- Dangerous permission -->
<uses-permission
android:name="android.permission.CAMERA" />
</manifest>
هنگام استفاده از کتابخانهها — Google Play Services، Firebase، Glide — آنها میتوانند از طریق Manifest Merger uses-permission خود را به مانیفست نهایی اضافه کنند. برخی از آنها عادی هستند (INTERNET برای Firebase)، برخی دیگر خطرناک (ACCESS_FINE_LOCATION برای Google Maps). توسعهدهنده باید مانیفست ادغامشده نهایی را در build/outputs/logs/manifest-merger-report.txt قبل از انتشار بررسی کند.
Normal Permission دو محدودیت اساسی دارد: عدم امکان لغو توسط کاربر و عدم وجود UI برای مدیریت. اگر کاربر به برنامه اعتماد نداشته باشد، اما مجوز عادی قبلاً به طور خودکار صادر شده باشد — تنها راه خروج حذف برنامه است. این خطر خاصی ایجاد میکند، زیرا مجوزهای عادی با ابزارهای استاندارد Android مسدود نمیشوند.
محدودیت اضافی در دستگاههای با چندین پروفایل (Work Profile, Multiple Users) ظاهر میشود. Normal Permission بلافاصله برای همه پروفایلها اعطا میشود — برنامه نمیتواند مجوز را فقط به یکی محدود کند. در سناریوهای شرکتی، این از طریق Managed Configurations حل میشود.
نمیتوان بررسی کرد که آیا برنامه در حال حاضر از Normal Permission استفاده میکند یا خیر. متد سیستمی checkSelfPermission فقط برای مجوزهای خطرناک کار میکند. برای normal همیشه PERMISSION_GRANTED برمیگرداند که فعالیت واقعی را منعکس نمیکند. این را باید در ممیزی امنیتی و تحلیل رفتار برنامه در نظر گرفت.
همچنین لازم است به خاطر داشت که برخی تولیدکنندگان دستگاه (Xiaomi، Huawei، Samsung) رفتار استاندارد مجوزها را تغییر میدهند. در میانافزارهای آنها، Normal Permission ممکن است نیاز به مجوزهای اضافی در پوسته اختصاصی MIUI یا EMUI داشته باشد. به توسعهدهندگان توصیه میشود کار را روی دستگاههای واقعی فروشندگان مختلف آزمایش کنند.
سوالات متداول
Normal Permission هنگام نصب بدون دیالوگ به طور خودکار اعطا میشود. Dangerous نیاز به درخواست runtime با رضایت صریح کاربر دارد و میتواند از طریق تنظیمات لغو شود. Normal از ProtectionLevel normal استفاده میکند، Dangerous از protectionLevel dangerous.
خیر، برای مجوزهای عادی کافیست uses-permission را در AndroidManifest.xml اعلام کنید. کد برای درخواست لازم نیست — سیستم دسترسی را به طور خودکار اعطا میکند. این آنها را از مجوزهای خطرناک متمایز میکند که به ActivityCompat.requestPermissions نیاز دارند.
پراستفادهترینها: INTERNET (درخواستهای شبکه)، ACCESS_NETWORK_STATE (بررسی اتصال)، VIBRATE (بازخورد لمسی) و WAKE_LOCK (نگهداشتن پردازنده). تقریباً هر برنامه Android حداقل از INTERNET استفاده میکند.
خیر، Normal Permission را نمیتوان از طریق تنظیمات برنامه لغو کرد. تنها راه توقف دسترسی حذف برنامه است. این تفاوت کلیدی با مجوزهای خطرناک است که کاربر میتواند در هر لحظه آنها را خاموش کند.
از PackageManager.getPermissionInfo استفاده کنید، نام رشتهای مجوز را ارسال کنید. متد PermissionInfo با فیلد protectionLevel برمیگرداند. برای تعیین دسته با ثابتهای PermissionInfo.PROTECTION_NORMAL یا PROTECTION_DANGEROUS مقایسه کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید