اندروید 9 (سطح API 28) تعدادی تغییرات را در سیستم اندروید معرفی می کند. تغییرات رفتاری زیر منحصراً برای برنامههایی اعمال میشود که سطح API 28 یا بالاتر را هدف قرار میدهند. برنامههایی که targetSdkVersion
را روی سطح API 28 یا بالاتر تنظیم میکنند، باید برنامههای خود را تغییر دهند تا از این رفتارها به درستی پشتیبانی کنند، در صورتی که برای برنامه قابل اجرا باشد.
برای تغییراتی که بر همه برنامههای اجرا شده در Android 9 تأثیر میگذارد، صرفنظر از اینکه کدام سطح API را هدف قرار میدهند، به تغییرات رفتار: همه برنامهها مراجعه کنید.
خدمات پیش زمینه
برنامههایی که Android 9 یا بالاتر را هدف قرار میدهند و از خدمات پیشزمینه استفاده میکنند باید مجوز FOREGROUND_SERVICE
را درخواست کنند. این یک مجوز عادی است، بنابراین سیستم به طور خودکار آن را به برنامه درخواست کننده اعطا می کند.
اگر برنامهای که Android 9 یا بالاتر را هدف قرار میدهد، بدون درخواست FOREGROUND_SERVICE
، سعی کند یک سرویس پیشزمینه ایجاد کند، سیستم یک SecurityException
ایجاد میکند.
حریم خصوصی تغییر می کند
اگر برنامه شما اندروید 9 را هدف قرار می دهد، باید تغییرات رفتاری زیر را در نظر داشته باشید. این بهروزرسانیهای سریال دستگاه و اطلاعات DNS، حریم خصوصی کاربر را افزایش میدهد.
از بین رفتن شماره سریال ساخت
در اندروید 9، Build.SERIAL
همیشه روی "UNKNOWN"
تنظیم می شود تا از حریم خصوصی کاربران محافظت شود.
اگر برنامه شما نیاز به دسترسی به شماره سریال سخت افزاری دستگاه دارد، در عوض باید مجوز READ_PHONE_STATE
را درخواست کنید، سپس getSerial()
را فراخوانی کنید.
حریم خصوصی DNS
برنامه هایی که اندروید 9 را هدف قرار می دهند باید از API های خصوصی DNS احترام بگذارند. به طور خاص، برنامهها باید اطمینان حاصل کنند که اگر حلکننده سیستم DNS-over-TLS را انجام میدهد، هر سرویس گیرنده DNS داخلی یا از DNS رمزگذاریشده به همان نام میزبان سیستم استفاده میکند، یا به نفع حلکننده سیستم غیرفعال میشود.
تغییرات امنیتی چارچوب
Android 9 شامل چندین تغییر رفتاری است که امنیت برنامه شما را بهبود می بخشد، اما این تغییرات تنها در صورتی اعمال می شوند که برنامه شما سطح API 28 یا بالاتر را هدف قرار دهد.
شبکه TLS به طور پیش فرض فعال است
اگر برنامه شما اندروید 9 یا بالاتر را هدف قرار می دهد، روش isCleartextTrafficPermitted()
به طور پیش فرض false
را برمی گرداند. اگر برنامه شما نیاز دارد متن شفاف را برای دامنههای خاصی فعال کند، باید واضحاً cleartextTrafficPermitted
را برای آن دامنهها در پیکربندی امنیت شبکه برنامهتان روی true
تنظیم کنید.
دایرکتوری های داده مبتنی بر وب که بر اساس فرآیند جدا شده اند
به منظور بهبود پایداری برنامه و یکپارچگی داده ها در Android 9، برنامه ها نمی توانند یک فهرست راهنمای داده WebView
را در بین چندین فرآیند به اشتراک بگذارند. به طور معمول، چنین دایرکتوری های داده ای کوکی ها، کش های HTTP، و سایر حافظه های دائمی و موقت مرتبط با مرور وب را ذخیره می کنند.
در بیشتر موارد، برنامه شما باید از کلاسهای بسته android.webkit
مانند WebView
و CookieManager
فقط در یک فرآیند استفاده کند. به عنوان مثال، شما باید تمام اشیاء Activity
را که از WebView
استفاده می کنند به یک فرآیند منتقل کنید. میتوانید با فراخوانی disableWebView()
در سایر فرآیندهای برنامهتان، قانون «فقط یک فرآیند» را با دقت بیشتری اجرا کنید. این فراخوانی مانع از آن می شود که WebView
به اشتباه در آن فرآیندهای دیگر مقداردهی اولیه شود، حتی اگر از یک کتابخانه وابسته فراخوانی شود.
اگر برنامه شما باید از نمونههای WebView
در بیش از یک فرآیند استفاده کند، باید قبل از استفاده از یک نمونه خاص از WebView
در آن فرآیند، با استفاده از متد WebView.setDataDirectorySuffix()
یک پسوند دایرکتوری داده منحصر به فرد برای هر فرآیند اختصاص دهید. این روش داده های وب را از هر فرآیند در فهرست راهنمای خود در فهرست داده های برنامه شما قرار می دهد.
دامنه های SELinux هر برنامه
برنامههایی که اندروید 9 یا بالاتر را هدف قرار میدهند، نمیتوانند با استفاده از مجوزهای جهانی یونیکس، دادهها را با برنامههای دیگر به اشتراک بگذارند. این تغییر یکپارچگی Sandbox برنامه Android را بهبود میبخشد، به ویژه این شرط که دادههای خصوصی یک برنامه فقط توسط آن برنامه قابل دسترسی باشد.
برای اشتراکگذاری فایلها با برنامههای دیگر، از یک ارائهدهنده محتوا استفاده کنید.
اتصال تغییر می کند
شمارش داده های اتصال و چند مسیره
در برنامههایی که Android 9 یا بالاتر را هدف قرار میدهند، سیستم ترافیک شبکه را در شبکههایی که پیشفرض فعلی نیستند – مانند ترافیک سلولی در حالی که دستگاه روی Wi-Fi است – میشمارد و روشهایی را در کلاس NetworkStatsManager
برای جستجوی آن ترافیک ارائه میکند.
به طور خاص، getMultipathPreference()
اکنون یک مقدار بر اساس ترافیک شبکه فوق الذکر برمی گرداند. با شروع Android 9، این روش برای دادههای سلولی true
برمیگرداند، اما وقتی بیش از مقدار معینی ترافیک در یک روز جمع میشود، شروع به بازگشت false
میکند. برنامههایی که روی اندروید ۹ اجرا میشوند باید این روش را فراخوانی کنند و به این نکته احترام بگذارند.
کلاس ConnectivityManager.NetworkCallback
اکنون اطلاعاتی درباره VPN ها به برنامه ها ارسال می کند. این تغییر گوش دادن به رویدادهای اتصال را برای برنامهها بدون نیاز به ترکیب تماسهای همزمان و ناهمزمان و استفاده از APIهای محدود بسیار آسانتر میکند. علاوه بر این، به این معنی است که وقتی یک دستگاه به چندین شبکه Wi-Fi یا چندین شبکه سلولی به طور همزمان متصل می شود، انتقال اطلاعات همانطور که انتظار می رود کار می کند.
منسوخ شدن سرویس گیرنده Apache HTTP
با Android 6.0، پشتیبانی از سرویس گیرنده Apache HTTP را حذف کردیم . با شروع اندروید 9، این کتابخانه از bootclasspath حذف می شود و به طور پیش فرض در دسترس برنامه ها نیست.
برای ادامه استفاده از سرویس گیرنده Apache HTTP، برنامههایی که Android 9 و بالاتر را هدف قرار میدهند میتوانند موارد زیر را به AndroidManifest.xml
خود اضافه کنند:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
به عنوان جایگزینی برای استفاده از کتابخانه Apache در زمان اجرا، برنامه ها می توانند نسخه خود از کتابخانه org.apache.http
را در APK خود قرار دهند. اگر این کار را انجام دهید، باید کتابخانه را دوباره بسته بندی کنید (با ابزاری مانند Jar Jar ) تا از مشکلات سازگاری کلاس با کلاس های ارائه شده در زمان اجرا جلوگیری کنید.
UI تغییر می کند
مشاهده فوکوس
نماهای با مساحت 0 (یا عرض یا ارتفاع 0 است) دیگر قابل فوکوس نیستند.
علاوه بر این، فعالیتها دیگر به طور ضمنی تمرکز اولیه را در حالت لمسی اختصاص نمیدهند. در عوض، این شما هستید که در صورت تمایل، صراحتاً فوکوس اولیه را درخواست کنید.
مدیریت ارزش هگزا CSS RGBA
برنامههایی که Android 9 یا بالاتر را هدف قرار میدهند، باید رفتار پیشنویس ماژول رنگی CSS سطح 4 را برای مدیریت رنگهای CSS 4 و 8 شش رقمی فعال کنند.
ماژول رنگی CSS سطح 4 از زمان انتشار 52 توسط Chrome پشتیبانی میشود، اما WebView در حال حاضر این ویژگی را غیرفعال میکند زیرا برنامههای اندروید موجود حاوی رنگهای 32 بیتی هگزا در ترتیب Android (ARGB) هستند که باعث خطاهای رندر میشود.
برای مثال، رنگ #80ff8080
در حال حاضر در WebView به صورت قرمز روشن مات ( #ff8080
) برای برنامههایی که سطوح API 27 یا پایینتر را هدف قرار میدهند، ارائه میشود. جزء اصلی (که توسط Android به عنوان جزء آلفا تفسیر می شود) در حال حاضر نادیده گرفته شده است. اگر یک برنامه سطح API 28 یا بالاتر را هدف قرار دهد، #80ff8080
به عنوان 50٪ سبز روشن ( #80ff80
) تفسیر می شود.
نوع MIME sniffing برای فایل: URIs
نسخه های اندرویدی زودتر از اندروید 9 می توانند انواع MIME را از محتوای فایل استنباط کنند. برنامههایی که با Android 9 (سطح API 28) شروع میشوند، هنگام بارگیری file:
URIs در WebView .
استفاده از محتویات فایل برای استنباط انواع MIME می تواند منبع اشکالات امنیتی باشد و این معمولاً توسط مرورگرهای مدرن مجاز نیست.
اگر فایلی دارای پسوند فایل شناخته شده ای مانند .html
، .txt
، .js
، یا .css
باشد، نوع MIME توسط پسوند تعیین می شود. اگر فایلی فاقد پسوند یا نامشخص باشد، نوع MIME متن ساده خواهد بود.
به عنوان مثال، یک URI مانند file:///sdcard/test.html
به صورت HTML ارائه می شود، اما یک URI مانند file:///sdcard/test
به صورت متن ساده ارائه می شود، حتی اگر فایل حاوی داده های HTML باشد.
عنصر پیمایش سند
اندروید 9 به درستی مواردی را که عنصر ریشه سند، عنصر پیمایش است، کنترل می کند. در نسخههای قبلی، موقعیت اسکرول روی عنصر بدنه تنظیم شده بود و عنصر ریشه دارای مقادیر اسکرول صفر بود. Android 9 رفتار منطبق با استانداردها را فعال می کند که در آن عنصر پیمایش عنصر اصلی است .
علاوه بر این، دسترسی مستقیم به document.body.scrollTop
، document.body.scrollLeft
، document.documentElement.scrollTop
یا document.documentElement.scrollLeft
بسته به SDK هدف، رفتار متفاوتی خواهد داشت. برای دسترسی به مقادیر اسکرول viewport، در صورت موجود بودن، از document.scrollingElement
استفاده کنید.
اعلان های برنامه های تعلیق شده
قبل از اندروید 9، اعلانهای برنامههای تعلیق شده لغو شده بودند. با شروع اندروید 9، اعلانهای برنامههای تعلیق شده تا زمانی که برنامه از سر گرفته شود، پنهان میشوند.