اندروید ۱۰ شامل تغییرات رفتاری سیستمی بهروزرسانیشدهای است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات ذکر شده در این صفحه منحصراً برای برنامههایی اعمال میشود که API 29 یا بالاتر را هدف قرار میدهند. اگر برنامه شما targetSdkVersion روی "۲۹" یا بالاتر تنظیم کرده است، باید برنامه خود را برای پشتیبانی صحیح از این رفتارها، در صورت لزوم، اصلاح کنید.
حتماً فهرست تغییرات رفتاری که بر همه برنامههای در حال اجرا در اندروید ۱۰ تأثیر میگذارند را نیز بررسی کنید.
توجه: علاوه بر تغییرات ذکر شده در این صفحه، اندروید ۱۰ تعداد زیادی تغییر و محدودیت مبتنی بر حریم خصوصی، از جمله موارد زیر را معرفی میکند:
- ذخیرهسازی محدود
- دسترسی به شماره سریال دستگاه USB
- امکان فعال، غیرفعال و پیکربندی وایفای
- مجوزهای موقعیت مکانی برای APIهای اتصال
این تغییرات که بر برنامههایی که سطح API 29 یا بالاتر را هدف قرار میدهند، تأثیر میگذارند، حریم خصوصی کاربر را افزایش میدهند. برای کسب اطلاعات بیشتر در مورد نحوه پشتیبانی از این تغییرات، به صفحه تغییرات حریم خصوصی مراجعه کنید.
بهروزرسانیهای محدودیتهای رابط کاربری غیر SDK
برای اطمینان از پایداری و سازگاری برنامه، پلتفرم شروع به محدود کردن رابطهای غیر SDK که برنامه شما میتواند در اندروید ۹ (سطح API ۲۸) استفاده کند، کرده است. اندروید ۱۰ شامل فهرستهای بهروز شدهای از رابطهای غیر SDK محدود شده بر اساس همکاری با توسعهدهندگان اندروید و آخرین آزمایشهای داخلی است. هدف ما این است که قبل از محدود کردن رابطهای غیر SDK، مطمئن شویم که جایگزینهای عمومی در دسترس هستند.
اگر اندروید ۱۰ (سطح API 29) را هدف قرار نمیدهید، ممکن است برخی از این تغییرات بلافاصله شما را تحت تأثیر قرار ندهند. با این حال، اگرچه در حال حاضر میتوانید از برخی رابطهای غیر SDK ( بسته به سطح API هدف برنامه خود ) استفاده کنید، استفاده از هر روش یا فیلد غیر SDK همیشه خطر بالای خرابی برنامه شما را به همراه دارد.
اگر مطمئن نیستید که برنامه شما از رابطهای غیر SDK استفاده میکند، میتوانید برنامه خود را آزمایش کنید تا متوجه شوید. اگر برنامه شما به رابطهای غیر SDK متکی است، باید برنامهریزی برای مهاجرت به جایگزینهای SDK را آغاز کنید. با این وجود، ما درک میکنیم که برخی از برنامهها موارد استفاده معتبری برای استفاده از رابطهای غیر SDK دارند. اگر نمیتوانید جایگزینی برای استفاده از رابط غیر SDK برای یک ویژگی در برنامه خود پیدا کنید، باید یک API عمومی جدید درخواست کنید .
برای کسب اطلاعات بیشتر، به بهروزرسانیهای محدودیتهای رابطهای غیر SDK در اندروید ۱۰ و محدودیتهای رابطهای غیر SDK مراجعه کنید.
حافظه مشترک
شرکت Ashmem فرمت نقشههای dalvik را در مسیر /proc/<pid>/maps تغییر داده است و این تغییر بر برنامههایی که مستقیماً فایل نقشهها را تجزیه میکنند، تأثیر میگذارد. توسعهدهندگان برنامه باید فرمت /proc/<pid>/maps را روی دستگاههایی که اندروید ۱۰ یا بالاتر را اجرا میکنند، آزمایش کنند و در صورت وابستگی برنامه به فرمتهای نقشه dalvik، آن را بر اساس آن تجزیه و تحلیل کنند.
برنامههایی که اندروید ۱۰ را هدف قرار میدهند، نمیتوانند مستقیماً از ashmem (/dev/ashmem) استفاده کنند و در عوض باید از طریق کلاس ASharedMemory NDK به حافظه مشترک دسترسی داشته باشند. علاوه بر این، برنامهها نمیتوانند مستقیماً IOCTLها را به توصیفگرهای فایل ashmem موجود ایجاد کنند و در عوض باید از کلاس ASharedMemory NDK یا APIهای جاوای اندروید برای ایجاد مناطق حافظه مشترک استفاده کنند. این تغییر، امنیت و استحکام را هنگام کار با حافظه مشترک افزایش میدهد و عملکرد و امنیت کلی اندروید را بهبود میبخشد.
مجوز اجرا برای دایرکتوری خانه برنامه حذف شد
اجرای فایلها از دایرکتوری اصلی برنامه که قابل نوشتن است، نقض W^X محسوب میشود. برنامهها باید فقط کد دودویی که در فایل APK برنامه تعبیه شده است را بارگذاری کنند.
برنامههای غیرقابل اعتمادی که اندروید ۱۰ را هدف قرار میدهند، نمیتوانند execve() مستقیماً روی فایلهای درون دایرکتوری خانگی برنامه فراخوانی کنند.
علاوه بر این، برنامههایی که اندروید ۱۰ را هدف قرار میدهند، نمیتوانند کد اجرایی فایلهایی را که با dlopen() باز شدهاند، در حافظه تغییر دهند و انتظار داشته باشند که این تغییرات از طریق دیسک نوشته شوند، زیرا کتابخانه نمیتواند PROT_EXEC از طریق یک توصیفگر فایل قابل نوشتن نگاشت کند. این شامل هر فایل شیء مشترک ( .so ) با جابجایی متن میشود.
محیط اجرای اندروید فقط فایلهای OAT تولید شده توسط سیستم را میپذیرد.
زمان اجرای اندروید (ART) دیگر dex2oat از فرآیند برنامه فراخوانی نمیکند. این تغییر به این معنی است که ART فقط فایلهای OAT تولید شده توسط سیستم را میپذیرد.
اعمال صحت AOT در ART
در گذشته، کامپایل AOT که توسط Android Runtime (ART) انجام میشد، اگر محیط classpath در زمان کامپایل و زمان اجرا یکسان نبود، میتوانست باعث خرابی در زمان اجرا شود. اندروید ۱۰ و بالاتر همیشه نیاز دارد که این زمینههای محیطی یکسان باشند و در نتیجه تغییرات زیر در رفتار رخ میدهد:
- بارگذارهای کلاس سفارشی - یعنی بارگذارهای کلاس نوشته شده توسط برنامهها، برخلاف بارگذارهای کلاس از بسته
dalvik.system- توسط AOT کامپایل نمیشوند. دلیل این امر این است که ART نمیتواند از پیادهسازی جستجوی کلاس سفارشی در زمان اجرا مطلع شود. - فایلهای dex ثانویه - یعنی فایلهای dex که به صورت دستی توسط برنامههایی که در APK اصلی نیستند بارگذاری میشوند - در پسزمینه به صورت AOT کامپایل میشوند. دلیل این امر این است که کامپایل اولیه ممکن است بسیار پرهزینه باشد و منجر به تأخیر ناخواسته قبل از اجرا شود. توجه داشته باشید که برای برنامهها، استفاده از تقسیمبندیها و دور شدن از فایلهای dex ثانویه توصیه میشود.
- کتابخانههای مشترک در اندروید (ورودیهای <library> و <uses-library> در مانیفست اندروید) با استفاده از سلسله مراتب بارگذاری کلاس متفاوتی نسبت به نسخههای قبلی این پلتفرم پیادهسازی میشوند.
تغییرات مجوزها برای نمایش تمام صفحه
برنامههایی که اندروید ۱۰ یا بالاتر را هدف قرار میدهند و از اعلانها با اهداف تمام صفحه استفاده میکنند، باید مجوز USE_FULL_SCREEN_INTENT را در فایل مانیفست برنامه خود درخواست کنند. این یک مجوز عادی است، بنابراین سیستم به طور خودکار آن را به برنامه درخواستکننده اعطا میکند.
اگر برنامهای که اندروید ۱۰ یا بالاتر را هدف قرار میدهد، بدون درخواست مجوز لازم، سعی در ایجاد اعلان با هدف تمام صفحه داشته باشد، سیستم هدف تمام صفحه را نادیده میگیرد و پیام گزارش زیر را صادر میکند:
Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission
پشتیبانی از گوشیهای تاشو
اندروید ۱۰ تغییراتی دارد که از دستگاههای تاشو و صفحه نمایش بزرگ پشتیبانی میکند.
وقتی یک برنامه روی اندروید ۱۰ اجرا میشود، متدهای onResume() و onPause() به طور متفاوتی عمل میکنند. وقتی چندین برنامه به طور همزمان در حالت چند پنجرهای یا چند نمایشی ظاهر میشوند، تمام فعالیتهای برتر قابل فوکوس در پشتههای قابل مشاهده در حالت از سرگیری قرار دارند، اما فقط یکی از آنها، یعنی "بالاترین فعالیت از سر گرفته شده"، در واقع فوکوس دارد. هنگام اجرا روی نسخههای قبل از اندروید ۱۰، فقط یک فعالیت واحد در سیستم میتواند در یک زمان از سر گرفته شود، تمام فعالیتهای قابل مشاهده دیگر متوقف میشوند.
«فوکوس» را با «بالاترین فعالیت از سر گرفته شده» اشتباه نگیرید. سیستم اولویتها را بر اساس z-order به فعالیتها اختصاص میدهد تا به فعالیتهایی که کاربر آخرین بار با آنها تعامل داشته است، اولویت بالاتری بدهد. یک فعالیت میتواند از سر گرفته شود، اما فوکوس نداشته باشد (برای مثال، اگر نوار اعلانها باز شود).
در اندروید ۱۰ (سطح API ۲۹) و بالاتر، میتوانید در فراخوانی onTopResumedActivityChanged() مشترک شوید تا وقتی فعالیت شما بالاترین موقعیت از سرگیری را به دست میآورد یا از دست میدهد، مطلع شوید. این معادل حالت از سرگیری قبل از اندروید ۱۰ است و اگر برنامه شما از منابع انحصاری یا تکگانه استفاده میکند که ممکن است نیاز به اشتراکگذاری با سایر برنامهها داشته باشد، میتواند به عنوان یک راهنما مفید باشد.
رفتار ویژگی مانیفست resizeableActivity نیز تغییر کرده است. اگر یک برنامه در اندروید ۱۰ (سطح API ۲۹) یا بالاتر، resizeableActivity=false تنظیم کند، ممکن است هنگام تغییر اندازه صفحه نمایش موجود یا اگر برنامه از یک صفحه به صفحه دیگر منتقل شود، در حالت سازگاری قرار گیرد.
برنامهها میتوانند از ویژگی android:minAspectRatio که در اندروید ۱۰ معرفی شده است، برای نشان دادن نسبتهای صفحه نمایشی که برنامه شما پشتیبانی میکند، استفاده کنند.
از نسخه ۳.۵ به بعد، ابزار شبیهساز اندروید استودیو شامل دستگاههای مجازی ۷.۳ و ۸ اینچی برای آزمایش کد شما با صفحه نمایشهای بزرگتر میشود.
برای اطلاعات بیشتر، به «طراحی برنامههای خود برای دستگاههای تاشو» مراجعه کنید.