تغییرات رفتار: برنامه هایی که سطح API 28+ را هدف قرار می دهند

اندروید ۹ (API سطح ۲۸) تعدادی تغییر در سیستم اندروید ایجاد می‌کند. تغییرات رفتاری زیر منحصراً برای برنامه‌هایی اعمال می‌شود که API سطح ۲۸ یا بالاتر را هدف قرار می‌دهند. برنامه‌هایی که targetSdkVersion روی API سطح ۲۸ یا بالاتر تنظیم می‌کنند، باید برنامه‌های خود را برای پشتیبانی صحیح از این رفتارها، در صورت لزوم برای برنامه، اصلاح کنند.

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

خدمات پیش‌زمینه

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

اگر برنامه‌ای که اندروید ۹ یا بالاتر را هدف قرار می‌دهد، بدون درخواست FOREGROUND_SERVICE سعی در ایجاد یک سرویس پیش‌زمینه داشته باشد، سیستم یک SecurityException صادر می‌کند.

تغییرات حریم خصوصی

اگر برنامه شما اندروید ۹ را هدف قرار داده است، باید تغییرات رفتاری زیر را در نظر داشته باشید. این به‌روزرسانی‌ها در سریال دستگاه و اطلاعات DNS، حریم خصوصی کاربر را بهبود می‌بخشند.

منسوخ شدن شماره سریال ساخت

در اندروید ۹، Build.SERIAL همیشه روی "UNKNOWN" تنظیم شده است تا از حریم خصوصی کاربران محافظت شود.

اگر برنامه شما نیاز به دسترسی به شماره سریال سخت‌افزار دستگاه دارد، باید مجوز READ_PHONE_STATE را درخواست کنید، سپس getSerial() را فراخوانی کنید.

حریم خصوصی DNS

برنامه‌هایی که اندروید ۹ را هدف قرار می‌دهند باید از APIهای DNS خصوصی پشتیبانی کنند. به طور خاص، برنامه‌ها باید اطمینان حاصل کنند که اگر حل‌کننده سیستم از DNS-over-TLS استفاده می‌کند، هر کلاینت DNS داخلی یا از DNS رمزگذاری شده با همان نام میزبان سیستم استفاده می‌کند یا به نفع حل‌کننده سیستم غیرفعال می‌شود.

تغییرات امنیتی چارچوب

اندروید ۹ شامل چندین تغییر رفتاری است که امنیت برنامه شما را بهبود می‌بخشد، اما این تغییرات فقط در صورتی اعمال می‌شوند که برنامه شما سطح API 28 یا بالاتر را هدف قرار دهد.

TLS شبکه به طور پیش‌فرض فعال است

اگر برنامه شما اندروید ۹ یا بالاتر را هدف قرار می‌دهد، متد isCleartextTrafficPermitted() به طور پیش‌فرض false را برمی‌گرداند. اگر برنامه شما نیاز به فعال کردن cleartext برای دامنه‌های خاص دارد، باید در تنظیمات امنیت شبکه برنامه خود، cleartextTrafficPermitted را برای آن دامنه‌ها به طور صریح روی true تنظیم کنید.

دایرکتوری‌های داده مبتنی بر وب که بر اساس فرآیند از هم جدا شده‌اند

به منظور بهبود پایداری برنامه و یکپارچگی داده‌ها در اندروید ۹، برنامه‌ها نمی‌توانند یک دایرکتوری داده WebView را بین چندین فرآیند به اشتراک بگذارند. معمولاً چنین دایرکتوری‌های داده‌ای کوکی‌ها، حافظه‌های نهان HTTP و سایر حافظه‌های دائمی و موقت مربوط به مرور وب را ذخیره می‌کنند.

