مانند نسخه های قبلی، اندروید 16 شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات رفتاری زیر منحصراً برای برنامههایی اعمال میشود که اندروید 16 یا بالاتر را هدف قرار میدهند. اگر برنامه شما اندروید 16 یا بالاتر را هدف قرار می دهد، باید برنامه خود را تغییر دهید تا در صورت لزوم از این رفتارها پشتیبانی کند.
حتماً فهرستی از تغییرات رفتاری را نیز مرور کنید که بر همه برنامههای در حال اجرا در Android 16 بدون توجه به targetSdkVersion
برنامه شما تأثیر میگذارد.
تجربه کاربری و رابط کاربری سیستم
Android 16 (سطح API 36) شامل تغییرات زیر است که برای ایجاد یک تجربه کاربری سازگارتر و بصری در نظر گرفته شده است.
انصراف لبه به لبه حذف می شود
Android 15 برای برنامههایی که Android 15 را هدف قرار میدهند (سطح API 35) لبه به لبه اعمال میشود ، اما برنامه شما میتواند با تنظیم R.attr#windowOptOutEdgeToEdgeEnforcement
روی true
انصراف دهد. برای برنامههایی که Android 16 (سطح API 36) را هدف قرار میدهند، R.attr#windowOptOutEdgeToEdgeEnforcement
منسوخ و غیرفعال شده است، و برنامه شما نمیتواند از رفتن لبه به لبه انصراف دهد.
- اگر برنامه شما Android 16 (سطح API 36) را هدف قرار می دهد و در دستگاه Android 15 اجرا می شود،
R.attr#windowOptOutEdgeToEdgeEnforcement
به کار خود ادامه می دهد. - اگر برنامه شما Android 16 (سطح API 36) را هدف قرار می دهد و در دستگاه Android 16 اجرا می شود،
R.attr#windowOptOutEdgeToEdgeEnforcement
غیرفعال است.
برای آزمایش در Android 16، مطمئن شوید که برنامه شما از لبه به لبه پشتیبانی می کند و هرگونه استفاده از R.attr#windowOptOutEdgeToEdgeEnforcement
را حذف کنید تا برنامه شما از لبه به لبه در دستگاه Android 15 نیز پشتیبانی کند. برای پشتیبانی از لبه به لبه، به راهنمای نوشتن و مشاهده مراجعه کنید.
مهاجرت یا انصراف برای بازگشت پیشبینی لازم است
برای برنامههایی که Android 16 (سطح API 36) یا بالاتر را هدف قرار میدهند و روی دستگاه Android 16 یا بالاتر اجرا میشوند، انیمیشنهای پیشبینی کننده سیستم برگشت (بازگشت به خانه، کار متقابل و فعالیت متقابل) به طور پیشفرض فعال هستند. علاوه بر این، onBackPressed
فراخوانی نمی شود و KeyEvent.KEYCODE_BACK
دیگر ارسال نمی شود.
اگر برنامه شما رویداد برگشتی را متوقف کرد و هنوز به بازگشت پیشگویانه مهاجرت نکردهاید، برنامه خود را بهروزرسانی کنید تا از APIهای پشتیبان ناوبری پشتیبانی شده استفاده کند ، یا با تنظیم ویژگی android:enableOnBackInvokedCallback
روی false
در تگ <application>
یا <activity>
فایل AndroidManifest.xml
برنامه خود، موقتاً از آن انصراف دهید.
APIهای فونت زیبا منسوخ و غیرفعال شدند
以 Android 15(API 级别 35)为目标平台的应用默认将 elegantTextHeight
TextView
属性设置为 true
,从而将紧凑型字体替换为可读性更高的字体。您可以通过将 elegantTextHeight
属性设置为 false
来替换此设置。
Android 16 弃用了 elegantTextHeight
属性,当您的应用以 Android 16 为目标平台后,系统会忽略该属性。由这些 API 控制的“界面字体”即将停用,因此您应调整所有布局,以确保阿拉伯语、老挝语、缅甸语、泰米尔语、古吉拉特语、卡纳达语、马拉雅拉姆语、奥里亚语、泰卢固语或泰语文本的呈现效果一致且不受未来变化的影响。
elegantTextHeight
属性设置为 false
替换默认值的应用,
elegantTextHeight
行为。elegantTextHeight
属性设置为 false
来替换默认值的应用,其 elegantTextHeight
行为。
عملکرد اصلی
اندروید 16 (سطح API 36) شامل تغییرات زیر است که قابلیتهای هستهای مختلف سیستم اندروید را اصلاح یا گسترش میدهد.
بهینه سازی زمان بندی کار با نرخ ثابت
在以 Android 16 为目标平台之前,如果 scheduleAtFixedRate
因不在有效的进程生命周期内而错过了任务执行,则当应用返回到有效的生命周期时,所有错过的执行会立即执行。
以 Android 16 为目标平台时,当应用返回到有效的生命周期时,系统会立即执行最多 1 次未执行的 scheduleAtFixedRate
执行。此行为变更预计会提升应用性能。在您的应用中测试此行为,检查您的应用是否受到影响。您还可以使用应用兼容性框架并启用 STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS
兼容性标志进行测试。
عوامل شکل دستگاه
Android 16 (سطح API 36) شامل تغییرات زیر برای برنامهها هنگام نمایش در دستگاههای صفحه بزرگ است.
طرحبندیهای تطبیقی
با توجه به اینکه اکنون برنامههای اندروید بر روی دستگاههای مختلف (مانند تلفنها، تبلتها، تاشوها، رایانههای رومیزی، ماشینها و تلویزیونها) و حالتهای پنجرهسازی روی صفحههای بزرگ (مانند پنجرههای تقسیمشده و دسکتاپ) اجرا میشوند، توسعهدهندگان باید برنامههای اندرویدی بسازند که با هر اندازه صفحه و پنجره سازگار باشد، صرف نظر از جهتگیری دستگاه. پارادایم هایی مانند محدود کردن جهت گیری و تغییر اندازه در دنیای چند دستگاهی امروزی بسیار محدود کننده هستند.
جهت گیری، قابلیت تغییر اندازه و محدودیت های نسبت تصویر را نادیده بگیرید
برای برنامههایی که Android 16 (سطح API 36) را هدف قرار میدهند، Android 16 شامل تغییراتی در نحوه مدیریت سیستم جهتگیری، قابلیت تغییر اندازه و محدودیتهای نسبت ابعاد است. در نمایشگرهایی با کمترین عرض >= 600dp، محدودیت ها دیگر اعمال نمی شوند. برنامهها همچنین کل پنجره نمایشگر را بدون توجه به نسبت ابعاد یا جهتگیری ترجیحی کاربر پر میکنند و از ستونباکسینگ استفاده نمیشود.
این تغییر رفتار پلت فرم استاندارد جدیدی را معرفی می کند. اندروید در حال حرکت به سمت مدلی است که انتظار می رود برنامه ها با جهت گیری ها، اندازه های نمایشگر و نسبت های مختلف سازگار شوند. محدودیتهایی مانند جهتگیری ثابت یا قابلیت تغییر اندازه محدود، مانع از سازگاری برنامه میشوند، بنابراین توصیه میکنیم برنامه خود را برای ارائه بهترین تجربه ممکن برای کاربر سازگار کنید .
همچنین میتوانید این رفتار را با استفاده از چارچوب سازگاری برنامه و فعال کردن پرچم سازگار UNIVERSAL_RESIZABLE_BY_DEFAULT
آزمایش کنید.
تغییرات متداول شکستن
نادیده گرفتن محدودیتهای جهت، قابلیت تغییر اندازه و نسبت ابعاد ممکن است بر رابط کاربری برنامه شما در برخی از دستگاهها تأثیر بگذارد، بهویژه عناصری که برای طرحبندیهای کوچک قفلشده در جهت عمودی طراحی شدهاند: برای مثال، مسائلی مانند طرحبندیهای کشیده و انیمیشنها و اجزای خارج از صفحه. هر گونه فرضی در مورد نسبت تصویر یا جهتگیری میتواند باعث ایجاد مشکلات بصری در برنامه شما شود. درباره نحوه اجتناب از آنها و بهبود رفتار تطبیقی برنامه خود بیشتر بیاموزید .
اجازه چرخش دستگاه منجر به ایجاد مجدد فعالیت بیشتر می شود که در صورت عدم حفظ صحیح می تواند منجر به از دست دادن حالت کاربر شود. نحوه ذخیره صحیح حالت رابط کاربری را در حالت های ذخیره رابط کاربری بیاموزید.
جزئیات پیاده سازی
ویژگی های مانیفست زیر و API های زمان اجرا در دستگاه های صفحه بزرگ در حالت تمام صفحه و چند پنجره نادیده گرفته می شوند:
-
screenOrientation
-
resizableActivity
-
minAspectRatio
-
maxAspectRatio
-
setRequestedOrientation()
-
getRequestedOrientation()
مقادیر زیر برای screenOrientation
، setRequestedOrientation()
و getRequestedOrientation()
نادیده گرفته می شوند:
-
portrait
-
reversePortrait
-
sensorPortrait
-
userPortrait
-
landscape
-
reverseLandscape
-
sensorLandscape
-
userLandscape
با توجه به قابلیت تغییر اندازه نمایشگر، android:resizeableActivity="false"
، android:minAspectRatio
و android:maxAspectRatio
هیچ تاثیری ندارند.
برای برنامههایی که Android 16 (سطح API 36) را هدف قرار میدهند، محدودیتهای جهتگیری برنامه، قابلیت تغییر اندازه و نسبت ابعاد به طور پیشفرض در صفحههای بزرگ نادیده گرفته میشوند، اما هر برنامهای که کاملاً آماده نیست میتواند موقتاً این رفتار را با انصراف لغو کند (که منجر به رفتار قبلی یعنی قرار گرفتن در حالت سازگاری میشود).
استثنائات
محدودیتهای جهتگیری، قابلیت تغییر اندازه و نسبت تصویر Android 16 در شرایط زیر اعمال نمیشوند:
- بازی ها (بر اساس پرچم
android:appCategory
) - کاربران به صراحت از رفتار پیشفرض برنامه در تنظیمات نسبت تصویر دستگاه استفاده میکنند
- صفحه نمایش هایی که کوچکتر از
sw600dp
هستند
به طور موقت انصراف دهید
برای انصراف از یک فعالیت خاص، ویژگی PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
مانیفست را اعلام کنید:
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
اگر بخشهای زیادی از برنامه شما برای Android 16 آماده نیست، میتوانید با اعمال همان ویژگی در سطح برنامه، به طور کامل انصراف دهید:
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
سلامتی و تناسب اندام
اندروید 16 (سطح API 36) شامل تغییرات زیر مربوط به داده های سلامت و تناسب اندام است.
مجوزهای سلامت و تناسب اندام
对于以 Android 16(API 级别 36)或更高版本为目标平台的应用,BODY_SENSORS
权限使用 android.permissions.health
下更精细的权限,健康数据共享也使用这些权限。自 Android 16 起,凡是以前需要 BODY_SENSORS
或 BODY_SENSORS_BACKGROUND
权限的 API,现在都需要获取相应的 android.permissions.health
权限。这会影响以下数据类型、API 和前台服务类型:
HEART_RATE_BPM
来自 Wear OS 健康服务- 来自 Android Sensor Manager 的
Sensor.TYPE_HEART_RATE
- 在 Wear OS 上,
ProtoLayout
中的heartRateAccuracy
和heartRateBpm
FOREGROUND_SERVICE_TYPE_HEALTH
,其中需要使用相应的android.permission.health
权限来代替BODY_SENSORS
如果您的应用使用这些 API,则应请求相应的精细权限:
- 对于使用期间的心率、血氧饱和度或体表温度监测:请求
android.permissions.health
下的精细权限,例如READ_HEART_RATE
,而不是BODY_SENSORS
。 - 对于后台传感器访问权限:请求
READ_HEALTH_DATA_IN_BACKGROUND
而不是BODY_SENSORS_BACKGROUND
。
这些权限与用于保护对 Health Connect(Android 健康、健身和身心状态数据存储区)中数据的读取访问权限相同。
移动应用
迁移到使用 READ_HEART_RATE
和其他精细权限的移动应用还必须声明 activity 以显示应用的隐私权政策。此要求与健康数据共享的要求相同。
قابلیت اتصال
اندروید 16 (سطح API 36) شامل تغییرات زیر در پشته بلوتوث برای بهبود اتصال با دستگاه های جانبی است.
اهداف جدید برای مدیریت از دست دادن اوراق قرضه و تغییرات رمزگذاری
به عنوان بخشی از بهبود مدیریت از دست دادن اوراق قرضه ، اندروید 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
تغییرات وضعیت پیوند را کنترل کند.
امنیت
اندروید 16 (سطح API 36) شامل تغییرات امنیتی زیر است.
قفل شدن نسخه MediaStore
برای برنامههایی که اندروید 16 یا بالاتر را هدف قرار میدهند، MediaStore#getVersion()
اکنون برای هر برنامه منحصر به فرد خواهد بود. این ویژگی های شناسایی را از رشته نسخه حذف می کند تا از سوء استفاده و استفاده از تکنیک های انگشت نگاری جلوگیری شود. برنامه ها نباید هیچ فرضی در مورد قالب این نسخه داشته باشند. برنامهها از قبل باید هنگام استفاده از این API تغییرات نسخه را کنترل کنند و در بیشتر موارد نیازی به تغییر رفتار فعلی خود ندارند، مگر اینکه توسعهدهنده تلاش کرده باشد اطلاعات بیشتری را استنباط کند که فراتر از محدوده مورد نظر این API است.
مقاصد امن تر
ویژگی Safer Intents یک ابتکار امنیتی چند مرحله ای است که برای بهبود امنیت مکانیسم تفکیک قصد اندروید طراحی شده است. هدف محافظت از برنامهها در برابر اعمال مخرب با افزودن چک در طول پردازش قصد و فیلتر کردن اهدافی است که معیارهای خاصی را ندارند.
در اندروید 15، این ویژگی با تمرکز بر برنامه ارسال، اکنون با اندروید 16، کنترل را به برنامه دریافت کننده منتقل می کند و به توسعه دهندگان این امکان را می دهد تا با استفاده از مانیفست برنامه خود، رزولوشن دقیق هدف را انتخاب کنند.
دو تغییر کلیدی در حال اجرا هستند:
مقاصد صریح باید با فیلتر هدف مؤلفه هدف مطابقت داشته باشد: اگر هدفی به صراحت یک مؤلفه را هدف قرار دهد، باید با فیلتر هدف آن مؤلفه مطابقت داشته باشد.
Intents Without Action نمی تواند با هیچ فیلتر Intent مطابقت داشته باشد: مقاصدی که عملکرد مشخصی ندارند نباید به هیچ فیلتر هدفی حل شوند.
این تغییرات تنها زمانی اعمال میشوند که چندین برنامه درگیر باشند و بر مدیریت قصد در یک برنامه تأثیری نمیگذارند.
تاثیر
ماهیت انتخاب کردن به این معنی است که توسعه دهندگان باید به صراحت آن را در مانیفست برنامه خود فعال کنند تا اعمال شود. در نتیجه، تأثیر این ویژگی به برنامههایی محدود میشود که توسعهدهندگان آنها:
- از ویژگی Safer Intents و مزایای آن آگاه هستید.
- فعالانه انتخاب کنید تا شیوههای مدیریت هدف سختگیرانهتری را در برنامههای خود بگنجانید.
این رویکرد انتخاب کردن، خطر شکستن برنامههای موجود را که ممکن است به رفتار وضوح کمتر ایمن فعلی متکی باشند، به حداقل میرساند.
در حالی که تأثیر اولیه در اندروید 16 ممکن است محدود باشد، ابتکار Safer Intents نقشه راهی برای تأثیر گسترده تر در نسخه های آینده اندروید دارد. برنامه این است که در نهایت تصمیم گیری دقیق را به رفتار پیش فرض تبدیل کنیم.
ویژگی Safer Intents این پتانسیل را دارد که به طور قابل توجهی امنیت اکوسیستم اندروید را با دشوارتر کردن برنامههای مخرب برای سوء استفاده از آسیبپذیریها در مکانیسم تفکیک قصد افزایش دهد.
با این حال، انتقال به انصراف و اجرای اجباری باید با دقت مدیریت شود تا مشکلات احتمالی سازگاری با برنامههای موجود برطرف شود.
پیاده سازی
توسعهدهندگان باید با استفاده از ویژگی 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>
اطلاعات بیشتر در مورد پرچم های پشتیبانی شده:
نام پرچم | توضیحات |
---|---|
enforceIntentFilter | تطابق سختگیرانه تری را برای مقاصد ورودی اعمال می کند |
هیچ کدام | تمام قوانین تطبیق ویژه برای مقاصد ورودی را غیرفعال می کند. هنگام تعیین چند پرچم، مقادیر متناقض با اولویت دادن به پرچم "هیچ" حل می شوند. |
allowNullAction | قوانین تطبیق را آرام می کند تا اجازه دهد مقاصد بدون عمل مطابقت داشته باشند. این پرچم باید همراه با "enforceIntentFilter" برای دستیابی به یک رفتار خاص استفاده شود |
تست و اشکال زدایی
وقتی برنامههای اجرایی فعال است، برنامهها باید به درستی عمل کنند اگر تماسگیرنده قصد بهدرستی هدف را پر کرده باشد. با این حال، مقاصد مسدود شده پیامهای گزارش هشداری مانند "Intent does not match component's intent filter:"
و "Access blocked:"
با تگ "PackageManager."
این نشان دهنده یک مشکل بالقوه است که می تواند برنامه را تحت تأثیر قرار دهد و نیاز به توجه دارد.
فیلتر Logcat:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
حریم خصوصی
اندروید 16 (سطح API 36) شامل تغییرات حریم خصوصی زیر است.
مجوز شبکه محلی
دستگاه های موجود در شبکه LAN توسط هر برنامه ای که مجوز INTERNET
را داشته باشد قابل دسترسی است. این امر اتصال برنامهها به دستگاههای محلی را آسان میکند، اما پیامدهای حفظ حریم خصوصی مانند تشکیل اثر انگشت کاربر و پروکسی بودن مکان را نیز دارد.
پروژه Local Network Protections با هدف حفاظت از حریم خصوصی کاربر با دسترسی به شبکه محلی در پشت مجوز زمان اجرا جدید.
طرح انتشار
این تغییر به ترتیب بین دو نسخه 25Q2 و TBD اعمال خواهد شد. ضروری است که توسعه دهندگان این دستورالعمل را برای 25Q2 دنبال کنند و بازخورد خود را به اشتراک بگذارند زیرا این حفاظت ها در نسخه بعدی اندروید اعمال خواهند شد . علاوه بر این، آنها باید سناریوهایی را که به دسترسی ضمنی شبکه محلی وابسته هستند با استفاده از راهنمایی زیر به روز کنند و برای رد کاربر و لغو مجوز جدید آماده شوند.
تاثیر
در مرحله فعلی، LNP یک ویژگی Opt-in است که به این معنی است که فقط برنامه هایی که شرکت می کنند تحت تأثیر قرار می گیرند. هدف مرحله انتخاب کردن این است که توسعه دهندگان برنامه بفهمند کدام بخش از برنامه آنها به دسترسی ضمنی شبکه محلی وابسته است به طوری که می توانند برای محافظت از آنها برای نسخه بعدی آماده شوند.
اگر برنامهها با استفاده از موارد زیر به شبکه محلی کاربر دسترسی پیدا کنند تحت تأثیر قرار میگیرند.
- استفاده مستقیم یا کتابخانه ای از سوکت های خام در آدرس های شبکه محلی (مثلاً پروتکل کشف سرویس mDNS یا SSDP)
- استفاده از کلاس های سطح چارچوب که به شبکه محلی دسترسی دارند (مانند NsdManager)
ترافیک به و از یک آدرس شبکه محلی نیاز به مجوز دسترسی به شبکه محلی دارد. جدول زیر برخی از موارد رایج را فهرست می کند:
برنامه عملیات شبکه سطح پایین | مجوز شبکه محلی مورد نیاز است |
---|---|
ایجاد یک اتصال TCP خروجی | بله |
پذیرش اتصالات TCP ورودی | بله |
ارسال UDP تک پخشی، چندپخشی، پخش | بله |
دریافت یک UDP دریافتی unicast، multicast، پخش | بله |
این محدودیتها در اعماق پشته شبکه پیادهسازی میشوند و بنابراین برای همه APIهای شبکه اعمال میشوند. این شامل سوکت های ایجاد شده در کدهای بومی یا مدیریت شده، کتابخانه های شبکه مانند Cronet و OkHttp و هر APIهایی است که در بالای آن ها پیاده سازی شده اند. تلاش برای حل و فصل سرویسها در شبکه محلی (یعنی آنهایی که پسوند .local دارند) به مجوز شبکه محلی نیاز دارد.
استثنائات قوانین فوق:
- اگر سرور DNS دستگاه در یک شبکه محلی است، ترافیک به یا از آن (در پورت 53) نیازی به مجوز دسترسی به شبکه محلی ندارد.
- برنامههایی که از Output Switcher بهعنوان انتخابگر درونبرنامه خود استفاده میکنند، نیازی به مجوزهای شبکه محلی ندارند (راهنماییهای بیشتری در Q4 2025 ارائه میشود).
راهنمای توسعهدهنده (انتخاب کردن)
برای انتخاب محدودیت های شبکه محلی، موارد زیر را انجام دهید:
- دستگاه را روی یک بیلد با 25Q2 Beta 3 یا جدیدتر فلش کنید.
- برنامه را برای تست نصب کنید.
پرچم Appcompat را در adb تغییر دهید:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
دستگاه را راه اندازی مجدد کنید
اکنون دسترسی برنامه شما به شبکه محلی محدود شده است و هرگونه تلاش برای دسترسی به شبکه محلی منجر به خطاهای سوکت می شود. اگر از APIهایی استفاده می کنید که عملیات شبکه محلی را خارج از فرآیند برنامه شما انجام می دهند (مثلاً NsdManager)، در مرحله انتخاب کردن تحت تأثیر قرار نمی گیرند.
برای بازیابی دسترسی، باید به برنامه خود مجوز NEARBY_WIFI_DEVICES
بدهید.
- مطمئن شوید که برنامه مجوز
NEARBY_WIFI_DEVICES
را در مانیفست خود اعلام کرده است. - به Settings > Apps > [Application Name] > Permissions > Nearby devices > Allow بروید .
اکنون دسترسی برنامه شما به شبکه محلی باید بازیابی شود و همه سناریوهای شما باید مانند قبل از انتخاب برنامه کار کنند.
هنگامی که اجرای حفاظت از شبکه محلی آغاز شد، در اینجا نحوه تأثیرگذاری بر ترافیک شبکه برنامه آمده است.
اجازه | درخواست LAN خروجی | درخواست اینترنت خروجی/ورودی | درخواست LAN ورودی |
---|---|---|---|
داده شده است | کار می کند | کار می کند | کار می کند |
داده نشده است | شکست می خورد | کار می کند | شکست می خورد |
از دستور زیر برای خاموش کردن پرچم App-Compat استفاده کنید
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
خطاها
هر زمان که سوکت تماس گیرنده ارسال یا یک نوع ارسال را به آدرس شبکه محلی فراخوانی کند، خطاهای ناشی از این محدودیتها به سوکت تماس بازگردانده میشود.
نمونه خطاها:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
تعریف شبکه محلی
یک شبکه محلی در این پروژه به یک شبکه IP اشاره دارد که از یک رابط شبکه با قابلیت پخش مانند Wi-Fi یا Ethernet استفاده می کند، اما اتصالات سلولی (WWAN) یا VPN را استثنا نمی کند.
شبکه های زیر به عنوان شبکه های محلی در نظر گرفته می شوند:
IPv4:
- 169.254.0.0/16 // پیوند محلی
- 100.64.0.0/10 // CGNAT
- 10.0.0.0/8 // RFC1918
- 172.16.0.0/12 // RFC1918
- 192.168.0.0/16 // RFC1918
IPv6:
- پیوند محلی
- مسیرهای متصل مستقیم
- شبکه های خرد مانند Thread
- زیرشبکه های چندگانه (TBD)
علاوه بر این، هر دو آدرس چندپخشی (224.0.0.0/4، ff00::/8) و آدرس پخش IPv4 (255.255.255.255) به عنوان آدرس های شبکه محلی طبقه بندی می شوند.