تغییرات رفتار: برنامه هایی که اندروید 16 یا بالاتر را هدف قرار می دهند

مانند نسخه‌های قبلی، اندروید ۱۶ شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات رفتاری زیر منحصراً برای برنامه‌هایی اعمال می‌شود که اندروید ۱۶ یا بالاتر را هدف قرار می‌دهند. اگر برنامه شما اندروید ۱۶ یا بالاتر را هدف قرار می‌دهد، باید برنامه خود را برای پشتیبانی از این رفتارها، در صورت لزوم، اصلاح کنید.

حتماً فهرست تغییرات رفتاری که صرف نظر از targetSdkVersion برنامه شما، بر همه برنامه‌های در حال اجرا در اندروید ۱۶ تأثیر می‌گذارند را نیز بررسی کنید.

تجربه کاربری و رابط کاربری سیستم

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات زیر است که برای ایجاد یک تجربه کاربری سازگارتر و شهودی‌تر در نظر گرفته شده‌اند.

کنار رفتن گزینه انصراف از لبه تا لبه

اندروید ۱۵ برای برنامه‌هایی که اندروید ۱۵ (سطح API ۳۵) را هدف قرار می‌دهند، پشتیبانی از لبه به لبه را اجباری کرده است ، اما برنامه شما می‌تواند با تنظیم R.attr#windowOptOutEdgeToEdgeEnforcement روی true ، از این قابلیت انصراف دهد. برای برنامه‌هایی که اندروید ۱۶ (سطح API ۳۶) را هدف قرار می‌دهند، R.attr#windowOptOutEdgeToEdgeEnforcement منسوخ و غیرفعال شده است و برنامه شما نمی‌تواند از پشتیبانی از لبه به لبه انصراف دهد.

  • اگر برنامه شما اندروید ۱۶ (سطح API ۳۶) را هدف قرار داده و روی دستگاهی با اندروید ۱۵ اجرا می‌شود، R.attr#windowOptOutEdgeToEdgeEnforcement به کار خود ادامه می‌دهد.
  • اگر برنامه شما اندروید ۱۶ (سطح API ۳۶) را هدف قرار داده و روی دستگاهی با اندروید ۱۶ اجرا می‌شود، R.attr#windowOptOutEdgeToEdgeEnforcement غیرفعال است.

برای آزمایش در اندروید ۱۶، مطمئن شوید که برنامه شما از لبه به لبه پشتیبانی می‌کند و هرگونه استفاده از R.attr#windowOptOutEdgeToEdgeEnforcement را حذف کنید تا برنامه شما از لبه به لبه در دستگاه اندروید ۱۵ نیز پشتیبانی کند. برای پشتیبانی از لبه به لبه، به راهنمای نوشتن و نمایش‌ها مراجعه کنید.

مهاجرت یا انصراف برای بازگشت پیش‌بینی‌کننده الزامی است

对于以 Android 16(API 级别 36)或更高版本为目标平台且在 Android 16 或更高版本的设备上运行的应用,预测性返回系统动画(返回主屏幕、跨任务和跨 activity)默认处于启用状态。此外,系统不再调用 onBackPressed,也不再调度 KeyEvent.KEYCODE_BACK

如果您的应用会拦截返回事件,但您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API,或者通过在应用的 AndroidManifest.xml 文件的 <application><activity> 标记中将 android:enableOnBackInvokedCallback 属性设置为 false 来暂时选择停用。

“返回主页”预测性返回动画。
预测性跨 activity 动画。
预测性跨任务动画。

APIهای فونت Elegant منسوخ و غیرفعال شدند

برنامه‌هایی که Android 15 را هدف قرار می‌دهند (سطح API 35) دارای ویژگی elegantTextHeight TextView به‌طور پیش‌فرض روی true تنظیم شده‌اند و فونت فشرده را با فونتی که بسیار خواناتر است جایگزین می‌کند. می‌توانید با تنظیم ویژگی elegantTextHeight روی false این مورد را لغو کنید.

Android 16 ویژگی elegantTextHeight را منسوخ می‌کند، و زمانی که برنامه شما Android 16 را هدف قرار دهد، این ویژگی نادیده گرفته می‌شود. «فونت‌های UI» که توسط این APIها کنترل می‌شوند، متوقف می‌شوند، بنابراین باید هر گونه طرح‌بندی را برای اطمینان از ارائه متن ثابت و ثابت در آینده به زبان‌های عربی، لائوس، میانمار، تامیل، گجراتی، مالزی، تایلندی، تله‌آلو، کانا تطبیق دهید.

