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