در بیشتر موارد، برنامه شما باید از کلاس‌های پکیج android.webkit ، مانند WebView و CookieManager ، فقط در یک فرآیند استفاده کند. به عنوان مثال، شما باید تمام اشیاء Activity که از WebView استفاده می‌کنند را به همان فرآیند منتقل کنید. می‌توانید با فراخوانی disableWebView() در فرآیندهای دیگر برنامه خود، قانون "فقط یک فرآیند" را با دقت بیشتری اجرا کنید. این فراخوانی از مقداردهی اولیه اشتباه WebView در آن فرآیندهای دیگر جلوگیری می‌کند، حتی اگر از یک کتابخانه وابسته فراخوانی شود.

اگر برنامه شما باید از نمونه‌های WebView در بیش از یک فرآیند استفاده کند، باید قبل از استفاده از یک نمونه مشخص از WebView در آن فرآیند، با استفاده از متد WebView.setDataDirectorySuffix() یک پسوند دایرکتوری داده منحصر به فرد برای هر فرآیند اختصاص دهید. این متد، داده‌های وب را از هر فرآیند در دایرکتوری مخصوص به خود در دایرکتوری داده‌های برنامه شما قرار می‌دهد.

دامنه‌های SELinux برای هر برنامه

برنامه‌هایی که اندروید ۹ یا بالاتر را هدف قرار می‌دهند، نمی‌توانند داده‌ها را با سایر برنامه‌ها با استفاده از مجوزهای یونیکس قابل دسترسی جهانی به اشتراک بگذارند. این تغییر، یکپارچگی Android Application Sandbox را بهبود می‌بخشد، به ویژه الزام دسترسی به داده‌های خصوصی یک برنامه فقط توسط آن برنامه.

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

تغییرات اتصال

شمارش داده‌های اتصال و چندمسیری

در برنامه‌هایی که اندروید ۹ یا بالاتر را هدف قرار می‌دهند، سیستم ترافیک شبکه را در شبکه‌هایی که پیش‌فرض فعلی نیستند - مانند ترافیک تلفن همراه در حالی که دستگاه به Wi-Fi متصل است - شمارش می‌کند و متدهایی را در کلاس NetworkStatsManager برای جستجوی آن ترافیک ارائه می‌دهد.

به طور خاص، getMultipathPreference() اکنون مقداری را بر اساس ترافیک شبکه فوق الذکر برمی‌گرداند. از اندروید ۹ به بعد، این متد برای داده‌های سلولی true را برمی‌گرداند، اما وقتی بیش از مقدار مشخصی ترافیک در یک روز جمع شود، شروع به برگرداندن false می‌کند. برنامه‌هایی که روی اندروید ۹ اجرا می‌شوند باید این متد را فراخوانی کرده و به این نکته توجه کنند.

کلاس ConnectivityManager.NetworkCallback اکنون اطلاعات مربوط به VPNها را به برنامه‌ها ارسال می‌کند. این تغییر، گوش دادن به رویدادهای اتصال را برای برنامه‌ها بسیار آسان‌تر می‌کند، بدون اینکه مجبور باشند فراخوانی‌های همزمان و غیرهمزمان را با هم ترکیب کنند و از APIهای محدود استفاده کنند. علاوه بر این، به این معنی است که انتقال اطلاعات هنگامی که یک دستگاه به طور همزمان به چندین شبکه Wi-Fi یا چندین شبکه سلولی متصل است، همانطور که انتظار می‌رود، کار می‌کند.

منسوخ شدن کلاینت HTTP آپاچی

با اندروید ۶.۰، پشتیبانی از کلاینت HTTP آپاچی را حذف کردیم . از اندروید ۹ به بعد، این کتابخانه از مسیر بوت کلاس حذف شده و به طور پیش‌فرض برای برنامه‌ها در دسترس نیست.

برای ادامه استفاده از کلاینت HTTP آپاچی، برنامه‌هایی که اندروید ۹ و بالاتر را هدف قرار می‌دهند می‌توانند موارد زیر را به AndroidManifest.xml خود اضافه کنند:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