رفتار elegantTextHeight برای برنامه‌هایی که Android 14 (سطح API 34) و پایین‌تر را هدف قرار می‌دهند، یا برای برنامه‌هایی که Android 15 را هدف قرار می‌دهند (سطح API 35) که با تنظیم ویژگی elegantTextHeight روی false ، پیش‌فرض را لغو می‌کنند.
رفتار elegantTextHeight برای برنامه‌هایی که Android 16 را هدف قرار می‌دهند (سطح API 36)، یا برای برنامه‌هایی که Android 15 را هدف قرار می‌دهند (سطح API 35) که با تنظیم ویژگی elegantTextHeight روی false ، پیش‌فرض را لغو نکرده‌اند.

عملکرد اصلی

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات زیر است که قابلیت‌های اصلی مختلف سیستم اندروید را اصلاح یا گسترش می‌دهد.

بهینه‌سازی زمان‌بندی کار با نرخ ثابت

قبل از هدف قرار دادن اندروید 16، زمانی که scheduleAtFixedRate اجرای یک کار را به دلیل خارج از چرخه حیات فرآیند معتبر از دست داد، همه اجراهای از دست رفته بلافاصله با بازگشت برنامه به چرخه حیات معتبر اجرا می شوند.

هنگام هدف قرار دادن Android 16، حداکثر یک اجرای از دست رفته scheduleAtFixedRate بلافاصله پس از بازگشت برنامه به چرخه حیات معتبر اجرا می شود. انتظار می رود این تغییر رفتار باعث بهبود عملکرد برنامه شود. این رفتار را در برنامه خود آزمایش کنید تا بررسی کنید آیا برنامه شما تحت تأثیر قرار گرفته است یا خیر. همچنین می‌توانید با استفاده از چارچوب سازگاری برنامه و فعال کردن پرچم سازگار STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS آزمایش کنید.

فاکتورهای شکل دستگاه

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات زیر برای برنامه‌ها هنگام نمایش در دستگاه‌های صفحه نمایش بزرگ است.

طرح‌بندی‌های تطبیقی

با توجه به اینکه برنامه‌های اندروید اکنون روی دستگاه‌های متنوعی (مانند تلفن، تبلت، دستگاه‌های تاشو، کامپیوترهای رومیزی، ماشین و تلویزیون) اجرا می‌شوند و حالت‌های پنجره‌ای روی صفحه نمایش‌های بزرگ (مانند تقسیم صفحه و پنجره‌ای کردن دسکتاپ)، توسعه‌دهندگان باید برنامه‌های اندرویدی بسازند که صرف نظر از جهت‌گیری دستگاه، با هر صفحه و اندازه پنجره‌ای سازگار شوند. الگوهایی مانند محدود کردن جهت‌گیری و قابلیت تغییر اندازه در دنیای چنددستگاهی امروز بسیار محدودکننده هستند.

محدودیت‌های جهت‌گیری، تغییر اندازه و نسبت ابعاد را نادیده بگیرید

برای برنامه‌هایی که اندروید ۱۶ (سطح API ۳۶) را هدف قرار می‌دهند، محدودیت‌های جهت‌گیری، تغییر اندازه و نسبت ابعاد دیگر در نمایشگرهایی با کوچکترین عرض >= ۶۰۰dp اعمال نمی‌شوند. برنامه‌ها کل پنجره نمایشگر را صرف نظر از نسبت ابعاد یا جهت‌گیری ترجیحی کاربر پر می‌کنند و از ستون‌بندی استفاده نمی‌شود.

این تغییر، یک رفتار استاندارد جدید برای پلتفرم معرفی می‌کند. اندروید به سمت مدلی حرکت می‌کند که در آن انتظار می‌رود برنامه‌ها با جهت‌گیری‌ها، اندازه‌های نمایشگر و نسبت‌های ابعاد مختلف سازگار شوند. محدودیت‌هایی مانند جهت‌گیری ثابت یا قابلیت تغییر اندازه محدود، مانع از سازگاری برنامه می‌شود. برنامه خود را سازگار کنید تا بهترین تجربه کاربری ممکن را ارائه دهید.

همچنین می‌توانید این رفتار را با استفاده از چارچوب سازگاری برنامه و فعال کردن پرچم UNIVERSAL_RESIZABLE_BY_DEFAULT compat آزمایش کنید.

تغییرات رایج در شکستن قفل

نادیده گرفتن محدودیت‌های جهت‌گیری، تغییر اندازه و نسبت ابعاد ممکن است بر رابط کاربری برنامه شما در برخی دستگاه‌ها تأثیر بگذارد، به خصوص عناصری که برای طرح‌بندی‌های کوچک قفل‌شده در جهت عمودی طراحی شده‌اند: برای مثال، مسائلی مانند طرح‌بندی‌های کشیده و انیمیشن‌ها و اجزای خارج از صفحه. هرگونه فرض در مورد نسبت ابعاد یا جهت‌گیری می‌تواند باعث مشکلات بصری در برنامه شما شود. درباره نحوه اجتناب از آنها و بهبود رفتار تطبیقی ​​برنامه خود بیشتر بیاموزید .

