تغییرات رفتاری: برنامه‌هایی که میانای برنامه‌سازی کاربردی ۲۹ یا بالاتر را هدف قرار می‌دهند

Android 10 شامل تغییرات به‌روزشده‌ای در رفتار سیستم است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات فهرست‌شده در این صفحه منحصراً برای برنامه‌هایی اعمال می‌شود که میانای برنامه‌سازی کاربردی ۲۹ یا بالاتر را هدف قرار می‌دهند. اگر برنامه‌تان targetSdkVersion را روی «۲۹» یا بالاتر تنظیم می‌کند، باید برنامه‌تان را اصلاح کنید تا درصورت لزوم از این رفتارها به‌درستی پشتیبانی کند.

حتماً فهرست تغییرات رفتاری را که بر همه برنامه‌های اجراشده در Android 10 تأثیر می‌گذارد مرور کنید.

توجه: علاوه‌بر تغییرات فهرست‌شده در این صفحه، Android 10 تعداد زیادی تغییرات و محدودیت‌های مبتنی بر حریم خصوصی را معرفی می‌کند، ازجمله موارد زیر:

  • فضای ذخیره‌سازی محدودشده
  • دسترسی به شماره سریال دستگاه USB
  • امکان فعال، غیرفعال، و پیکربندی کردن Wi-Fi
  • اجازه‌های مکان برای میاناهای برنامه‌سازی کاربردی اتصال‌پذیری

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

به‌روزرسانی‌های محدودیت‌های میانای غیر کیت توسعه نرم‌افزار

برای کمک به اطمینان از پایداری و سازگاری برنامه، پلاتفرم شروع به محدود کردن میاناهای غیرکیت توسعه نرم‌افزار کرده است که برنامه‌تان می‌تواند در Android 9 (سطح میانای برنامه‌سازی کاربردی ۲۸) استفاده کند. Android 10 شامل فهرست‌های به‌روزشده‌ای از میاناهای غیرکیت توسعه نرم‌افزار محدودشده است که براساس همکاری با توسعه‌دهندگان Android و جدیدترین آزمایش‌های داخلی تهیه شده است. هدف ما این است که مطمئن شویم قبل‌از محدود کردن میاناهای غیرکیت توسعه نرم‌افزار، جایگزین‌های عمومی دردسترس باشند.

اگر Android نسخه ۱۰ (سطح میانای برنامه‌سازی کاربردی ۲۹) را هدف قرار ندهید، برخی‌از این تغییرات ممکن است فوراً بر شما تأثیر نگذارد. بااین‌حال، اگرچه درحال‌حاضر می‌توانید از برخی میاناهای غیرکیت توسعه نرم‌افزار استفاده کنید (بسته به سطح میانای برنامه‌سازی کاربردی هدف برنامه‌تان)، استفاده از هر روش یا فیلد غیرکیت توسعه نرم‌افزار همیشه خطر بالایی برای ازکار افتادن برنامه‌تان دارد.

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

برای کسب اطلاعات بیشتر، به‌روزرسانی‌های محدودیت‌های میانای غیرکیت توسعه نرم‌افزار در Android 10 و محدودیت‌های میاناهای غیرکیت توسعه نرم‌افزار را ببینید.

حافظه مشترک

Ashmem قالب نقشه‌های dalvik را در /proc/<pid>/maps تغییر داده است، که بر برنامه‌هایی که مستقیماً فایل نقشه‌ها را تجزیه می‌کنند تأثیر می‌گذارد. توسعه‌دهندگان برنامه باید قالب /proc/<pid>/maps را در دستگاه‌هایی که Android 10 یا بالاتر دارند آزمایش کنند و اگر برنامه به قالب‌های dalvik map وابسته است، به‌طور مقتضی تجزیه کنند.

