در اندروید 6.0 و بالاتر، مدل مجوزهای برنامه اندروید به گونه ای طراحی شده است که مجوزها را برای کاربران قابل فهم تر، مفیدتر و ایمن تر کند. این مدل برنامههای Android را که به مجوزهای خطرناک نیاز دارند (به مجوزهای تحت تأثیر مراجعه کنید) از مدل مجوز زمان نصب به مدل مجوز زمان اجرا منتقل کرد:
- مجوزهای زمان نصب
( Android 5.1 و پایین تر ) کاربران هنگام نصب یا به روز رسانی برنامه ، مجوزهای خطرناکی را به یک برنامه اعطا می کنند. سازندگان دستگاه و شرکتهای مخابراتی میتوانند بدون اطلاع کاربر، برنامههایی را با مجوزهای قبلی نصب کنند.
- مجوزهای زمان اجرا
( اندروید 6.0 تا 9 ) کاربران هنگام اجرا شدن برنامه، مجوزهای خطرناکی را به یک برنامه اعطا می کنند. زمانی که مجوزها درخواست میشوند (مانند زمانی که برنامه راهاندازی میشود یا زمانی که کاربر به یک ویژگی خاص دسترسی پیدا میکند) به برنامه بستگی دارد، اما کاربر دسترسی برنامه را به گروههای مجوز خاصی اعطا یا رد میکند. OEM/شرکتهای مخابراتی میتوانند برنامهها را از قبل نصب کنند، اما نمیتوانند مجوزها را از قبل صادر کنند، مگر اینکه مراحل استثنا را طی کنند. ( به ایجاد استثناها مراجعه کنید.)
( اندروید 10 ) کاربران شاهد افزایش شفافیت هستند و کنترل دارند که کدام برنامه ها دارای مجوزهای زمان اجرا تشخیص فعالیت (AR) هستند. در گفتگوی مجوزهای زمان اجرا از کاربران خواسته می شود که همیشه اجازه دهند، در حین استفاده اجازه دهند، یا مجوزها را رد کنند. در ارتقاء سیستم عامل به اندروید 10، مجوزهای داده شده به برنامه ها حفظ می شود، اما کاربران می توانند به تنظیمات رفته و آنها را تغییر دهند.
مجوزهای زمان اجرا از دسترسی برنامهها به دادههای خصوصی بدون رضایت کاربر جلوگیری میکند و زمینه و دید بیشتری را در مورد انواع مجوزهایی که برنامهها به دنبال آن هستند یا به آنها اعطا شده است، در اختیار آنها قرار میدهد. مدل زمان اجرا توسعه دهندگان را تشویق می کند تا به کاربران کمک کنند تا بفهمند چرا برنامه ها به مجوزهای درخواستی نیاز دارند و شفافیت بیشتری را ارائه می دهد تا کاربران بتوانند تصمیمات بهتری در مورد اعطای یا رد آنها بگیرند.
مجوزهای تحت تأثیر
Android 6.0 و بالاتر برای استفاده از مدل مجوزهای زمان اجرا به مجوزهای خطرناک نیاز دارد. مجوزهای خطرناک مجوزهای پرخطری هستند (مانند READ_CALENDAR
) که به برنامههای درخواستکننده اجازه دسترسی به دادههای کاربر خصوصی یا کنترل یک دستگاه را میدهند که میتواند بر کاربر تأثیر منفی بگذارد. برای مشاهده لیستی از مجوزهای خطرناک، دستور زیر را اجرا کنید:
adb shell pm list permissions -g -d
Android 6.0 و بالاتر رفتار مجوزهای عادی را تغییر نمیدهد. اینها همه مجوزهای غیر خطرناک از جمله مجوزهای عادی، سیستمی و امضا هستند. مجوزهای معمولی مجوزهای کم خطر (مانند SET_WALLPAPER
) هستند که به برنامههای درخواستکننده دسترسی به ویژگیهای سطح برنامه جدا شده با حداقل خطر برای سایر برنامهها، سیستم یا کاربر را میدهند. همانند نسخههای اندروید 5.1 و نسخههای پایینتر، سیستم به طور خودکار مجوزهای عادی را به برنامه درخواستکننده در هنگام نصب میدهد و کاربر را برای تأیید درخواست نمیکند. برای جزئیات بیشتر در مورد مجوزها، به مستندات عنصر <permission> مراجعه کنید.
محدودیت های سخت و نرم در اندروید 10
یک مجوز علاوه بر خطرناک بودن، می تواند با محدودیت سخت یا محدود باشد. در هر صورت، مجوز محدود نیز باید در لیست مجاز باشد. محدودیت های سخت غیر مجاز رفتار متفاوتی با محدودیت های نرم غیر مجاز دارند:
- ( محدودیتهای سخت ) نمیتوان به برنامههایی که در لیست مجاز نیستند مجوزهایی اعطا کرد.
- ( محدودیتهای نرم ) برنامههای بدون فهرست مجاز طبق مجوز خاصی که درخواست میکنند رفتار میکنند. این رفتار در اسناد عمومی برای مجوز درخواست شده توضیح داده شده است.
هنگام نصب یک برنامه، نصب کننده (مانند فروشگاه Google Play) ممکن است اجازه دهد مجوزهای محدود شده برای برنامه را لیست نکند. مجوزها توسط پلتفرم محدود شده است و تنها در صورتی قابل اعطا هستند که یک برنامه معیارهای خاصی را برای هر خط مشی پلت فرم داشته باشد. نمونه هایی از انواع مجوزهای محدود شده عبارتند از مجوزهای SMS و Call Log.
Allowlisting در حین نصب و زمان انجام می شود
- یک برنامه قبلاً در حین ارتقاء اندروید 9 به 10 نصب شده است.
- یک مجوز از قبل صادر شده است یا یک برنامه از قبل نصب شده است.
- برای نقشی که قبلاً برای لیست مجوزها تعریف شده است، مجوز لازم است.
- نصب کننده (مانند فروشگاه Google Play) مجوز را به عنوان لیست مجاز علامت گذاری می کند.
کاربران نمی توانند به صورت دستی مجوزها را در لیست مجاز قرار دهند.
الزامات
مدل مجوز زمان اجرا برای همه برنامهها، از جمله برنامههای از پیش نصبشده و برنامههایی که به عنوان بخشی از فرآیند راهاندازی به دستگاه تحویل داده میشوند، اعمال میشود. الزامات نرم افزار برنامه عبارتند از:
- مدل مجوز زمان اجرا باید در همه دستگاههای دارای Android نسخه 6.0 و بالاتر سازگار باشد. این توسط تستهای مجموعه تست سازگاری Android (CTS) اعمال میشود.
- برنامه ها باید از کاربران بخواهند که مجوزهای برنامه را در زمان اجرا اعطا کنند. برای جزئیات، به بهروزرسانی برنامهها را ببینید. ممکن است استثنائات محدودی به برنامهها و کنترلکنندههای پیشفرض داده شود که عملکرد اصلی دستگاه را برای عملکرد مورد انتظار دستگاه ارائه میکنند. (به عنوان مثال، برنامه شمارهگیر پیشفرض دستگاه برای مدیریت
ACTION_CALL
ممکن است به مجوز تلفن دسترسی داشته باشد.) برای جزئیات، به ایجاد استثناها مراجعه کنید. - برنامه های از پیش بارگذاری شده که مجوزهای خطرناکی دارند باید سطح API 23 را هدف قرار دهند و مدل مجوز زمان اجرا را حفظ کنند. یعنی جریان UI در حین نصب برنامه نباید از اجرای AOSP PermissionController منحرف شود، کاربران می توانند مجوزهای خطرناک برنامه های از پیش نصب شده را لغو کنند و غیره.
- برنامههای بدون سر باید از یک فعالیت برای درخواست مجوز یا اشتراکگذاری یک UID با برنامه دیگری که مجوزهای لازم را دارد استفاده کنند. برای جزئیات، به برنامههای بدون سر مراجعه کنید.
مهاجرت مجوزها
مجوزهای اعطا شده به برنامهها در Android 5.x پس از بهروزرسانی به Android 6.0 یا بالاتر همچنان اعطا میشوند، اما کاربران میتوانند هر زمان که بخواهند این مجوزها را لغو کنند.
در بهروزرسانی اندروید ۹ به ۱۰، همه مجوزهای محدود شده در لیست مجاز قرار میگیرند. برای جزئیات در مورد اجرای مجوزهای تقسیم پیشزمینه/پسزمینه، تغییر حریم خصوصی Android 10 را ببینید که با درخواست موقعیت پسزمینه شروع میشود.
یکپارچه سازی
هنگام ادغام مدل مجوزهای زمان اجرای برنامه برای اندروید 6.0 و بالاتر، باید برنامه های از پیش نصب شده را برای کار با مدل جدید به روز کنید. همچنین میتوانید برای برنامههایی که کنترلکننده/ارائهدهنده پیشفرض عملکرد اصلی هستند، استثناهایی تعریف کنید، مجوزهای سفارشی را تعریف کنید، و تم مورد استفاده در برنامه PermissionController
را سفارشی کنید.
به روز رسانی برنامه ها
برنامههای روی تصویر سیستم و برنامههای از پیش نصبشده بهطور خودکار مجوزهای از قبل اعطا شده نیستند. ما شما را تشویق می کنیم که با توسعه دهندگان برنامه از پیش نصب شده (OEM، شرکت مخابراتی و شخص ثالث) کار کنید تا تغییرات مورد نیاز برنامه را با استفاده از دستورالعمل های برنامه نویس انجام دهید. به طور خاص، باید اطمینان حاصل کنید که برنامههای از پیش نصبشده برای جلوگیری از خرابیها و سایر مشکلات زمانی که کاربران مجوزها را لغو میکنند، اصلاح شوند.
برنامه های از پیش بارگذاری شده
در Android 9 و پایینتر، برنامههای از پیش بارگذاریشده که از مجوزهای خطرناک استفاده میکنند باید سطح API 23 یا بالاتر را هدف قرار دهند و مدل مجوز AOSP Android نسخه 6.0 و بالاتر را حفظ کنند. برای مثال، جریان UI در طول نصب برنامه نباید از اجرای AOSP PermissionController
منحرف شود. کاربران حتی می توانند مجوزهای خطرناک برنامه های از پیش نصب شده را لغو کنند.
در اندروید 6.0 تا 9، برخی از مجوزها در جریان نصب اعطا می شوند. با این حال، از 10 شروع می شود، جریان نصب (که توسط برنامه Package Installer
انجام می شود) یک تابع مجزا از اعطای مجوزها (در برنامه Permission Controller
) است.
برنامه های بدون سر
فقط فعالیتها میتوانند مجوز درخواست کنند. سرویسها نمیتوانند مستقیماً مجوز درخواست کنند.
- در اندروید 5.1 و نسخههای قبلی، برنامههای هدلس میتوانند هنگام نصب یا اگر از قبل بدون استفاده از فعالیتی نصب شده باشند، مجوز درخواست کنند.
- در اندروید 6.0 و بالاتر، برنامههای بدون هد باید از یکی از روشهای زیر برای درخواست مجوز استفاده کنند:
- یک فعالیت برای درخواست مجوز اضافه کنید. (این روش ترجیحی است.)
- یک UID را با برنامه دیگری که مجوزهای لازم را دارد به اشتراک بگذارید. از این روش فقط زمانی استفاده کنید که به پلتفرم نیاز دارید تا چندین APK را به عنوان یک برنامه مدیریت کنید.
هدف جلوگیری از سردرگمی کاربران با درخواستهای مجوزی است که خارج از زمینه ظاهر میشوند.
رابط کاربری PackageInstaller را سفارشی کنید
در صورت تمایل، میتوانید با بهروزرسانی تمهای پیشفرض دستگاه ( Theme.DeviceDefault.Settings
و Theme.DeviceDefault.Light.Dialog.NoActionBar
) که توسط PackageInstaller استفاده میشود، طرح زمینه Permissions UI را سفارشی کنید. با این حال، از آنجایی که سازگاری برای توسعه دهندگان برنامه بسیار مهم است، نمی توانید مکان، موقعیت و قوانین مربوط به زمانی که رابط کاربری Permissions ظاهر می شود را سفارشی کنید.
برای گنجاندن رشتهها برای زبانهای دیگر، رشتهها را به AOSP اضافه کنید.
استثنا ایجاد کنید
میتوانید با استفاده از کلاس DefaultPermissionGrantPolicy.java
در PackageManager به برنامههایی که کنترلکننده یا ارائهدهنده پیشفرض عملکرد سیستمعامل اصلی هستند، از قبل مجوز اعطا کنید. مثال ها:
ACTION_CALL (Dialer) Default Phone, Contacts, SMS, Microphone
SMS_DELIVER_ACTION (SMS/MMS) Default Phone, Contacts, SMS
مجوزهای سفارشی را تعریف کنید
میتوانید مجوزها و گروههای سفارشی را بهعنوان عادی یا خطرناک تعریف کنید و مجوزهای OEM/Carrier خاص را به گروههای مجوزهای موجود اضافه کنید، همانطور که در Android 5.x و نسخههای قبلی میتوانید انجام دهید.
در Android نسخه 6.0 و بالاتر، اگر مجوز خطرناک جدیدی اضافه کنید، باید مانند سایر مجوزهای خطرناک (در زمان اجرای برنامه درخواست شده و توسط کاربران قابل لغو باشد) با آن رفتار شود. به طور مشخص:
- میتوانید مجوزهای جدیدی را به گروه فعلی اضافه کنید، اما نمیتوانید نقشه AOSP مجوزهای خطرناک و گروههای مجوز خطرناک را تغییر دهید. (به عبارت دیگر، شما نمی توانید یک مجوز را از یک گروه حذف کنید و به گروه دیگری اختصاص دهید).
- میتوانید گروههای مجوز جدیدی را در برنامههای نصب شده روی دستگاه اضافه کنید، اما نمیتوانید گروههای مجوز جدید را در مانیفست پلتفرم اضافه کنید.
مجوزهای تست
Android شامل تستهای Compatibility Test Suite (CTS) است که تأیید میکند مجوزهای فردی به گروههای صحیح نگاشت شدهاند. گذراندن این تست ها برای سازگاری با Android 6.0 و جدیدتر CTS الزامی است.
لغو مجوزها
در اندروید 13 و نسخههای جدیدتر، میتوانید مجوزهای زمان اجرا اعطایی خود را با استفاده از Context.revokeSelfPermissionsOnKill()
لغو کنید. لغو به صورت ناهمزمان اتفاق میافتد و زمانی فعال میشود که انجام آن بدون ایجاد اختلال در کاربر ایمن باشد. هنگامی که ابطال فعال می شود، تمام فرآیندهای در حال اجرا در UID فراخوانی از بین می روند.
درک این نکته مهم است که لغو یک مجوز ممکن است در رابط کاربری تنظیمات، که مجوزها را براساس گروه بررسی میکند، منعکس نشود. به طور معمول، یک گروه مجوز تا زمانی که حداقل یکی از مجوزهای آن گروه اعطا شده باشد، به عنوان اعطا شده نمایش داده می شود. اگر اطمینان از اینکه کاربران قادر به تایید لغو در تنظیمات هستند برای شما مهم است، مطمئن شوید که همه مجوزها را در گروه مجوز لغو کرده اید. برای اینکه بدانید کدام مجوزها به یک گروه خاص تعلق دارند، می توانید از PackageManager.getGroupOfPlatformPermission
و PackageManager.getPlatformPermissionsForGroup
استفاده کنید.
هنگامی که سیستم مجوزهای درخواست شده را لغو می کند، در صورتی که هیچ یک از مجوزهای پیش زمینه مربوطه هنوز اعطا نشده باشد، مجوزهای پس زمینه مربوطه را نیز لغو می کند.
تا زمانی که فرآیند در پیشزمینه باقی بماند، لغو راهاندازی نمیشود، اما میتواند بلافاصله با کشتن دستی تمام فرآیندهای در حال اجرا در uid فعلی، به عنوان مثال با استفاده از System.exit()
فعال شود. با این حال توصیه می شود به سیستم اجازه دهید تصمیم بگیرد که چه زمانی آن را راه اندازی کند.
پس از اعمال لغو مجوز، میتوانید دوباره آن را درخواست کنید و از کاربر خواسته میشود که درخواست را رد یا قبول کند. امکان درخواست مجوزی که قبلاً توسط کاربر رد شده است وجود ندارد. در حالی که تشویق میشوید مجوزهایی را که در حال حاضر دارید اما دیگر نیازی به آن ندارید، لغو کنید، باید مراقب باشید تا زمانی که ابطال نشده است به کاربر اطلاع ندهید.