فعال کردن چرخش دستگاه منجر به ایجاد مجدد فعالیت‌ها می‌شود که در صورت عدم حفظ صحیح، می‌تواند منجر به از دست رفتن وضعیت کاربر شود. نحوه ذخیره صحیح وضعیت رابط کاربری را در بخش «ذخیره وضعیت‌های رابط کاربری» بیاموزید.

جزئیات پیاده‌سازی

ویژگی‌های مانیفست و APIهای زمان اجرا زیر در دستگاه‌های با صفحه نمایش بزرگ، در حالت‌های تمام صفحه و چند پنجره‌ای نادیده گرفته می‌شوند:

مقادیر زیر برای screenOrientation ، setRequestedOrientation() و getRequestedOrientation() نادیده گرفته می‌شوند:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

در مورد قابلیت تغییر اندازه صفحه نمایش، android:resizeableActivity="false" ، android:minAspectRatio و android:maxAspectRatio هیچ تاثیری ندارند.

برای برنامه‌هایی که اندروید ۱۶ (سطح API ۳۶) را هدف قرار می‌دهند، محدودیت‌های جهت‌گیری برنامه، قابلیت تغییر اندازه و نسبت ابعاد به طور پیش‌فرض در صفحه نمایش‌های بزرگ نادیده گرفته می‌شوند. هر برنامه‌ای که کاملاً آماده نباشد، می‌تواند با انصراف، این رفتار را به طور موقت لغو کند، که منجر به رفتار قبلی قرار گرفتن در حالت سازگاری می‌شود.

استثنائات

محدودیت‌های جهت‌گیری، تغییر اندازه و نسبت تصویر اندروید ۱۶ در شرایط زیر اعمال نمی‌شوند:

  • بازی‌ها (بر اساس پرچم android:appCategory )
  • کاربرانی که صریحاً رفتار پیش‌فرض برنامه را در تنظیمات نسبت ابعاد دستگاه انتخاب می‌کنند
  • صفحه نمایش‌هایی که کوچکتر از sw600dp هستند

انصراف موقت

برای غیرفعال کردن یک فعالیت خاص، ویژگی manifest مربوط به PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY را اعلان کنید:

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

اگر بخش‌های زیادی از برنامه شما برای اندروید ۱۶ آماده نیستند، می‌توانید با اعمال همین ویژگی در سطح برنامه، به‌طور کامل از آن صرف‌نظر کنید:

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

سلامت و تناسب اندام

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات زیر در رابطه با داده‌های سلامت و تناسب اندام است.

مجوزهای سلامت و تناسب اندام

对于以 Android 16(API 级别 36)或更高版本为目标平台的应用, BODY_SENSORS 权限使用更精细的权限 under android.permissions.health,which Health Connect also uses。从 Android 16 开始,凡是以前需要具有 BODY_SENSORSBODY_SENSORS_BACKGROUND 权限的 API,现在都需要获取相应的 android.permissions.health 权限。这会影响以下数据类型、API 和前台服务类型:

如果您的应用使用这些 API,则应请求相应的精细权限:

这些权限与保护对 Health Connect(用于存储健康、 健身和保健数据的 Android 数据存储区)中数据的读取访问权限的权限相同。

移动应用

迁移为使用 READ_HEART_RATE 和其他精细权限的移动应用还必须 声明一项 activity 以显示应用的隐私权政策。这与健康数据共享的要求相同。

اتصال

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات زیر در پشته بلوتوث برای بهبود اتصال با دستگاه‌های جانبی است.

اهداف جدید برای مدیریت از دست دادن اوراق قرضه و تغییرات رمزگذاری

به عنوان بخشی از بهبود مدیریت از دست دادن اوراق قرضه ، اندروید 16 همچنین 2 هدف جدید را معرفی می کند تا برنامه ها را با آگاهی بیشتر از از دست دادن اوراق قرضه و تغییرات رمزگذاری ارائه کند.