برنامه‌هایی که Android 10 را هدف قرار می‌دهند نمی‌توانند مستقیماً از ashmem (/dev/ashmem) استفاده کنند و باید ازطریق کلاس ASharedMemory NDK به حافظه مشترک دسترسی پیدا کنند. علاوه‌براین، برنامه‌ها نمی‌توانند IOCTL مستقیم به توصیف‌گرهای فایل ashmem موجود ایجاد کنند و درعوض باید از کلاس ASharedMemory NDK یا Android Java APIs برای ایجاد مناطق حافظه مشترک استفاده کنند. این تغییر باعث افزایش امنیت و استحکام هنگام کار با حافظه مشترک می‌شود و عملکرد و امنیت Android را به‌طور کلی بهبود می‌بخشد.

اجازه اجرای دایرکتوری اصلی برنامه برداشته شد

اجرای فایل‌ها از فهرست راهنمای اصلی برنامه قابل‌نوشتن، نقض W^X است. برنامه‌ها باید فقط کد دودویی را بار کنند که در فایل APK برنامه جاسازی شده است.

برنامه‌های غیرقابل‌اعتمادی که Android 10 را هدف قرار می‌دهند نمی‌توانند execve() را مستقیماً در فایل‌های موجود در دایرکتوری خانه برنامه فراخوانی کنند.

علاوه‌براین، برنامه‌هایی که Android 10 را هدف قرار می‌دهند نمی‌توانند کد اجرایی را از فایل‌هایی که با dlopen() باز شده‌اند در حافظه اصلاح کنند و انتظار داشته باشند که این تغییرات در دیسک نوشته شود، زیرا کتابخانه نمی‌تواند ازطریق توصیف‌گر فایل قابل‌نوشتن PROT_EXEC نگاشت شده باشد. این شامل هرگونه فایل شیء مشترک (.so) با جابه‌جایی نوشتار می‌شود.

زمان اجرای Android فقط فایل‌های OAT تولیدشده توسط سیستم را می‌پذیرد

زمان اجرای Android‏ (ART) دیگر dex2oat را از فرایند برنامه فراخوانی نمی‌کند. این تغییر به این معنی است که ART فقط فایل‌های OAT را که سیستم تولید کرده است می‌پذیرد.

اجرای درستی AOT در ART

در گذشته، ترجمه پیش‌از موعد (AOT) که توسط «زمان اجرای Android» (ART) انجام می‌شد، درصورتی‌که محیط classpath در زمان ترجمه و زمان اجرا یکسان نبود، می‌توانست باعث ازکارافتادن زمان اجرا شود. Android 10 و بالاتر همیشه لازم است این زمینه‌های محیطی یکسان باشند، که منجر به تغییرات زیر در رفتار می‌شود:

  • بارکننده‌های کلاس سفارشی (یعنی بارکننده‌های کلاس نوشته‌شده توسط برنامه‌ها، برخلاف بارکننده‌های کلاس از بسته dalvik.system) به‌صورت AOT کامپایل نمی‌شوند. دلیل آن این است که ART نمی‌تواند در زمان اجرا از پیاده‌سازی جستجوی کلاس سفارشی‌شده مطلع شود.
  • فایل‌های dex ثانویه (یعنی فایل‌های dex که به‌صورت دستی توسط برنامه‌هایی که در APK اصلی نیستند بارگیری می‌شوند) در پس‌زمینه به‌صورت AOT کامپایل می‌شوند. دلیلش این است که کامپایل کردن در اولین استفاده ممکن است بسیار پرهزینه باشد و منجر به تأخیر ناخواسته قبل‌از اجرا شود. توجه داشته باشید که برای برنامه‌ها، استفاده از تقسیم‌ها و کنار گذاشتن فایل‌های dex ثانویه توصیه می‌شود.
  • کتابخانه‌های مشترک در Android (ورودی‌های <library> و <uses-library> در مانیفست Android) بااستفاده از سلسله‌مراتب بارکننده کلاس متفاوتی نسبت به سلسله‌مراتب استفاده‌شده در نسخه‌های قبلی پلاتفرم پیاده‌سازی می‌شوند.

تغییرات اجازه‌ها برای هدف‌های تمام‌صفحه