به عنوان جایگزینی برای استفاده از کتابخانه آپاچی در زمان اجرا، برنامه‌ها می‌توانند نسخه مخصوص به خود از کتابخانه org.apache.http را در APK خود قرار دهند. اگر این کار را انجام دهید، باید کتابخانه را (با ابزاری مانند Jar Jar ) مجدداً بسته‌بندی کنید تا از مشکلات سازگاری کلاس با کلاس‌های ارائه شده در زمان اجرا جلوگیری شود.

تغییرات رابط کاربری

مشاهده فوکوس

نماهایی با مساحت ۰ (چه عرض و چه ارتفاع ۰ باشد) دیگر قابل فوکوس نیستند.

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

مدیریت مقادیر هگز در CSS RGBA

برنامه‌هایی که اندروید ۹ یا بالاتر را هدف قرار می‌دهند، باید رفتار سطح ۴ ماژول رنگ CSS پیش‌نویس را برای مدیریت رنگ‌های CSS با ارقام هگز ۴ و ۸ فعال کنند.

ماژول رنگ CSS سطح ۴ از نسخه ۵۲ توسط کروم پشتیبانی می‌شود، اما WebView در حال حاضر این ویژگی را غیرفعال می‌کند زیرا مشخص شده است که برنامه‌های اندروید موجود حاوی رنگ‌های هگز ۳۲ بیتی در ترتیب اندروید (ARGB) هستند که باعث خطاهای رندر می‌شود.

برای مثال، رنگ #80ff8080 در حال حاضر در WebView به صورت قرمز روشن مات ( #ff8080 ) برای برنامه‌هایی که سطح API 27 یا پایین‌تر را هدف قرار می‌دهند، رندر می‌شود. کامپوننت اصلی (که توسط اندروید به عنوان کامپوننت آلفا تفسیر می‌شود) در حال حاضر نادیده گرفته می‌شود. اگر برنامه‌ای سطح API 28 یا بالاتر را هدف قرار دهد، #80ff8080 به صورت سبز روشن 50٪ شفاف ( #80ff80 ) تفسیر می‌شود.

شنود نوع MIME برای فایل: URI ها

نسخه‌های اندروید قبل از اندروید ۹ می‌توانستند انواع MIME را از محتوای فایل استنباط کنند. از اندروید ۹ (سطح API ۲۸) به بعد، برنامه‌ها باید هنگام بارگذاری file: URIها در یک WebView .

استفاده از محتویات فایل برای استنباط انواع MIME می‌تواند منبع اشکالات امنیتی باشد و این امر عموماً توسط مرورگرهای مدرن مجاز نیست.

اگر فایلی پسوند شناخته‌شده‌ای مانند .html ، .txt ، .js یا .css داشته باشد، نوع MIME آن بر اساس پسوندش تعیین می‌شود. اگر فایلی پسوندی نداشته باشد یا پسوندش شناخته‌شده نباشد، نوع MIME آن متن ساده خواهد بود.

برای مثال، یک URI مانند file:///sdcard/test.html به صورت HTML رندر می‌شود، اما یک URI مانند file:///sdcard/test به صورت متن ساده رندر می‌شود، حتی اگر فایل حاوی داده‌های HTML باشد.

عنصر پیمایش سند

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

علاوه بر این، دسترسی مستقیم به document.body.scrollTop ، document.body.scrollLeft ، document.documentElement.scrollTop یا document.documentElement.scrollLeft بسته به SDK هدف، رفتار متفاوتی خواهد داشت. برای دسترسی به مقادیر اسکرول viewport، در صورت وجود از document.scrollingElement استفاده کنید.

اعلان‌های برنامه‌های معلق

قبل از اندروید ۹، اعلان‌های برنامه‌های معلق لغو می‌شدند. از اندروید ۹ به بعد، اعلان‌های برنامه‌های معلق تا زمانی که برنامه دوباره اجرا شود، پنهان می‌مانند.