برنامه هایی که اندروید 16 را هدف قرار می دهند اکنون می توانند:

  • هنگامی که از دست دادن اوراق قرضه از راه دور شناسایی شد، یک هدف ACTION_KEY_MISSING دریافت کنید، که به آنها امکان می دهد بازخورد آموزنده تری از کاربر ارائه دهند و اقدامات مناسب را انجام دهند.
  • هر زمان که وضعیت رمزگذاری پیوند تغییر کرد، یک هدف ACTION_ENCRYPTION_CHANGE دریافت کنید. این شامل تغییر وضعیت رمزگذاری، تغییر الگوریتم رمزگذاری و تغییر اندازه کلید رمزگذاری است. اگر بعداً پس از دریافت هدف ACTION_ENCRYPTION_CHANGE پیوند با موفقیت رمزگذاری شد، برنامه‌ها باید پیوند را بازیابی شده در نظر بگیرند.

انطباق با پیاده سازی های مختلف OEM

در حالی که اندروید 16 این اهداف جدید را معرفی می‌کند، پیاده‌سازی و پخش آن‌ها می‌تواند در تولیدکنندگان مختلف دستگاه (OEM) متفاوت باشد. برای اطمینان از اینکه برنامه شما یک تجربه ثابت و قابل اعتماد را در همه دستگاه‌ها ارائه می‌کند، توسعه‌دهندگان باید مدیریت تلفات اوراق قرضه خود را طوری طراحی کنند که به‌خوبی با این تغییرات بالقوه سازگار شوند.

ما رفتارهای برنامه زیر را توصیه می کنیم:

  • اگر هدف ACTION_KEY_MISSING پخش شود:

    پیوند ACL (اتصال ناهمگام-کمتر) توسط سیستم قطع خواهد شد، اما اطلاعات پیوند دستگاه حفظ خواهد شد (همانطور که در اینجا توضیح داده شده است).

    برنامه شما باید از این هدف به‌عنوان سیگنال اصلی برای تشخیص از دست دادن اوراق قرضه استفاده کند و کاربر را راهنمایی کند تا قبل از شروع فراموشی یا جفت‌سازی مجدد دستگاه تأیید کند که دستگاه راه دور در محدوده است.

    اگر دستگاهی پس از دریافت ACTION_KEY_MISSING قطع شود، برنامه شما باید در مورد اتصال مجدد محتاط باشد، زیرا ممکن است دستگاه دیگر به سیستم متصل نباشد.

  • اگر هدف ACTION_KEY_MISSING پخش نشد:

    پیوند ACL متصل باقی می‌ماند، و اطلاعات پیوند دستگاه توسط سیستم حذف می‌شود، مانند رفتار در Android 15.

    در این سناریو، برنامه شما باید به مکانیسم‌های مدیریت از دست دادن اوراق قرضه موجود خود مانند نسخه‌های قبلی اندروید ادامه دهد تا رویدادهای از دست دادن اوراق قرضه را شناسایی و مدیریت کند.

روش جدید برای حذف اتصال بلوتوث

همه برنامه‌هایی که اندروید 16 را هدف قرار می‌دهند، اکنون می‌توانند با استفاده از یک API عمومی در CompanionDeviceManager ، دستگاه‌های بلوتوث را لغو جفت کنند. اگر یک دستگاه همراه به عنوان یک انجمن CDM مدیریت می‌شود، برنامه می‌تواند با استفاده از API جدید removeBond(int) در دستگاه مرتبط، حذف پیوند بلوتوث را آغاز کند. این برنامه می‌تواند با گوش دادن به رویداد پخش دستگاه بلوتوث ACTION_BOND_STATE_CHANGED تغییرات وضعیت پیوند را کنترل کند.

امنیت

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات امنیتی زیر است.

قفل شدن نسخه MediaStore

برای برنامه‌هایی که اندروید 16 یا بالاتر را هدف قرار می‌دهند، MediaStore#getVersion() اکنون برای هر برنامه منحصر به فرد خواهد بود. این ویژگی های شناسایی را از رشته نسخه حذف می کند تا از سوء استفاده و استفاده از تکنیک های انگشت نگاری جلوگیری شود. برنامه ها نباید هیچ فرضی در مورد قالب این نسخه داشته باشند. برنامه‌ها از قبل باید هنگام استفاده از این API تغییرات نسخه را کنترل کنند و در بیشتر موارد نیازی به تغییر رفتار فعلی خود ندارند، مگر اینکه توسعه‌دهنده تلاش کرده باشد اطلاعات بیشتری را استنباط کند که فراتر از محدوده مورد نظر این API است.

مقاصد امن‌تر

ویژگی Safer Intents یک ابتکار امنیتی چند مرحله‌ای است که برای بهبود امنیت مکانیسم تشخیص هدف اندروید طراحی شده است. هدف، محافظت از برنامه‌ها در برابر اقدامات مخرب با افزودن بررسی‌ها در طول پردازش هدف و فیلتر کردن اهدافی است که معیارهای خاصی را برآورده نمی‌کنند.