برنامه‌هایی که Android نسخه ۱۰ یا بالاتر را هدف قرار می‌دهند و از اعلان‌های دارای هدف تمام‌صفحه استفاده می‌کنند باید اجازه USE_FULL_SCREEN_INTENT را در فایل مانیفست برنامه درخواست کنند. این یک اجازه معمول است، بنابراین سیستم به‌طور خودکار آن را به برنامه درخواست‌کننده اعطا می‌کند.

اگر برنامه‌ای که Android 10 یا بالاتر را هدف قرار می‌دهد تلاش کند اعلانی با هدف تمام‌صفحه ایجاد کند بدون اینکه اجازه لازم را درخواست کرده باشد، سیستم هدف تمام‌صفحه را نادیده می‌گیرد و پیام گزارش زیر را صادر می‌کند:

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

پشتیبانی از دستگاه‌های تاشو

Android 10 تغییراتی دارد که از دستگاه‌های تاشو و صفحه‌نمایش بزرگ پشتیبانی می‌کند.

وقتی برنامه‌ای در Android 10 اجرا می‌شود، روش‌های onResume() و onPause() به‌طور متفاوتی عمل می‌کنند. وقتی چند برنامه به‌طور هم‌زمان در حالت چندپنجره‌ای یا چندنمایشگری ظاهر می‌شوند، همه فعالیت‌های برتر قابل‌تمرکز در پشته‌های نمایان در وضعیت ازسرگرفته‌شده قرار دارند، اما فقط یکی از آن‌ها، یعنی فعالیت «ازسرگرفته‌شده در بالاترین سطح»، واقعاً تمرکز دارد. وقتی در نسخه‌های قدیمی‌تر از Android 10 اجرا می‌شود، فقط یک فعالیت در سیستم می‌تواند در یک زمان ازسر گرفته شود، همه فعالیت‌های قابل‌مشاهده دیگر موقتاً متوقف می‌شوند.

«تمرکز» را با فعالیت «ازسرگرفته‌شده در بالاترین سطح» اشتباه نگیرید. سیستم براساس ترتیب z اولویت‌هایی را به فعالیت‌ها اختصاص می‌دهد تا اولویت بالاتری به فعالیت‌هایی که کاربر آخرین‌بار با آن‌ها تعامل داشته است بدهد. فعالیت می‌تواند در بالاترین سطح ازسر گرفته شود، اما تمرکز نداشته باشد (برای مثال، اگر سایه اعلان گسترش یافته باشد).

در Android نسخه ۱۰ (سطح API‏ ۲۹) و نسخه‌های جدیدتر، می‌توانید در onTopResumedActivityChanged() callback مشترک شوید تا وقتی فعالیتتان بالاترین موقعیت ازسرگرفته‌شده را به‌دست می‌آورد یا ازدست می‌دهد، به شما اطلاع داده شود. این معادل وضعیت ازسرگرفته‌شده قبل‌از Android 10 است و می‌تواند به‌عنوان راهنمایی مفید باشد اگر برنامه شما از منابع انحصاری یا تک‌نمونه‌ای استفاده می‌کند که ممکن است لازم باشد با برنامه‌های دیگر هم‌رسانی شود.

رفتار مشخصه مانیفست resizeableActivity نیز تغییر کرده است. اگر برنامه‌ای resizeableActivity=false را در Android 10 (سطح API‏ ۲۹) یا بالاتر تنظیم کند، ممکن است هنگام تغییر اندازه صفحه دردسترس یا هنگام انتقال برنامه از صفحه‌ای به صفحه دیگر، در حالت سازگاری قرار گیرد.

برنامه‌ها می‌توانند از ویژگی android:minAspectRatio که در Android 10 معرفی شده است برای نشان دادن نسبت‌های صفحه که برنامه‌تان پشتیبانی می‌کند استفاده کنند.

از نسخه ۳.۵ به بعد، ابزار شبیه‌ساز Android Studio شامل دستگاه‌های مجازی ۷.۳ اینچی و ۸ اینچی برای آزمایش کد شما با صفحه‌نمایش‌های بزرگ‌تر است.

برای اطلاعات بیشتر، طراحی برنامه‌ها برای دستگاه‌های تاشو را ببینید.