در اندروید ۱۵ این ویژگی بر روی برنامه فرستنده متمرکز بود. اکنون با اندروید ۱۶، کنترل به برنامه گیرنده منتقل می‌شود و به توسعه‌دهندگان اجازه می‌دهد تا با استفاده از مانیفست برنامه خود، وضوح دقیق هدف را انتخاب کنند.

دو تغییر اساسی در حال اجرا هستند:

  1. اهداف صریح باید با فیلتر هدف کامپوننت هدف مطابقت داشته باشند: اگر یک هدف به صراحت یک کامپوننت را هدف قرار دهد، باید با فیلتر هدف آن کامپوننت مطابقت داشته باشد.

  2. اینتنت‌های بدون اکشن نمی‌توانند با هیچ فیلتر اینتنتی مطابقت داشته باشند: اینتنت‌هایی که اکشن مشخصی ندارند، نباید با هیچ فیلتر اینتنتی تطبیق داده شوند.

این تغییرات فقط زمانی اعمال می‌شوند که چندین برنامه درگیر باشند و بر مدیریت قصد (intent handling) در یک برنامه واحد تأثیری ندارند.

تأثیر

ماهیت اختیاری آن به این معنی است که توسعه‌دهندگان باید آن را به صراحت در مانیفست برنامه خود فعال کنند تا فعال شود. در نتیجه، تأثیر این ویژگی محدود به برنامه‌هایی خواهد بود که توسعه‌دهندگان آنها:

  • از ویژگی Safer Intents و مزایای آن آگاه هستند.
  • فعالانه تصمیم می‌گیرند که شیوه‌های سختگیرانه‌تری را برای مدیریت قصد (intent handling) در برنامه‌های خود بگنجانند.

این رویکرد انتخابی، خطر از کار افتادن برنامه‌های موجود را که ممکن است به رفتار فعلیِ با امنیت کمتر برای حل اینتنت متکی باشند، به حداقل می‌رساند.

اگرچه ممکن است تأثیر اولیه در اندروید ۱۶ محدود باشد، اما ابتکار Safer Intents نقشه راهی برای تأثیر گسترده‌تر در نسخه‌های آینده اندروید دارد. این طرح در نهایت به این صورت است که تفکیک‌پذیری دقیق intent به رفتار پیش‌فرض تبدیل شود.

ویژگی Safer Intents این پتانسیل را دارد که با دشوارتر کردن سوءاستفاده از آسیب‌پذیری‌ها در مکانیسم تشخیص هدف (intent resolution)، امنیت اکوسیستم اندروید را به میزان قابل توجهی افزایش دهد.

با این حال، گذار به انصراف و اجرای اجباری باید با دقت مدیریت شود تا مشکلات سازگاری بالقوه با برنامه‌های موجود برطرف شود.

پیاده‌سازی

توسعه‌دهندگان باید با استفاده از ویژگی intentMatchingFlags در مانیفست برنامه خود، تطبیق دقیق‌تر اینتنت را به صراحت فعال کنند. در اینجا مثالی آورده شده است که در آن این ویژگی برای کل برنامه فعال است، اما در یک گیرنده غیرفعال/غیرفعال است:

<application android:intentMatchingFlags="enforceIntentFilter">
    <receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
        <intent-filter>
            <action android:name="com.example.MY_CUSTOM_ACTION" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
        </intent-filter>
    </receiver>
</application>

اطلاعات بیشتر در مورد پرچم‌های پشتیبانی‌شده:

نام پرچم توضیحات
فیلتر intent را اعمال کنید تطبیق دقیق‌تری را برای اهداف ورودی اعمال می‌کند
هیچ کدام تمام قوانین تطبیق ویژه را برای ورودی‌های ورودی غیرفعال می‌کند. هنگام تعیین چندین پرچم، مقادیر متناقض با اولویت دادن به پرچم "none" حل می‌شوند.
اجازه دادن به NullAction قوانین تطبیق را آسان می‌کند تا به intent های بدون اکشن اجازه تطبیق داده شود. این پرچم همراه با "enforceIntentFilter" برای دستیابی به یک رفتار خاص استفاده می‌شود.

تست و اشکال‌زدایی

وقتی اجرای فعال باشد، اگر فراخواننده‌ی intent به درستی intent را پر کرده باشد، برنامه‌ها باید به درستی کار کنند. با این حال، intentهای مسدود شده پیام‌های هشداری مانند "Intent does not match component's intent filter:" و "Access blocked:" با برچسب "PackageManager." این نشان دهنده‌ی یک مشکل بالقوه است که می‌تواند بر برنامه تأثیر بگذارد و نیاز به توجه دارد.

فیلتر لاگ‌کت:

tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")

فیلتر کردن فراخوانی‌های سیستمی GPU

برای مقاوم‌سازی سطح پردازنده گرافیکی Mali، IOCTLهای پردازنده گرافیکی Mali که منسوخ شده‌اند یا صرفاً برای توسعه پردازنده گرافیکی در نظر گرفته شده‌اند، در نسخه‌های تولیدی مسدود شده‌اند. علاوه بر این، IOCTLهای مورد استفاده برای پروفایل‌سازی پردازنده گرافیکی به فرآیند پوسته یا برنامه‌های اشکال‌زدایی‌شده محدود شده‌اند. برای جزئیات بیشتر در مورد سیاست سطح پلتفرم، به به‌روزرسانی SAC مراجعه کنید.

این تغییر در دستگاه‌های پیکسل که از پردازنده گرافیکی Mali (پیکسل ۶-۹) استفاده می‌کنند، رخ می‌دهد. آرم دسته‌بندی رسمی IOCTL های خود را در Documentation/ioctl-categories.rst از نسخه r54p2 خود ارائه کرده است. این لیست در نسخه‌های درایور آینده همچنان حفظ خواهد شد.

این تغییر بر APIهای گرافیکی پشتیبانی‌شده (از جمله Vulkan و OpenGL) تأثیری ندارد و انتظار نمی‌رود که توسعه‌دهندگان یا برنامه‌های موجود را نیز تحت تأثیر قرار دهد. ابزارهای پروفایلینگ GPU مانند Streamline Performance Analyzer و Android GPU Inspector تحت تأثیر قرار نخواهند گرفت.

آزمایش

اگر با خطای عدم پذیرش SELinux مشابه تصویر زیر مواجه شدید، احتمالاً برنامه شما تحت تأثیر این تغییر قرار گرفته است:

06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc:  denied  { ioctl }
for  path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts

اگر برنامه شما نیاز به استفاده از IOCTL های مسدود شده دارد، لطفاً یک اشکال (bug) ثبت کنید و آن را به android-partner-security@google.com ارجاع دهید.

سوالات متداول

  1. آیا این تغییر سیاست برای همه تولیدکنندگان اصلی تجهیزات (OEM) اعمال می‌شود؟ این تغییر اختیاری خواهد بود، اما برای هر تولیدکننده اصلی تجهیزاتی که مایل به استفاده از این روش مقاوم‌سازی باشند، در دسترس خواهد بود. دستورالعمل‌های اجرای این تغییر را می‌توانید در مستندات پیاده‌سازی بیابید.

  2. آیا برای پیاده‌سازی این تغییر، ایجاد تغییرات در کدبیس تولیدکننده اصلی (OEM) اجباری است یا اینکه به‌طور پیش‌فرض با یک نسخه جدید AOSP همراه خواهد بود؟ تغییر در سطح پلتفرم به‌طور پیش‌فرض با یک نسخه جدید AOSP همراه خواهد بود. فروشندگان می‌توانند در صورت تمایل به اعمال این تغییر در کدبیس خود، آن را بپذیرند.

  3. آیا SoCها مسئول به‌روز نگه داشتن لیست IOCTL هستند؟ به عنوان مثال، اگر دستگاه من از پردازنده گرافیکی ARM Mali استفاده می‌کند، آیا باید برای هرگونه تغییر با ARM تماس بگیرم؟ SoCهای جداگانه باید لیست‌های IOCTL خود را برای هر دستگاه پس از انتشار درایور به‌روزرسانی کنند. به عنوان مثال، ARM لیست IOCTL منتشر شده خود را پس از به‌روزرسانی درایور به‌روزرسانی می‌کند. با این حال، OEMها باید مطمئن شوند که به‌روزرسانی‌ها را در SEPolicy خود لحاظ می‌کنند و در صورت نیاز، IOCTLهای سفارشی انتخاب شده را به لیست‌ها اضافه می‌کنند.

  4. آیا این تغییر به طور خودکار برای همه دستگاه‌های پیکسل موجود در بازار اعمال می‌شود یا برای اعمال این تغییر، اقدام کاربر لازم است؟ این تغییر برای همه دستگاه‌های پیکسل موجود در بازار که از پردازنده گرافیکی Mali استفاده می‌کنند (پیکسل ۶-۹) اعمال می‌شود. برای اعمال این تغییر نیازی به اقدام کاربر نیست.

  5. آیا استفاده از این سیاست بر عملکرد درایور هسته تأثیر می‌گذارد؟ این سیاست با استفاده از GFXBench روی پردازنده گرافیکی Mali آزمایش شد و هیچ تغییر قابل اندازه‌گیری در عملکرد پردازنده گرافیکی مشاهده نشد.

  6. آیا لازم است لیست IOCTL با نسخه‌های فعلی درایور فضای کاربری و هسته هماهنگ شود؟ بله، لیست IOCTLهای مجاز باید با IOCTLهای پشتیبانی شده توسط درایورهای فضای کاربری و هسته هماهنگ شوند. اگر IOCTLهای موجود در فضای کاربری یا درایور هسته به‌روزرسانی شوند، لیست IOCTL در SEPolicy نیز باید به‌روزرسانی شود تا با آنها مطابقت داشته باشد.

  7. ARM، IOCTLها را به عنوان «محدود» / «ابزار دقیق» طبقه‌بندی کرده است، اما ما می‌خواهیم از برخی از آنها در موارد استفاده در تولید استفاده کنیم و/یا برخی دیگر را رد کنیم. تولیدکنندگان اصلی تجهیزات/SoCها مسئول تصمیم‌گیری در مورد نحوه طبقه‌بندی IOCTLهایی هستند که بر اساس پیکربندی کتابخانه‌های Mali فضای کاربری خود، استفاده می‌کنند. فهرست ARM می‌تواند برای تصمیم‌گیری در مورد این موارد استفاده شود، اما موارد استفاده هر تولیدکننده اصلی تجهیزات/SoC ممکن است متفاوت باشد.

حریم خصوصی

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات حریم خصوصی زیر است.

مجوز شبکه محلی

دستگاه‌های موجود در شبکه محلی (LAN) می‌توانند توسط هر برنامه‌ای که مجوز INTERNET دارد، قابل دسترسی باشند. این امر اتصال برنامه‌ها به دستگاه‌های محلی را آسان می‌کند، اما پیامدهایی برای حریم خصوصی مانند تشکیل اثر انگشت کاربر و تبدیل شدن به یک پروکسی برای موقعیت مکانی نیز دارد.

پروژه حفاظت از شبکه‌های محلی (Local Network Protections) با هدف محافظت از حریم خصوصی کاربر، دسترسی به شبکه محلی را با مجوز زمان اجرا (runtime permission) جدیدی مسدود می‌کند.

طرح انتشار

این تغییر به ترتیب بین دو نسخه، سه‌ماهه دوم ۲۵ و سه‌ماهه دوم ۲۶، اعمال خواهد شد. ضروری است که توسعه‌دهندگان این راهنما را برای سه‌ماهه دوم ۲۵ دنبال کنند و بازخورد خود را به اشتراک بگذارند، زیرا این محافظت‌ها در نسخه بعدی اندروید اعمال خواهند شد . علاوه بر این، آن‌ها باید سناریوهایی را که به دسترسی ضمنی به شبکه محلی بستگی دارند، با استفاده از راهنمای زیر به‌روزرسانی کنند و برای رد کاربر و لغو مجوز جدید آماده شوند.

تأثیر

در مرحله فعلی، LNP یک ویژگی اختیاری است، به این معنی که فقط برنامه‌هایی که این ویژگی را انتخاب می‌کنند تحت تأثیر قرار می‌گیرند. هدف از مرحله اختیاری این است که توسعه‌دهندگان برنامه بفهمند کدام بخش‌های برنامه‌شان به دسترسی ضمنی به شبکه محلی نیاز دارد تا بتوانند برای انتشار بعدی، از آنها محافظت کنند.

اگر برنامه‌ها با استفاده از روش‌های زیر به شبکه محلی کاربر دسترسی پیدا کنند، تحت تأثیر قرار خواهند گرفت:

  • استفاده مستقیم یا کتابخانه‌ای از سوکت‌های خام روی آدرس‌های شبکه محلی (مثلاً mDNS یا پروتکل کشف سرویس SSDP)
  • استفاده از کلاس‌های سطح چارچوب که به شبکه محلی دسترسی دارند (مثلاً NsdManager)

ترافیک ورودی و خروجی از یک آدرس شبکه محلی نیاز به مجوز دسترسی به شبکه محلی دارد. جدول زیر برخی از موارد رایج را فهرست می‌کند:

عملیات شبکه سطح پایین برنامه مجوز شبکه محلی مورد نیاز است
ایجاد یک اتصال TCP خروجی بله
پذیرش اتصالات TCP ورودی بله
ارسال UDP به صورت تک پخشی، چندپخشی، پخش همگانی بله
دریافت یک UDP ورودی به صورت تک پخشی، چندپخشی، پخش همگانی بله

این محدودیت‌ها در اعماق پشته شبکه پیاده‌سازی شده‌اند و بنابراین بر همه APIهای شبکه اعمال می‌شوند. این شامل سوکت‌های ایجاد شده با کد بومی یا مدیریت‌شده، کتابخانه‌های شبکه مانند Cronet و OkHttp و هر API پیاده‌سازی شده بر روی آن‌ها می‌شود. تلاش برای حل مشکلات سرویس‌ها در شبکه محلی (یعنی آن‌هایی که پسوند .local دارند) به مجوز شبکه محلی نیاز دارد.

استثنائات قوانین فوق:

  • اگر سرور DNS یک دستگاه در یک شبکه محلی باشد، ترافیک ورودی یا خروجی از آن (در پورت ۵۳) نیازی به مجوز دسترسی به شبکه محلی ندارد.
  • برنامه‌هایی که از Output Switcher به عنوان انتخابگر درون‌برنامه‌ای خود استفاده می‌کنند، به مجوزهای شبکه محلی نیاز نخواهند داشت (راهنمایی بیشتر در سه‌ماهه چهارم 2025 ارائه خواهد شد).

راهنمایی توسعه‌دهنده (انتخابی)

برای اعمال محدودیت‌های شبکه محلی، موارد زیر را انجام دهید:

  1. دستگاه را به نسخه‌ای با نسخه بتا ۳ از ۲۵Q2 یا بالاتر فلش کنید.
  2. برای تست، برنامه را نصب کنید.
  3. تغییر وضعیت پرچم Appcompat در adb:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. دستگاه را ریبوت کنید

اکنون دسترسی برنامه شما به شبکه محلی محدود شده است و هرگونه تلاشی برای دسترسی به شبکه محلی منجر به خطاهای سوکت خواهد شد. اگر از APIهایی استفاده می‌کنید که عملیات شبکه محلی را خارج از فرآیند برنامه شما انجام می‌دهند (مثلاً: NsdManager)، در مرحله انتخاب، تحت تأثیر قرار نخواهند گرفت.

برای بازیابی دسترسی، باید به برنامه خود اجازه دسترسی به NEARBY_WIFI_DEVICES را بدهید.

  1. مطمئن شوید که برنامه مجوز NEARBY_WIFI_DEVICES را در مانیفست خود اعلام کرده است.
  2. به تنظیمات > برنامه‌ها > [نام برنامه] > مجوزها > دستگاه‌های نزدیک > مجاز بروید.

اکنون دسترسی برنامه شما به شبکه محلی باید بازیابی شده باشد و تمام سناریوهای شما باید مانند قبل از فعال کردن برنامه، کار کنند.

زمانی که اجرای قانون حفاظت از شبکه محلی آغاز شود، در اینجا نحوه تأثیر آن بر ترافیک شبکه برنامه آمده است.

اجازه درخواست شبکه محلی خروجی درخواست اینترنت خروجی/ورودی درخواست شبکه محلی ورودی
اعطا شده آثار آثار آثار
اعطا نشده شکست‌ها آثار شکست‌ها

برای غیرفعال کردن پرچم App-Compat از دستور زیر استفاده کنید.

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

خطاها

خطاهای ناشی از این محدودیت‌ها، هر زمان که سوکت فراخوانی کننده، تابع send یا نوع دیگری از send را به یک آدرس شبکه محلی فراخوانی کند، به آن بازگردانده می‌شوند.

خطاهای مثال:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

تعریف شبکه محلی

منظور از شبکه محلی در این پروژه، شبکه‌ای مبتنی بر IP است که از یک رابط شبکه با قابلیت پخش همگانی، مانند Wi-Fi یا Ethernet، استفاده می‌کند، اما اتصالات تلفن همراه (WWAN) یا VPN را شامل نمی‌شود.

موارد زیر به عنوان شبکه‌های محلی در نظر گرفته می‌شوند:

آی‌پی‌وی۴:

  • ۱۶۹.۲۵۴.۰.۰/۱۶ // لینک محلی
  • ۱۰۰.۶۴.۰.۰/۱۰ // سی‌جی‌ان‌ای‌تی
  • ۱۰.۰.۰.۰/۸ // RFC۱۹۱۸
  • ۱۷۲.۱۶.۰.۰/۱۲ // RFC۱۹۱۸
  • ‎192.168.0.0/16 // RFC1918‎

آی‌پی‌وی۶:

  • لینک-محلی
  • مسیرهای متصل مستقیم
  • شبکه‌های خرد مانند Thread
  • زیرشبکه‌های چندگانه (تاریخ انتشار نامشخص)

علاوه بر این، هر دو آدرس چندپخشی (224.0.0.0/4، ff00::/8) و آدرس پخش IPv4 (255.255.255.255) به عنوان آدرس‌های شبکه محلی طبقه‌بندی می‌شوند.

عکس‌های متعلق به برنامه

{% شامل "/training/data-storage/shared/___posed-photos" %}