اندروید 9 (سطح API 28) تعدادی تغییرات را در سیستم اندروید معرفی می کند. تغییرات رفتاری زیر برای همه برنامهها وقتی روی پلتفرم Android 9 اجرا میشوند، صرفنظر از سطح API مورد نظرشان اعمال میشود. همه توسعهدهندگان باید این تغییرات را بررسی کرده و برنامههای خود را تغییر دهند تا در صورت لزوم، به درستی از آنها پشتیبانی کنند.
برای تغییراتی که فقط بر برنامههایی تأثیر میگذارند که سطح API 28 یا بالاتر را هدف قرار میدهند، به تغییرات رفتار: برنامههایی که API سطح 28+ را هدف قرار میدهند، مراجعه کنید.
مدیریت نیرو
اندروید 9 ویژگی های جدیدی را برای بهبود مدیریت انرژی دستگاه معرفی می کند. این تغییرات، همراه با ویژگیهایی که قبلاً قبل از اندروید 9 وجود داشت، کمک میکند تا اطمینان حاصل شود که منابع سیستم در دسترس برنامههایی قرار میگیرد که بیشتر به آنها نیاز دارند.
برای جزئیات، به مدیریت نیرو مراجعه کنید.
حریم خصوصی تغییر می کند
برای افزایش حریم خصوصی کاربر، اندروید 9 چندین تغییر رفتاری را معرفی میکند، مانند محدود کردن دسترسی برنامههای پسزمینه به حسگرهای دستگاه، محدود کردن اطلاعات بازیابی شده از اسکنهای Wi-Fi، و قوانین جدید مجوز و گروههای مجوز مربوط به تماسهای تلفنی، وضعیت تلفن و Wi- اسکن Fi
این تغییرات بدون در نظر گرفتن نسخه SDK هدف، بر تمام برنامه های اجرا شده در اندروید 9 تأثیر می گذارد.
دسترسی محدود به حسگرها در پس زمینه
اندروید 9 امکان دسترسی برنامههای پسزمینه به ورودیهای کاربر و دادههای حسگر را محدود میکند. اگر برنامه شما در پسزمینه دستگاهی با Android 9 اجرا میشود، سیستم محدودیتهای زیر را برای برنامه شما اعمال میکند:
- برنامه شما نمی تواند به میکروفون یا دوربین دسترسی پیدا کند.
- حسگرهایی که از حالت گزارش مداوم استفاده می کنند، مانند شتاب سنج و ژیروسکوپ، رویدادها را دریافت نمی کنند.
- حسگرهایی که از حالتهای گزارش لحظهای یا یکشات استفاده میکنند، رویدادها را دریافت نمیکنند.
اگر برنامه شما نیاز به تشخیص رویدادهای حسگر در دستگاههای دارای Android 9 دارد، از سرویس پیشزمینه استفاده کنید.
دسترسی محدود به گزارش تماس ها
Android 9 گروه مجوز CALL_LOG
را معرفی میکند و مجوزهای READ_CALL_LOG
، WRITE_CALL_LOG
و PROCESS_OUTGOING_CALLS
را به این گروه منتقل میکند. در نسخه های قبلی اندروید، این مجوزها در گروه مجوز PHONE
قرار داشتند.
این گروه مجوز CALL_LOG
به کاربران امکان کنترل و دید بهتر برنامههایی را میدهد که به اطلاعات حساس در مورد تماسهای تلفنی مانند خواندن سوابق تماس تلفنی و شناسایی شماره تلفن نیاز دارند.
اگر برنامه شما نیاز به دسترسی به گزارش تماس دارد یا نیاز به پردازش تماسهای خروجی دارد، باید این مجوزها را صریحاً از گروه مجوز CALL_LOG
درخواست کنید. در غیر این صورت، یک SecurityException
رخ می دهد.
توجه: از آنجایی که این مجوزها گروهها را تغییر دادهاند و در زمان اجرا اعطا میشوند، این امکان برای کاربر وجود دارد که از دسترسی برنامه شما به اطلاعات گزارش تماسهای تلفنی خودداری کند. در این حالت، برنامه شما باید بتواند با عدم دسترسی به اطلاعات به خوبی برخورد کند.
اگر برنامه شما از قبل بهترین شیوه های مجوزهای زمان اجرا را دنبال می کند، می تواند تغییر در گروه مجوز را کنترل کند.
دسترسی محدود به شماره تلفن
برنامههایی که روی Android 9 اجرا میشوند، نمیتوانند شماره تلفن یا وضعیت تلفن را بدون دریافت مجوز READ_CALL_LOG
، بعلاوه سایر مجوزهایی که موارد استفاده برنامه شما به آن نیاز دارند، بخوانند.
شمارههای تلفن مرتبط با تماسهای ورودی و خروجی در پخش وضعیت تلفن ، مانند تماسهای ورودی و خروجی، قابل مشاهده هستند و از کلاس PhoneStateListener
قابل دسترسی هستند. با این حال، بدون مجوز READ_CALL_LOG
، قسمت شماره تلفن ارائه شده در پخشهای PHONE_STATE_CHANGED
و از طریق PhoneStateListener
خالی است.
برای خواندن شماره تلفن از وضعیت تلفن، برنامه خود را بهروزرسانی کنید تا مجوزهای لازم را بر اساس مورد استفاده خود درخواست کنید:
- برای خواندن اعداد از اقدام قصد
PHONE_STATE
، هم به مجوزREAD_CALL_LOG
و هم به مجوزREAD_PHONE_STATE
نیاز دارید. - برای خواندن اعداد از
onCallStateChanged()
فقط به مجوزREAD_CALL_LOG
نیاز دارید. شما به مجوزREAD_PHONE_STATE
نیاز ندارید.
دسترسی محدود به مکان Wi-Fi و اطلاعات اتصال
در اندروید 9، الزامات مجوز برای یک برنامه برای انجام اسکن وای فای سخت تر از نسخه های قبلی است. برای جزئیات، محدودیتهای اسکن Wi-Fi را ببینید.
محدودیتهای مشابهی برای متد getConnectionInfo()
نیز اعمال میشود که یک شی WifiInfo
را که اتصال Wi-Fi فعلی را توصیف میکند، برمیگرداند. فقط در صورتی میتوانید از روشهای این شی برای بازیابی مقادیر SSID و BSSID استفاده کنید که برنامه تماسگیرنده مجوزهای زیر را داشته باشد:
- ACCESS_FINE_LOCATION یا ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
برای بازیابی SSID یا BSSID نیز باید خدمات مکان در دستگاه فعال شود (در زیر تنظیمات > مکان ).
اطلاعات از روشهای سرویس Wi-Fi حذف شد
در Android 9، رویدادها و پخشهای زیر اطلاعاتی درباره موقعیت مکانی کاربر یا دادههای قابل شناسایی شخصی دریافت نمیکنند:
- متدهای
getScanResults()
وgetConnectionInfo()
ازWifiManager
. - متدهای
discoverServices()
وaddServiceRequest()
ازWifiP2pManager
. - پخش
NETWORK_STATE_CHANGED_ACTION
.
سیستم NETWORK_STATE_CHANGED_ACTION
که از Wi-Fi پخش میشود، دیگر حاوی SSID (قبلا EXTRA_SSID)، BSSID (قبلا EXTRA_BSSID) یا اطلاعات اتصال (قبلاً EXTRA_NETWORK_INFO) نیست. اگر برنامه شما به این اطلاعات نیاز دارد، به جای آن با getConnectionInfo()
تماس بگیرید.
اطلاعات تلفن اکنون به تنظیمات مکان دستگاه متکی است
اگر کاربر مکان دستگاه را در دستگاهی که Android 9 دارد غیرفعال کرده باشد، روشهای زیر نتیجهای را ارائه نمیدهند:
محدودیت در استفاده از رابط های غیر SDK
برای کمک به اطمینان از ثبات و سازگاری برنامه، پلتفرم استفاده از برخی روشها و زمینههای غیر SDK را محدود میکند. این محدودیتها اعمال میشوند چه بخواهید مستقیماً به این روشها و فیلدها دسترسی داشته باشید، از طریق بازتاب یا با استفاده از JNI. در Android 9، برنامه شما میتواند همچنان به این رابطهای محدود دسترسی داشته باشد. این پلتفرم از نان تست ها و ورودی های گزارش استفاده می کند تا توجه شما را جلب کند. اگر برنامه شما چنین نان تستی را نشان می دهد، مهم است که استراتژی پیاده سازی دیگری غیر از رابط کاربری محدود را دنبال کنید. اگر فکر می کنید که هیچ استراتژی جایگزینی امکان پذیر نیست، می توانید یک اشکال را برای درخواست تجدید نظر در محدودیت ارسال کنید.
محدودیتها در رابطهای غیر SDK حاوی اطلاعات مهم دیگری است. باید آن را بررسی کنید تا مطمئن شوید که برنامه شما به درستی کار می کند.
رفتار امنیتی تغییر می کند
تغییرات امنیتی دستگاه
Android 9 چندین قابلیت اضافه می کند که امنیت برنامه شما را بهبود می بخشد، صرف نظر از اینکه برنامه شما کدام نسخه را هدف قرار می دهد.
تغییرات پیاده سازی TLS
پیاده سازی TLS سیستم در اندروید 9 دستخوش تغییرات زیادی شده است:
- اگر نمونه ای از
SSLSocket
در حین ایجاد اتصال نتواند، سیستم یکIOException
به جایNullPointerException
پرتاب می کند. - کلاس
SSLEngine
به طور تمیز با هر هشدارclose_notify
که رخ می دهد کنترل می کند.
برای کسب اطلاعات بیشتر در مورد ایجاد درخواست های وب ایمن در یک برنامه Android، یک مثال HTTPS را ببینید.
فیلتر SECCOMP دقیق تر
اندروید 9 تماسهای سیستمی را که برای برنامهها در دسترس است محدودتر میکند. این رفتار یک برنامه افزودنی از فیلتر SECCOMP است که Android 8.0 (سطح API 26) شامل می شود .
تغییرات رمزنگاری
اندروید 9 تغییرات زیادی را در پیاده سازی و مدیریت الگوریتم های رمزنگاری ایجاد می کند.
پیاده سازی پارامترها و الگوریتم ها را رمزگذاری کنید
اندروید 9 پیاده سازی های اضافی پارامترهای الگوریتم را در Conscrypt ارائه می دهد. این پارامترها عبارتند از: AES، DESEDE، OAEP و EC. نسخههای Bouncy Castle این پارامترها و بسیاری از الگوریتمها از اندروید 9 منسوخ شدهاند.
اگر برنامه شما Android 8.1 (سطح API 27) یا پایینتر را هدف قرار میدهد، هنگام درخواست اجرای Bouncy Castle از یکی از این الگوریتمهای منسوخ، هشداری دریافت میکنید. با این حال، اگر اندروید 9 را هدف قرار دهید، هر یک از این درخواستها یک NoSuchAlgorithmException
میدهند.
تغییرات دیگر
اندروید 9 چندین تغییر دیگر مرتبط با رمزنگاری را معرفی می کند:
- هنگام استفاده از کلیدهای PBE، اگر Bouncy Castle منتظر یک بردار اولیه (IV) باشد و برنامه شما یکی را ارائه نکند، یک هشدار دریافت میکنید.
- اجرای Conscrypt رمز ARC4 به شما امکان می دهد ARC4/ECB/NoPadding یا ARC4/NONE/NoPadding را مشخص کنید.
- ارائه دهنده Crypto Java Cryptography Architecture (JCA) حذف شده است. در نتیجه، اگر برنامه شما
SecureRandom.getInstance("SHA1PRNG", "Crypto")
را فراخوانی کند، یکNoSuchProviderException
رخ می دهد. - اگر برنامه شما کلیدهای RSA را از بافرهایی که بزرگتر از ساختار کلید هستند تجزیه کند، دیگر استثنایی رخ نخواهد داد.
برای کسب اطلاعات بیشتر در مورد استفاده از قابلیتهای رمزنگاری اندروید، به Cryptography مراجعه کنید.
فایلهای رمزگذاری شده امن Android دیگر پشتیبانی نمیشوند
اندروید 9 به طور کامل پشتیبانی از فایل های رمزگذاری شده ایمن اندروید (ASEC) را حذف می کند.
در Android 2.2 (سطح API 8)، اندروید ASEC ها را برای پشتیبانی از عملکرد برنامه ها روی کارت SD معرفی کرد. در Android 6.0 (سطح API 23)، این پلتفرم یک فناوری دستگاه ذخیره سازی قابل قبول را معرفی کرد که توسعه دهندگان می توانند به جای ASEC از آن استفاده کنند.
به روز رسانی کتابخانه های ICU
اندروید 9 از نسخه 60 کتابخانه ICU استفاده می کند. اندروید 8.0 (سطح API 26) و اندروید 8.1 (سطح API 27) از ICU 58 استفاده می کنند.
ICU برای ارائه APIهای عمومی در زیر android.icu package
استفاده می شود و به صورت داخلی در پلتفرم Android برای پشتیبانی بین المللی استفاده می شود. به عنوان مثال، برای پیاده سازی کلاس های اندروید در java.util
، java.text
و android.text.format
استفاده می شود.
بهروزرسانی ICU 60 شامل بسیاری از تغییرات کوچک اما مفید است، از جمله پشتیبانی از دادههای Emoji 5.0 و فرمتهای تاریخ/زمان بهبود یافته، همانطور که در یادداشتهای انتشار ICU 59 و ICU 60 مستند شده است.
تغییرات قابل توجه در این به روز رسانی:
- نحوه مدیریت این پلتفرم با مناطق زمانی تغییر کرده است.
- پلتفرم GMT و UTC را بهتر مدیریت می کند. UTC دیگر مترادف GMT نیست.
ICU اکنون نام مناطق ترجمه شده را برای GMT و UTC ارائه می دهد. این تغییر قالببندی
android.icu
و رفتار تجزیه را برای مناطقی مانند "GMT"، "Etc/GMT"، "UTC"، "Etc/UTC" و "Zulu" تحت تاثیر قرار میدهد. -
java.text.SimpleDateFormat
اکنون از ICU برای ارائه نام های نمایشی برای UTC /GMT استفاده می کند، به این معنی:- قالب بندی
zzzz
یک رشته محلی طولانی برای بسیاری از مناطق ایجاد می کند. قبلاً "UTC" برای UTC و رشته هایی مانند "GMT+00:00" برای GMT تولید می کرد. - تجزیه
zzzz
رشته هایی مانند "زمان هماهنگ جهانی" و "زمان میانگین گرینویچ" را تشخیص می دهد. - اگر برنامهها فرض کنند که «UTC» یا «GMT+00:00» برای
zzzz
در همه زبانها خروجی دارند، ممکن است با مشکلات سازگاری مواجه شوند.
- قالب بندی
- رفتار
java.text.DateFormatSymbols.getZoneStrings()
تغییر کرده است:- همانند
SimpleDateFormat
، UTC و GMT اکنون نام های طولانی دارند. انواع DST نامهای منطقه زمانی برای منطقه UTC، مانند "UTC"، "Etc/UTC" و "Zulu" به GMT+00:00 تبدیل میشوند، که زمانی که نامی در دسترس نباشد، بازگشتی استاندارد است. رشته کد سختUTC
. - برخی از شناسههای ناحیه به درستی بهعنوان مترادف مناطق دیگر شناخته میشوند، بنابراین Android رشتههایی را برای شناسههای منطقه قدیمی، مانند
Eire
پیدا میکند که قبلاً قابل حل نبودند.
- همانند
- آسیا/هانوی دیگر یک منطقه شناخته شده نیست. به همین دلیل
java.util.TimeZones.getAvailableIds()
این مقدار را بر نمی گرداند وjava.util.TimeZone.getTimeZone()
آن را تشخیص نمی دهد. این رفتار با رفتارandroid.icu
موجود مطابقت دارد.
- پلتفرم GMT و UTC را بهتر مدیریت می کند. UTC دیگر مترادف GMT نیست.
- روش
android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String)
ممکن است حتی در هنگام تجزیه متن ارز قانونی، یکParseException
ایجاد کند. با استفاده ازNumberFormat.parseCurrency
، که از Android نسخه 7.0 (سطح API 24) برای متن ارز به سبکPLURALCURRENCYSTYLE
در دسترس است، از این مشکل جلوگیری کنید.
تغییرات تست اندروید
اندروید 9 تغییرات متعددی را در ساختار کتابخانه و کلاس چارچوب Android Test ایجاد می کند. این تغییرات به توسعه دهندگان کمک می کند تا از API های عمومی با پشتیبانی از چارچوب استفاده کنند، اما این تغییرات همچنین به انعطاف پذیری بیشتری در ساخت و اجرای آزمایش ها با استفاده از کتابخانه های شخص ثالث یا منطق سفارشی اجازه می دهد.
کتابخانه ها از چارچوب حذف شدند
Android 9 کلاسهای مبتنی بر JUnit را در سه کتابخانه سازماندهی مجدد میکند: android.test.base ، android.test.runner و android.test.mock . این تغییر به شما امکان میدهد آزمایشهایی را بر روی نسخهای از JUnit اجرا کنید که با وابستگیهای پروژه شما بهترین کار را دارد. این نسخه از JUnit ممکن است با نسخه ای که android.jar
ارائه می دهد متفاوت باشد.
برای کسب اطلاعات بیشتر درباره نحوه سازماندهی کلاسهای مبتنی بر JUnit در این کتابخانهها، و همچنین نحوه آمادهسازی پروژه برنامهتان برای نوشتن و اجرای آزمایشها، به راهاندازی پروژه برای تست Android مراجعه کنید.
آزمایش تغییرات ساخت مجموعه
متد addRequirements()
در کلاس TestSuiteBuilder
حذف شده است و خود کلاس TestSuiteBuilder
منسوخ شده است. متد addRequirements()
توسعه دهندگان را ملزم به ارائه آرگومان هایی می کرد که انواع آنها API های مخفی هستند و باعث می شود API نامعتبر باشد.
رسیور جاوا UTF
UTF-8 مجموعه نویسه های پیش فرض در اندروید است. یک دنباله بایت UTF-8 را می توان توسط یک سازنده String
، مانند String(byte[] bytes)
رمزگشایی کرد.
رمزگشای UTF-8 در اندروید 9 از استانداردهای یونیکد با دقت بیشتری نسبت به نسخه های قبلی پیروی می کند. تغییرات شامل موارد زیر است:
- غیرکوتاه ترین شکل UTF-8، مانند
<C0, AF>
، به عنوان بد شکل تلقی می شود. - شکل جانشین UTF-8، مانند
U+D800
..U+DFFF
، به عنوان بد شکل تلقی می شود. - بخش فرعی حداکثر با یک واحد
U+FFFD
جایگزین میشود. به عنوان مثال، در دنباله بایت "41 C0 AF 41 F4 80 80 41
"، بیشترین قسمت های فرعی "C0
"، "AF
" و "F4 80 80
" هستند. "F4 80 80
" می تواند زیر دنباله اولیه "F4 80 80 80
" باشد، اما "C0
" نمی تواند دنباله ابتدایی هر دنباله واحد کد به خوبی شکل گرفته باشد. بنابراین، خروجی باید "A\ufffd\ufffdA\ufffdA
" باشد. - برای رمزگشایی یک دنباله UTF-8 / CESU-8 اصلاح شده در Android 9 یا بالاتر، از متد
DataInputStream.readUTF()
یا روشNewStringUTF()
JNI استفاده کنید.
تأیید نام میزبان با استفاده از گواهی
RFC 2818 دو روش را برای تطبیق یک نام دامنه با یک گواهی توصیف می کند - با استفاده از نام های موجود در پسوند subjectAltName
( SAN
) یا در صورت عدم وجود پسوند SAN
، بازگشت به commonName
( CN
).
با این حال، بازگشت به CN
در RFC 2818 منسوخ شد. به همین دلیل، Android دیگر به استفاده از CN
برنمیگردد. برای تأیید نام میزبان، سرور باید یک گواهی با SAN
منطبق ارائه دهد. گواهینامه هایی که حاوی SAN
مطابق با نام میزبان نیستند، دیگر قابل اعتماد نیستند.
جستجوی آدرس شبکه می تواند باعث نقض شبکه شود
جستجوی آدرس شبکه که نیاز به تفکیک نام دارد میتواند شامل I/O شبکه باشد و بنابراین عملیات مسدود کردن در نظر گرفته میشود. عملیات مسدود کردن روی رشته اصلی می تواند باعث مکث یا jank شود.
کلاس StrictMode
یک ابزار توسعه است که به توسعه دهندگان کمک می کند تا مشکلات موجود در کد خود را شناسایی کنند.
در Android 9 و بالاتر، StrictMode
نقضهای شبکه ناشی از جستجوی آدرس شبکه را که به وضوح نام نیاز دارند، شناسایی میکند.
شما نباید برنامه های خود را با فعال بودن StrictMode
ارسال کنید. اگر این کار را انجام دهید، برنامههای شما میتوانند استثناهایی مانند NetworkOnMainThreadException
را هنگام استفاده از روشهای detectNetwork()
یا detectAll()
برای دریافت خطمشی که نقضهای شبکه را شناسایی میکند، تجربه کنند.
حل یک آدرس IP عددی یک عملیات مسدود کردن در نظر گرفته نمی شود. وضوح آدرس IP عددی مانند نسخه های قبل از اندروید 9 کار می کند.
برچسب گذاری سوکت
در نسخههای پلتفرم پایینتر از اندروید 9، اگر سوکتی با استفاده از متد setThreadStatsTag()
برچسبگذاری شود، زمانی که سوکت با استفاده از IPC بایندر با ظرف ParcelFileDescriptor
به فرآیند دیگری ارسال میشود، برچسبگذاری نمیشود.
در اندروید 9 و بالاتر، تگ سوکت زمانی که با استفاده از بایندر IPC به فرآیند دیگری ارسال میشود، حفظ میشود. این تغییر می تواند بر آمار ترافیک شبکه تأثیر بگذارد، به عنوان مثال، هنگام استفاده از متد queryDetailsForUidTag()
.
اگر میخواهید رفتار نسخههای قبلی را حفظ کنید، که سوکتی را که به فرآیند دیگری فرستاده میشود حذف میکند، میتوانید قبل از ارسال سوکت untagSocket()
را فراخوانی کنید.
مقدار بایت های موجود در سوکت گزارش شده است
متد available()
پس از فراخوانی متد shutdownInput()
0
برمی گرداند.
گزارش دقیق تر قابلیت های شبکه برای VPN ها
در Android 8.1 (سطح API 27) و پایینتر، کلاس NetworkCapabilities
فقط مجموعه محدودی از اطلاعات را برای VPNها، مانند TRANSPORT_VPN
گزارش میکند، اما NET_CAPABILITY_NOT_VPN
را حذف میکند. این اطلاعات محدود، تعیین اینکه آیا استفاده از VPN میتواند هزینههایی را برای کاربر برنامه به همراه داشته باشد، دشوار میکرد. به عنوان مثال، بررسی NET_CAPABILITY_NOT_METERED
تعیین نمی کند که آیا شبکه های اصلی اندازه گیری شده اند یا خیر.
در اندروید 9 و بالاتر، وقتی یک VPN متد setUnderlyingNetworks()
فراخوانی میکند، سیستم Android انتقالها و قابلیتهای هر شبکه زیربنایی را ادغام میکند و نتیجه را به عنوان قابلیتهای شبکه موثر شبکه VPN برمیگرداند.
در Android 9 و بالاتر، برنامههایی که قبلاً NET_CAPABILITY_NOT_METERED
را بررسی میکنند، قابلیتهای شبکه VPN و شبکههای زیربنایی را دریافت میکنند.
فایلهای موجود در پوشه xt_qtaguid دیگر در دسترس برنامهها نیستند
با شروع اندروید 9، برنامهها اجازه دسترسی خواندن مستقیم به فایلهای موجود در پوشه /proc/net/xt_qtaguid
را ندارند. دلیل آن اطمینان از سازگاری با برخی از دستگاه هایی است که اصلاً این فایل ها را ندارند.
API های عمومی که به این فایل ها متکی هستند، TrafficStats
و NetworkStatsManager
، همچنان به کار خود ادامه می دهند. با این حال، توابع cutils پشتیبانینشده، مانند qtaguid_tagSocket()
ممکن است آنطور که انتظار میرود – یا اصلاً – در دستگاههای مختلف کار نکنند.
الزام FLAG_ACTIVITY_NEW_TASK اکنون اجرا می شود
با Android 9، نمیتوانید فعالیتی را از یک زمینه غیرفعالی شروع کنید، مگر اینکه پرچم قصد FLAG_ACTIVITY_NEW_TASK
را پاس کنید. اگر بخواهید بدون عبور از این پرچم فعالیتی را شروع کنید، فعالیت شروع نمی شود و سیستم پیامی را در گزارش چاپ می کند.
چرخش صفحه نمایش تغییر می کند
با شروع اندروید 9، تغییرات قابل توجهی در حالت چرخش پرتره وجود دارد. در اندروید 8.0 (سطح API 26)، کاربران میتوانند با استفاده از کاشی تنظیمات سریع یا تنظیمات نمایش، بین حالتهای چرخش خودکار و چرخش عمودی جابهجا شوند. حالت عمودی به قفل چرخشی تغییر نام داده است و هنگامی که چرخش خودکار خاموش شود فعال است. هیچ تغییری در حالت چرخش خودکار وجود ندارد.
هنگامی که دستگاه در حالت قفل چرخشی است، کاربران می توانند صفحه نمایش خود را به هر چرخشی که توسط فعالیت قابل مشاهده بالا پشتیبانی می شود قفل کنند. یک فعالیت نباید فرض کند که همیشه به صورت پرتره ارائه می شود. اگر میتوان فعالیت بالا را در حالت چرخش خودکار در چندین چرخش ارائه کرد، همان گزینهها باید در حالت قفل چرخشی در دسترس باشند، با برخی استثناها بر اساس تنظیمات screenOrientation
فعالیت (جدول زیر را ببینید).
فعالیتهایی که جهتگیری خاصی را درخواست میکنند (مثلاً screenOrientation=landscape
)، اولویت قفل کاربر را نادیده میگیرند و مانند Android 8.0 رفتار میکنند.
تنظیمات ترجیحی جهت صفحه را می توان در سطح Activity در مانیفست Android یا به صورت برنامه نویسی با setRequestedOrientation () تنظیم کرد.
حالت قفل چرخش با تنظیم اولویت چرخش کاربر که WindowManager هنگام مدیریت چرخش فعالیت استفاده می کند، کار می کند. ترجیح چرخش کاربر ممکن است در موارد زیر تغییر کند. توجه داشته باشید که یک سوگیری برای بازگشت به چرخش طبیعی دستگاه وجود دارد که معمولاً برای دستگاههای فاکتور فرم تلفن به صورت عمودی است:
- هنگامی که کاربر یک پیشنهاد چرخش را می پذیرد، اولویت چرخش به پیشنهاد تغییر می کند.
- وقتی کاربر به یک برنامه پرتره اجباری (شامل صفحه قفل یا راهانداز) سوئیچ میکند، اولویت چرخش به حالت عمودی تغییر میکند.
جدول زیر رفتار چرخش را برای جهت گیری های رایج صفحه نمایش خلاصه می کند:
جهت صفحه نمایش | رفتار |
---|---|
نامشخص، کاربر | در چرخش خودکار و قفل چرخش، Activity را می توان به صورت عمودی یا افقی (و برعکس) رندر کرد. انتظار دارید از طرحبندیهای عمودی و افقی پشتیبانی شود. |
userLandscape | در چرخش خودکار و قفل چرخش، Activity میتواند به صورت افقی یا معکوس ارائه شود. انتظار داشته باشید که فقط طرحبندیهای منظره را پشتیبانی کنید. |
کاربر پرتره | در چرخش خودکار و قفل چرخشی، Activity میتواند به صورت عمودی یا معکوس ارائه شود. انتظار می رود که فقط از طرح بندی های پرتره پشتیبانی شود. |
fullUser | در چرخش خودکار و قفل چرخش، Activity را می توان به صورت عمودی یا افقی (و برعکس) رندر کرد. انتظار دارید از طرحبندیهای عمودی و افقی پشتیبانی شود. به کاربران قفل چرخشی این گزینه داده میشود که برای پرتره معکوس قفل کنند، اغلب 180 درجه. |
سنسور، فول سنسور، حسگر پرتره، سنسور منظره | ترجیح حالت قفل چرخش نادیده گرفته می شود و به گونه ای رفتار می شود که گویی چرخش خودکار فعال است. فقط در شرایط استثنایی با در نظر گرفتن UX بسیار دقیق از آن استفاده کنید. |
منسوخ شدن سرویس گیرنده Apache HTTP بر برنامه های دارای ClassLoader غیر استاندارد تأثیر می گذارد
با Android 6.0، پشتیبانی از سرویس گیرنده Apache HTTP را حذف کردیم . این تغییر روی اکثر برنامههایی که اندروید 9 یا بالاتر را هدف قرار نمیدهند، تأثیری ندارد. با این حال، این تغییر میتواند بر برنامههای خاصی که از ساختار ClassLoader
غیراستاندارد استفاده میکنند، تأثیر بگذارد، حتی اگر برنامهها Android 9 یا بالاتر را هدف قرار ندهند.
اگر یک برنامه از ClassLoader
غیر استانداردی استفاده کند که صریحاً به سیستم ClassLoader
محول می شود، ممکن است تحت تأثیر قرار گیرد. این برنامهها باید در عوض وقتی به دنبال کلاسها در org.apache.http.*
به برنامه ClassLoader
واگذار شوند. اگر آنها را به سیستم ClassLoader
واگذار کنند، برنامهها در Android 9 یا بالاتر با NoClassDefFoundError
از کار میافتند، زیرا آن کلاسها دیگر برای ClassLoader
سیستم شناخته نمیشوند. برای جلوگیری از مشکلات مشابه در آینده، برنامه ها به طور کلی باید کلاس ها را از طریق برنامه ClassLoader
بارگیری کنند نه اینکه مستقیماً به ClassLoader
سیستم دسترسی داشته باشند.
شمارش دوربین ها
برنامههایی که روی دستگاههای Android 9 اجرا میشوند میتوانند با فراخوانی getCameraIdList()
هر دوربین موجود را پیدا کنند. یک برنامه نباید تصور کند که دستگاه فقط یک دوربین پشتی یا فقط یک دوربین جلو دارد.
برای مثال، اگر برنامه شما دکمه ای برای جابجایی بین دوربین جلو و عقب دارد، ممکن است بیش از یک دوربین جلو یا عقب برای انتخاب وجود داشته باشد. شما باید فهرست دوربین را طی کنید، ویژگی های هر دوربین را بررسی کنید و تصمیم بگیرید که کدام دوربین را در معرض دید کاربر قرار دهید.
،اندروید 9 (سطح API 28) تعدادی تغییرات را در سیستم اندروید معرفی می کند. تغییرات رفتاری زیر برای همه برنامهها وقتی روی پلتفرم Android 9 اجرا میشوند، صرفنظر از سطح API مورد نظرشان اعمال میشود. همه توسعهدهندگان باید این تغییرات را بررسی کرده و برنامههای خود را تغییر دهند تا در صورت لزوم، به درستی از آنها پشتیبانی کنند.
برای تغییراتی که فقط بر برنامههایی تأثیر میگذارند که سطح API 28 یا بالاتر را هدف قرار میدهند، به تغییرات رفتار: برنامههایی که API سطح 28+ را هدف قرار میدهند، مراجعه کنید.
مدیریت نیرو
اندروید 9 ویژگی های جدیدی را برای بهبود مدیریت انرژی دستگاه معرفی می کند. این تغییرات، همراه با ویژگیهایی که قبلاً قبل از اندروید 9 وجود داشت، کمک میکند تا اطمینان حاصل شود که منابع سیستم در دسترس برنامههایی قرار میگیرد که بیشتر به آنها نیاز دارند.
برای جزئیات، به مدیریت نیرو مراجعه کنید.
حریم خصوصی تغییر می کند
برای افزایش حریم خصوصی کاربر، اندروید 9 چندین تغییر رفتاری را معرفی میکند، مانند محدود کردن دسترسی برنامههای پسزمینه به حسگرهای دستگاه، محدود کردن اطلاعات بازیابی شده از اسکنهای Wi-Fi، و قوانین جدید مجوز و گروههای مجوز مربوط به تماسهای تلفنی، وضعیت تلفن و Wi- اسکن Fi
این تغییرات بدون در نظر گرفتن نسخه SDK هدف، بر تمام برنامه های اجرا شده در اندروید 9 تأثیر می گذارد.
دسترسی محدود به حسگرها در پس زمینه
اندروید 9 امکان دسترسی برنامههای پسزمینه به ورودیهای کاربر و دادههای حسگر را محدود میکند. اگر برنامه شما در پسزمینه دستگاهی با Android 9 اجرا میشود، سیستم محدودیتهای زیر را برای برنامه شما اعمال میکند:
- برنامه شما نمی تواند به میکروفون یا دوربین دسترسی پیدا کند.
- حسگرهایی که از حالت گزارش مداوم استفاده می کنند، مانند شتاب سنج و ژیروسکوپ، رویدادها را دریافت نمی کنند.
- حسگرهایی که از حالتهای گزارش لحظهای یا یکشات استفاده میکنند، رویدادها را دریافت نمیکنند.
اگر برنامه شما نیاز به تشخیص رویدادهای حسگر در دستگاههای دارای Android 9 دارد، از سرویس پیشزمینه استفاده کنید.
دسترسی محدود به گزارش تماس ها
Android 9 گروه مجوز CALL_LOG
را معرفی میکند و مجوزهای READ_CALL_LOG
، WRITE_CALL_LOG
و PROCESS_OUTGOING_CALLS
را به این گروه منتقل میکند. در نسخه های قبلی اندروید، این مجوزها در گروه مجوز PHONE
قرار داشتند.
این گروه مجوز CALL_LOG
به کاربران امکان کنترل و دید بهتر برنامههایی را میدهد که به اطلاعات حساس در مورد تماسهای تلفنی مانند خواندن سوابق تماس تلفنی و شناسایی شماره تلفن نیاز دارند.
اگر برنامه شما نیاز به دسترسی به گزارش تماس دارد یا نیاز به پردازش تماسهای خروجی دارد، باید این مجوزها را صریحاً از گروه مجوز CALL_LOG
درخواست کنید. در غیر این صورت، یک SecurityException
رخ می دهد.
توجه: از آنجایی که این مجوزها گروهها را تغییر دادهاند و در زمان اجرا اعطا میشوند، این امکان برای کاربر وجود دارد که از دسترسی برنامه شما به اطلاعات گزارش تماسهای تلفنی خودداری کند. در این حالت، برنامه شما باید بتواند با عدم دسترسی به اطلاعات به خوبی برخورد کند.
اگر برنامه شما از قبل بهترین شیوه های مجوزهای زمان اجرا را دنبال می کند، می تواند تغییر در گروه مجوز را کنترل کند.
دسترسی محدود به شماره تلفن
برنامههایی که روی Android 9 اجرا میشوند، نمیتوانند شماره تلفن یا وضعیت تلفن را بدون دریافت مجوز READ_CALL_LOG
، بعلاوه سایر مجوزهایی که موارد استفاده برنامه شما به آن نیاز دارند، بخوانند.
شمارههای تلفن مرتبط با تماسهای ورودی و خروجی در پخش وضعیت تلفن ، مانند تماسهای ورودی و خروجی، قابل مشاهده هستند و از کلاس PhoneStateListener
قابل دسترسی هستند. با این حال، بدون مجوز READ_CALL_LOG
، قسمت شماره تلفن ارائه شده در پخشهای PHONE_STATE_CHANGED
و از طریق PhoneStateListener
خالی است.
برای خواندن شماره تلفن از وضعیت تلفن، برنامه خود را بهروزرسانی کنید تا مجوزهای لازم را بر اساس مورد استفاده خود درخواست کنید:
- برای خواندن اعداد از اقدام قصد
PHONE_STATE
، هم به مجوزREAD_CALL_LOG
و هم به مجوزREAD_PHONE_STATE
نیاز دارید. - برای خواندن اعداد از
onCallStateChanged()
فقط به مجوزREAD_CALL_LOG
نیاز دارید. شما به مجوزREAD_PHONE_STATE
نیاز ندارید.
دسترسی محدود به مکان Wi-Fi و اطلاعات اتصال
در اندروید 9، الزامات مجوز برای یک برنامه برای انجام اسکن وای فای سخت تر از نسخه های قبلی است. برای جزئیات، محدودیتهای اسکن Wi-Fi را ببینید.
محدودیتهای مشابهی برای متد getConnectionInfo()
نیز اعمال میشود که یک شی WifiInfo
را که اتصال Wi-Fi فعلی را توصیف میکند، برمیگرداند. فقط در صورتی میتوانید از روشهای این شی برای بازیابی مقادیر SSID و BSSID استفاده کنید که برنامه تماسگیرنده مجوزهای زیر را داشته باشد:
- ACCESS_FINE_LOCATION یا ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
برای بازیابی SSID یا BSSID نیز باید خدمات مکان در دستگاه فعال شود (در زیر تنظیمات > مکان ).
اطلاعات از روشهای سرویس Wi-Fi حذف شد
در Android 9، رویدادها و پخشهای زیر اطلاعاتی درباره موقعیت مکانی کاربر یا دادههای قابل شناسایی شخصی دریافت نمیکنند:
- متدهای
getScanResults()
وgetConnectionInfo()
ازWifiManager
. - متدهای
discoverServices()
وaddServiceRequest()
ازWifiP2pManager
. - پخش
NETWORK_STATE_CHANGED_ACTION
.
سیستم NETWORK_STATE_CHANGED_ACTION
که از Wi-Fi پخش میشود، دیگر حاوی SSID (قبلا EXTRA_SSID)، BSSID (قبلا EXTRA_BSSID) یا اطلاعات اتصال (قبلاً EXTRA_NETWORK_INFO) نیست. اگر برنامه شما به این اطلاعات نیاز دارد، به جای آن با getConnectionInfo()
تماس بگیرید.
اطلاعات تلفن اکنون به تنظیمات مکان دستگاه متکی است
اگر کاربر مکان دستگاه را در دستگاهی که Android 9 دارد غیرفعال کرده باشد، روشهای زیر نتیجهای را ارائه نمیدهند:
محدودیت در استفاده از رابط های غیر SDK
برای کمک به اطمینان از ثبات و سازگاری برنامه، پلتفرم استفاده از برخی روشها و زمینههای غیر SDK را محدود میکند. این محدودیتها اعمال میشوند چه بخواهید مستقیماً به این روشها و فیلدها دسترسی داشته باشید، از طریق بازتاب یا با استفاده از JNI. در Android 9، برنامه شما میتواند همچنان به این رابطهای محدود دسترسی داشته باشد. این پلتفرم از نان تست ها و ورودی های گزارش استفاده می کند تا توجه شما را جلب کند. اگر برنامه شما چنین نان تستی را نشان می دهد، مهم است که استراتژی پیاده سازی دیگری غیر از رابط کاربری محدود را دنبال کنید. اگر فکر می کنید که هیچ استراتژی جایگزینی امکان پذیر نیست، می توانید یک اشکال را برای درخواست تجدید نظر در محدودیت ارسال کنید.
محدودیتها در رابطهای غیر SDK حاوی اطلاعات مهم دیگری است. باید آن را بررسی کنید تا مطمئن شوید که برنامه شما به درستی کار می کند.
رفتار امنیتی تغییر می کند
تغییرات امنیتی دستگاه
Android 9 چندین قابلیت اضافه می کند که امنیت برنامه شما را بهبود می بخشد، صرف نظر از اینکه برنامه شما کدام نسخه را هدف قرار می دهد.
تغییرات پیاده سازی TLS
پیاده سازی TLS سیستم در اندروید 9 دستخوش تغییرات زیادی شده است:
- اگر نمونه ای از
SSLSocket
در حین ایجاد اتصال نتواند، سیستم یکIOException
به جایNullPointerException
پرتاب می کند. - کلاس
SSLEngine
به طور تمیز با هر هشدارclose_notify
که رخ می دهد کنترل می کند.
برای کسب اطلاعات بیشتر در مورد ایجاد درخواست های وب ایمن در یک برنامه Android، یک مثال HTTPS را ببینید.
فیلتر SECCOMP دقیق تر
اندروید 9 تماسهای سیستمی را که برای برنامهها در دسترس است محدودتر میکند. این رفتار یک برنامه افزودنی از فیلتر SECCOMP است که Android 8.0 (سطح API 26) شامل می شود .
تغییرات رمزنگاری
اندروید 9 تغییرات زیادی را در پیاده سازی و مدیریت الگوریتم های رمزنگاری ایجاد می کند.
پیاده سازی پارامترها و الگوریتم ها را رمزگذاری کنید
اندروید 9 پیاده سازی های اضافی پارامترهای الگوریتم را در Conscrypt ارائه می دهد. این پارامترها عبارتند از: AES، DESEDE، OAEP و EC. نسخههای Bouncy Castle این پارامترها و بسیاری از الگوریتمها از اندروید 9 منسوخ شدهاند.
اگر برنامه شما Android 8.1 (سطح API 27) یا پایینتر را هدف قرار میدهد، هنگام درخواست اجرای Bouncy Castle از یکی از این الگوریتمهای منسوخ، هشداری دریافت میکنید. با این حال، اگر اندروید 9 را هدف قرار دهید، هر یک از این درخواستها یک NoSuchAlgorithmException
میدهند.
تغییرات دیگر
اندروید 9 چندین تغییر دیگر مرتبط با رمزنگاری را معرفی می کند:
- هنگام استفاده از کلیدهای PBE، اگر Bouncy Castle منتظر یک بردار اولیه (IV) باشد و برنامه شما یکی را ارائه نکند، یک هشدار دریافت میکنید.
- اجرای Conscrypt رمز ARC4 به شما امکان می دهد ARC4/ECB/NoPadding یا ARC4/NONE/NoPadding را مشخص کنید.
- ارائه دهنده Crypto Java Cryptography Architecture (JCA) حذف شده است. در نتیجه، اگر برنامه شما
SecureRandom.getInstance("SHA1PRNG", "Crypto")
را فراخوانی کند، یکNoSuchProviderException
رخ می دهد. - اگر برنامه شما کلیدهای RSA را از بافرهایی که بزرگتر از ساختار کلید هستند تجزیه کند، دیگر استثنایی رخ نخواهد داد.
برای کسب اطلاعات بیشتر در مورد استفاده از قابلیتهای رمزنگاری اندروید، به Cryptography مراجعه کنید.
فایلهای رمزگذاری شده امن Android دیگر پشتیبانی نمیشوند
اندروید 9 به طور کامل پشتیبانی از فایل های رمزگذاری شده ایمن اندروید (ASEC) را حذف می کند.
در Android 2.2 (سطح API 8)، اندروید ASEC ها را برای پشتیبانی از عملکرد برنامه ها روی کارت SD معرفی کرد. در Android 6.0 (سطح API 23)، این پلتفرم یک فناوری دستگاه ذخیره سازی قابل قبول را معرفی کرد که توسعه دهندگان می توانند به جای ASEC از آن استفاده کنند.
به روز رسانی کتابخانه های ICU
اندروید 9 از نسخه 60 کتابخانه ICU استفاده می کند. اندروید 8.0 (سطح API 26) و اندروید 8.1 (سطح API 27) از ICU 58 استفاده می کنند.
ICU برای ارائه APIهای عمومی در زیر android.icu package
استفاده می شود و به صورت داخلی در پلتفرم Android برای پشتیبانی بین المللی استفاده می شود. به عنوان مثال، برای پیاده سازی کلاس های اندروید در java.util
، java.text
و android.text.format
استفاده می شود.
بهروزرسانی ICU 60 شامل بسیاری از تغییرات کوچک اما مفید است، از جمله پشتیبانی از دادههای Emoji 5.0 و فرمتهای تاریخ/زمان بهبود یافته، همانطور که در یادداشتهای انتشار ICU 59 و ICU 60 مستند شده است.
تغییرات قابل توجه در این به روز رسانی:
- نحوه مدیریت این پلتفرم با مناطق زمانی تغییر کرده است.
- پلتفرم GMT و UTC را بهتر مدیریت می کند. UTC دیگر مترادف GMT نیست.
ICU اکنون نام مناطق ترجمه شده را برای GMT و UTC ارائه می دهد. این تغییر قالببندی
android.icu
و رفتار تجزیه را برای مناطقی مانند "GMT"، "Etc/GMT"، "UTC"، "Etc/UTC" و "Zulu" تحت تاثیر قرار میدهد. -
java.text.SimpleDateFormat
اکنون از ICU برای ارائه نام های نمایشی برای UTC /GMT استفاده می کند، به این معنی:- قالب بندی
zzzz
یک رشته محلی طولانی برای بسیاری از مناطق ایجاد می کند. قبلاً "UTC" برای UTC و رشته هایی مانند "GMT+00:00" برای GMT تولید می کرد. - تجزیه
zzzz
رشته هایی مانند "زمان هماهنگ جهانی" و "زمان میانگین گرینویچ" را تشخیص می دهد. - اگر برنامهها فرض کنند که «UTC» یا «GMT+00:00» برای
zzzz
در همه زبانها خروجی دارند، ممکن است با مشکلات سازگاری مواجه شوند.
- قالب بندی
- رفتار
java.text.DateFormatSymbols.getZoneStrings()
تغییر کرده است:- همانند
SimpleDateFormat
، UTC و GMT اکنون نام های طولانی دارند. انواع DST نامهای منطقه زمانی برای منطقه UTC، مانند "UTC"، "Etc/UTC" و "Zulu" به GMT+00:00 تبدیل میشوند، که زمانی که نامی در دسترس نباشد، بازگشتی استاندارد است. رشته کد سختUTC
. - برخی از شناسههای ناحیه به درستی بهعنوان مترادف مناطق دیگر شناخته میشوند، بنابراین Android رشتههایی را برای شناسههای منطقه قدیمی، مانند
Eire
پیدا میکند که قبلاً قابل حل نبودند.
- همانند
- آسیا/هانوی دیگر یک منطقه شناخته شده نیست. به همین دلیل
java.util.TimeZones.getAvailableIds()
این مقدار را بر نمی گرداند وjava.util.TimeZone.getTimeZone()
آن را تشخیص نمی دهد. این رفتار با رفتارandroid.icu
موجود مطابقت دارد.
- پلتفرم GMT و UTC را بهتر مدیریت می کند. UTC دیگر مترادف GMT نیست.
- روش
android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String)
ممکن است حتی در هنگام تجزیه متن ارز قانونی، یکParseException
ایجاد کند. با استفاده ازNumberFormat.parseCurrency
، که از Android نسخه 7.0 (سطح API 24) برای متن ارز به سبکPLURALCURRENCYSTYLE
در دسترس است، از این مشکل جلوگیری کنید.
تغییرات تست اندروید
اندروید 9 تغییرات متعددی را در ساختار کتابخانه و کلاس چارچوب Android Test ایجاد می کند. این تغییرات به توسعه دهندگان کمک می کند تا از API های عمومی با پشتیبانی از چارچوب استفاده کنند، اما این تغییرات همچنین به انعطاف پذیری بیشتری در ساخت و اجرای آزمایش ها با استفاده از کتابخانه های شخص ثالث یا منطق سفارشی اجازه می دهد.
کتابخانه ها از چارچوب حذف شدند
Android 9 کلاسهای مبتنی بر JUnit را در سه کتابخانه سازماندهی مجدد میکند: android.test.base ، android.test.runner و android.test.mock . این تغییر به شما امکان میدهد آزمایشهایی را بر روی نسخهای از JUnit اجرا کنید که با وابستگیهای پروژه شما بهترین کار را دارد. این نسخه از JUnit ممکن است با نسخه ای که android.jar
ارائه می دهد متفاوت باشد.
برای کسب اطلاعات بیشتر درباره نحوه سازماندهی کلاسهای مبتنی بر JUnit در این کتابخانهها، و همچنین نحوه آمادهسازی پروژه برنامهتان برای نوشتن و اجرای آزمایشها، به راهاندازی پروژه برای تست Android مراجعه کنید.
آزمایش تغییرات ساخت مجموعه
متد addRequirements()
در کلاس TestSuiteBuilder
حذف شده است و خود کلاس TestSuiteBuilder
منسوخ شده است. متد addRequirements()
توسعه دهندگان را ملزم به ارائه آرگومان هایی می کرد که انواع آنها API های مخفی هستند و باعث می شود API نامعتبر باشد.
رسیور جاوا UTF
UTF-8 مجموعه نویسه های پیش فرض در اندروید است. یک دنباله بایت UTF-8 را می توان توسط یک سازنده String
، مانند String(byte[] bytes)
رمزگشایی کرد.
رمزگشای UTF-8 در اندروید 9 از استانداردهای یونیکد با دقت بیشتری نسبت به نسخه های قبلی پیروی می کند. تغییرات شامل موارد زیر است:
- غیرکوتاه ترین شکل UTF-8، مانند
<C0, AF>
، به عنوان بد شکل تلقی می شود. - شکل جانشین UTF-8، مانند
U+D800
..U+DFFF
، به عنوان بد شکل تلقی می شود. - بخش فرعی حداکثر با یک واحد
U+FFFD
جایگزین میشود. به عنوان مثال، در دنباله بایت "41 C0 AF 41 F4 80 80 41
"، بیشترین قسمت های فرعی "C0
"، "AF
" و "F4 80 80
" هستند. "F4 80 80
" می تواند زیر دنباله اولیه "F4 80 80 80
" باشد، اما "C0
" نمی تواند دنباله ابتدایی هر دنباله واحد کد به خوبی شکل گرفته باشد. بنابراین، خروجی باید "A\ufffd\ufffdA\ufffdA
" باشد. - برای رمزگشایی یک دنباله UTF-8 / CESU-8 اصلاح شده در Android 9 یا بالاتر، از متد
DataInputStream.readUTF()
یا روشNewStringUTF()
JNI استفاده کنید.
تأیید نام میزبان با استفاده از گواهی
RFC 2818 دو روش را برای تطبیق یک نام دامنه با یک گواهی توصیف می کند - با استفاده از نام های موجود در پسوند subjectAltName
( SAN
) یا در صورت عدم وجود پسوند SAN
، بازگشت به commonName
( CN
).
با این حال، بازگشت به CN
در RFC 2818 منسوخ شد. به همین دلیل، Android دیگر به استفاده از CN
برنمیگردد. برای تأیید نام میزبان، سرور باید یک گواهی با SAN
منطبق ارائه دهد. گواهینامه هایی که حاوی SAN
مطابق با نام میزبان نیستند، دیگر قابل اعتماد نیستند.
جستجوی آدرس شبکه می تواند باعث نقض شبکه شود
جستجوی آدرس شبکه که نیاز به تفکیک نام دارد میتواند شامل I/O شبکه باشد و بنابراین عملیات مسدود کردن در نظر گرفته میشود. عملیات مسدود کردن روی رشته اصلی می تواند باعث مکث یا jank شود.
کلاس StrictMode
یک ابزار توسعه است که به توسعه دهندگان کمک می کند تا مشکلات موجود در کد خود را شناسایی کنند.
در Android 9 و بالاتر، StrictMode
نقضهای شبکه ناشی از جستجوی آدرس شبکه را که به وضوح نام نیاز دارند، شناسایی میکند.
شما نباید برنامه های خود را با فعال بودن StrictMode
ارسال کنید. اگر این کار را انجام دهید، برنامههای شما میتوانند استثناهایی مانند NetworkOnMainThreadException
را هنگام استفاده از روشهای detectNetwork()
یا detectAll()
برای دریافت خطمشی که نقضهای شبکه را شناسایی میکند، تجربه کنند.
حل یک آدرس IP عددی یک عملیات مسدود کردن در نظر گرفته نمی شود. وضوح آدرس IP عددی مانند نسخه های قبل از اندروید 9 کار می کند.
برچسب گذاری سوکت
در نسخههای پلتفرم پایینتر از اندروید 9، اگر سوکتی با استفاده از متد setThreadStatsTag()
برچسبگذاری شود، زمانی که سوکت با استفاده از IPC بایندر با ظرف ParcelFileDescriptor
به فرآیند دیگری ارسال میشود، برچسبگذاری نمیشود.
در اندروید 9 و بالاتر، تگ سوکت زمانی که با استفاده از بایندر IPC به فرآیند دیگری ارسال میشود، حفظ میشود. این تغییر می تواند بر آمار ترافیک شبکه تأثیر بگذارد، به عنوان مثال، هنگام استفاده از متد queryDetailsForUidTag()
.
اگر میخواهید رفتار نسخههای قبلی را حفظ کنید، که سوکتی را که به فرآیند دیگری فرستاده میشود حذف میکند، میتوانید قبل از ارسال سوکت untagSocket()
را فراخوانی کنید.
مقدار بایت های موجود در سوکت گزارش شده است
متد available()
پس از فراخوانی متد shutdownInput()
0
برمی گرداند.
گزارش دقیق تر قابلیت های شبکه برای VPN ها
در Android 8.1 (سطح API 27) و پایینتر، کلاس NetworkCapabilities
فقط مجموعه محدودی از اطلاعات را برای VPNها، مانند TRANSPORT_VPN
گزارش میکند، اما NET_CAPABILITY_NOT_VPN
را حذف میکند. این اطلاعات محدود، تعیین اینکه آیا استفاده از VPN میتواند هزینههایی را برای کاربر برنامه به همراه داشته باشد، دشوار میکرد. به عنوان مثال، بررسی NET_CAPABILITY_NOT_METERED
تعیین نمی کند که آیا شبکه های اصلی اندازه گیری شده اند یا خیر.
در اندروید 9 و بالاتر، وقتی یک VPN متد setUnderlyingNetworks()
فراخوانی میکند، سیستم Android انتقالها و قابلیتهای هر شبکه زیربنایی را ادغام میکند و نتیجه را به عنوان قابلیتهای شبکه موثر شبکه VPN برمیگرداند.
در Android 9 و بالاتر، برنامههایی که قبلاً NET_CAPABILITY_NOT_METERED
را بررسی میکنند، قابلیتهای شبکه VPN و شبکههای زیربنایی را دریافت میکنند.
فایلهای موجود در پوشه xt_qtaguid دیگر در دسترس برنامهها نیستند
با شروع اندروید 9، برنامهها اجازه دسترسی خواندن مستقیم به فایلهای موجود در پوشه /proc/net/xt_qtaguid
را ندارند. دلیل آن اطمینان از سازگاری با برخی از دستگاه هایی است که اصلاً این فایل ها را ندارند.
API های عمومی که به این فایل ها متکی هستند، TrafficStats
و NetworkStatsManager
، همچنان به کار خود ادامه می دهند. با این حال، توابع cutils پشتیبانینشده، مانند qtaguid_tagSocket()
ممکن است آنطور که انتظار میرود – یا اصلاً – در دستگاههای مختلف کار نکنند.
الزام FLAG_ACTIVITY_NEW_TASK اکنون اجرا می شود
با Android 9، نمیتوانید فعالیتی را از یک زمینه غیرفعالی شروع کنید، مگر اینکه پرچم قصد FLAG_ACTIVITY_NEW_TASK
را پاس کنید. اگر بخواهید بدون عبور از این پرچم فعالیتی را شروع کنید، فعالیت شروع نمی شود و سیستم پیامی را در گزارش چاپ می کند.
چرخش صفحه نمایش تغییر می کند
با شروع اندروید 9، تغییرات قابل توجهی در حالت چرخش پرتره وجود دارد. در اندروید 8.0 (سطح API 26)، کاربران میتوانند با استفاده از کاشی تنظیمات سریع یا تنظیمات نمایش، بین حالتهای چرخش خودکار و چرخش عمودی جابهجا شوند. حالت عمودی به قفل چرخشی تغییر نام داده است و هنگامی که چرخش خودکار خاموش شود فعال است. هیچ تغییری در حالت چرخش خودکار وجود ندارد.
هنگامی که دستگاه در حالت قفل چرخشی است، کاربران می توانند صفحه نمایش خود را به هر چرخشی که توسط فعالیت قابل مشاهده بالا پشتیبانی می شود قفل کنند. یک فعالیت نباید فرض کند که همیشه به صورت پرتره ارائه می شود. اگر میتوان فعالیت بالا را در حالت چرخش خودکار در چندین چرخش ارائه کرد، همان گزینهها باید در حالت قفل چرخشی در دسترس باشند، با برخی استثناها بر اساس تنظیمات screenOrientation
فعالیت (جدول زیر را ببینید).
فعالیتهایی که جهتگیری خاصی را درخواست میکنند (مثلاً screenOrientation=landscape
)، اولویت قفل کاربر را نادیده میگیرند و مانند Android 8.0 رفتار میکنند.
تنظیمات ترجیحی جهت صفحه را می توان در سطح Activity در مانیفست Android یا به صورت برنامه نویسی با setRequestedOrientation () تنظیم کرد.
حالت قفل چرخش با تنظیم اولویت چرخش کاربر که WindowManager هنگام مدیریت چرخش فعالیت استفاده می کند، کار می کند. ترجیح چرخش کاربر ممکن است در موارد زیر تغییر کند. توجه داشته باشید که یک سوگیری برای بازگشت به چرخش طبیعی دستگاه وجود دارد که معمولاً برای دستگاههای فاکتور فرم تلفن به صورت عمودی است:
- هنگامی که کاربر یک پیشنهاد چرخش را می پذیرد، اولویت چرخش به پیشنهاد تغییر می کند.
- وقتی کاربر به یک برنامه پرتره اجباری (شامل صفحه قفل یا راهانداز) سوئیچ میکند، اولویت چرخش به حالت عمودی تغییر میکند.
جدول زیر رفتار چرخش را برای جهت گیری های رایج صفحه نمایش خلاصه می کند:
جهت صفحه نمایش | رفتار |
---|---|
نامشخص، کاربر | در چرخش خودکار و قفل چرخش، Activity را می توان به صورت عمودی یا افقی (و برعکس) رندر کرد. انتظار دارید از طرحبندیهای عمودی و افقی پشتیبانی شود. |
userLandscape | در چرخش خودکار و قفل چرخش، Activity میتواند به صورت افقی یا معکوس ارائه شود. انتظار داشته باشید که فقط طرحبندیهای منظره را پشتیبانی کنید. |
کاربر پرتره | در چرخش خودکار و قفل چرخشی، Activity میتواند به صورت عمودی یا معکوس ارائه شود. انتظار می رود که فقط از طرح بندی های پرتره پشتیبانی شود. |
fullUser | در چرخش خودکار و قفل چرخش، Activity را می توان به صورت عمودی یا افقی (و برعکس) رندر کرد. انتظار دارید از طرحبندیهای عمودی و افقی پشتیبانی شود. به کاربران قفل چرخشی این گزینه داده میشود که برای پرتره معکوس قفل کنند، اغلب 180 درجه. |
سنسور، فول سنسور، حسگر پرتره، سنسور منظره | ترجیح حالت قفل چرخش نادیده گرفته می شود و به گونه ای رفتار می شود که گویی چرخش خودکار فعال است. فقط در شرایط استثنایی با در نظر گرفتن UX بسیار دقیق از آن استفاده کنید. |
منسوخ شدن سرویس گیرنده Apache HTTP بر برنامه های دارای ClassLoader غیر استاندارد تأثیر می گذارد
با Android 6.0، پشتیبانی از سرویس گیرنده Apache HTTP را حذف کردیم . این تغییر روی اکثر برنامههایی که اندروید 9 یا بالاتر را هدف قرار نمیدهند، تأثیری ندارد. با این حال، این تغییر میتواند بر برنامههای خاصی که از ساختار ClassLoader
غیراستاندارد استفاده میکنند، تأثیر بگذارد، حتی اگر برنامهها Android 9 یا بالاتر را هدف قرار ندهند.
اگر یک برنامه از ClassLoader
غیر استانداردی استفاده کند که صریحاً به سیستم ClassLoader
محول می شود، ممکن است تحت تأثیر قرار گیرد. این برنامهها باید در عوض وقتی به دنبال کلاسها در org.apache.http.*
به برنامه ClassLoader
واگذار شوند. اگر آنها را به سیستم ClassLoader
واگذار کنند، برنامهها در Android 9 یا بالاتر با NoClassDefFoundError
از کار میافتند، زیرا آن کلاسها دیگر برای ClassLoader
سیستم شناخته نمیشوند. برای جلوگیری از مشکلات مشابه در آینده، برنامه ها به طور کلی باید کلاس ها را از طریق برنامه ClassLoader
بارگیری کنند نه اینکه مستقیماً به ClassLoader
سیستم دسترسی داشته باشند.
شمارش دوربین ها
برنامههایی که روی دستگاههای Android 9 اجرا میشوند میتوانند با فراخوانی getCameraIdList()
هر دوربین موجود را پیدا کنند. یک برنامه نباید تصور کند که دستگاه فقط یک دوربین پشتی یا فقط یک دوربین جلو دارد.
برای مثال، اگر برنامه شما دکمه ای برای جابجایی بین دوربین جلو و عقب دارد، ممکن است بیش از یک دوربین جلو یا عقب برای انتخاب وجود داشته باشد. شما باید فهرست دوربین را طی کنید، ویژگی های هر دوربین را بررسی کنید و تصمیم بگیرید که کدام دوربین را در معرض دید کاربر قرار دهید.
،اندروید 9 (سطح API 28) تعدادی تغییرات را در سیستم اندروید معرفی می کند. تغییرات رفتاری زیر برای همه برنامهها وقتی روی پلتفرم Android 9 اجرا میشوند، صرفنظر از سطح API مورد نظرشان اعمال میشود. همه توسعهدهندگان باید این تغییرات را بررسی کرده و برنامههای خود را تغییر دهند تا در صورت لزوم، به درستی از آنها پشتیبانی کنند.
برای تغییراتی که فقط بر برنامههایی تأثیر میگذارند که سطح API 28 یا بالاتر را هدف قرار میدهند، به تغییرات رفتار: برنامههایی که API سطح 28+ را هدف قرار میدهند، مراجعه کنید.
مدیریت نیرو
اندروید 9 ویژگی های جدیدی را برای بهبود مدیریت انرژی دستگاه معرفی می کند. این تغییرات، همراه با ویژگیهایی که قبلاً قبل از اندروید 9 وجود داشت، کمک میکند تا اطمینان حاصل شود که منابع سیستم در دسترس برنامههایی قرار میگیرد که بیشتر به آنها نیاز دارند.
برای جزئیات، به مدیریت نیرو مراجعه کنید.
حریم خصوصی تغییر می کند
برای افزایش حریم خصوصی کاربر، اندروید 9 چندین تغییر رفتاری را معرفی میکند، مانند محدود کردن دسترسی برنامههای پسزمینه به حسگرهای دستگاه، محدود کردن اطلاعات بازیابی شده از اسکنهای Wi-Fi، و قوانین جدید مجوز و گروههای مجوز مربوط به تماسهای تلفنی، وضعیت تلفن و Wi- اسکن Fi
این تغییرات بدون در نظر گرفتن نسخه SDK هدف، بر تمام برنامه های اجرا شده در اندروید 9 تأثیر می گذارد.
دسترسی محدود به حسگرها در پس زمینه
اندروید 9 امکان دسترسی برنامههای پسزمینه به ورودیهای کاربر و دادههای حسگر را محدود میکند. اگر برنامه شما در پسزمینه دستگاهی با Android 9 اجرا میشود، سیستم محدودیتهای زیر را برای برنامه شما اعمال میکند:
- برنامه شما نمی تواند به میکروفون یا دوربین دسترسی پیدا کند.
- حسگرهایی که از حالت گزارش مداوم استفاده می کنند، مانند شتاب سنج و ژیروسکوپ، رویدادها را دریافت نمی کنند.
- حسگرهایی که از حالتهای گزارش لحظهای یا یکشات استفاده میکنند، رویدادها را دریافت نمیکنند.
اگر برنامه شما نیاز به تشخیص رویدادهای حسگر در دستگاههای دارای Android 9 دارد، از سرویس پیشزمینه استفاده کنید.
دسترسی محدود به گزارش تماس ها
Android 9 گروه مجوز CALL_LOG
را معرفی میکند و مجوزهای READ_CALL_LOG
، WRITE_CALL_LOG
و PROCESS_OUTGOING_CALLS
را به این گروه منتقل میکند. در نسخه های قبلی اندروید، این مجوزها در گروه مجوز PHONE
قرار داشتند.
این گروه مجوز CALL_LOG
به کاربران امکان کنترل و دید بهتر برنامههایی را میدهد که به اطلاعات حساس در مورد تماسهای تلفنی مانند خواندن سوابق تماس تلفنی و شناسایی شماره تلفن نیاز دارند.
اگر برنامه شما نیاز به دسترسی به گزارش تماس دارد یا نیاز به پردازش تماسهای خروجی دارد، باید این مجوزها را صریحاً از گروه مجوز CALL_LOG
درخواست کنید. در غیر این صورت، یک SecurityException
رخ می دهد.
توجه: از آنجایی که این مجوزها گروهها را تغییر دادهاند و در زمان اجرا اعطا میشوند، این امکان برای کاربر وجود دارد که از دسترسی برنامه شما به اطلاعات گزارش تماسهای تلفنی خودداری کند. در این حالت، برنامه شما باید بتواند با عدم دسترسی به اطلاعات به خوبی برخورد کند.
اگر برنامه شما از قبل بهترین شیوه های مجوزهای زمان اجرا را دنبال می کند، می تواند تغییر در گروه مجوز را کنترل کند.
دسترسی محدود به شماره تلفن
برنامههایی که روی Android 9 اجرا میشوند، نمیتوانند شماره تلفن یا وضعیت تلفن را بدون دریافت مجوز READ_CALL_LOG
، بعلاوه سایر مجوزهایی که موارد استفاده برنامه شما به آن نیاز دارند، بخوانند.
شمارههای تلفن مرتبط با تماسهای ورودی و خروجی در پخش وضعیت تلفن ، مانند تماسهای ورودی و خروجی، قابل مشاهده هستند و از کلاس PhoneStateListener
قابل دسترسی هستند. با این حال، بدون مجوز READ_CALL_LOG
، قسمت شماره تلفن ارائه شده در پخشهای PHONE_STATE_CHANGED
و از طریق PhoneStateListener
خالی است.
برای خواندن شماره تلفن از وضعیت تلفن، برنامه خود را بهروزرسانی کنید تا مجوزهای لازم را بر اساس مورد استفاده خود درخواست کنید:
- برای خواندن اعداد از اقدام قصد
PHONE_STATE
، هم به مجوزREAD_CALL_LOG
و هم به مجوزREAD_PHONE_STATE
نیاز دارید. - برای خواندن اعداد از
onCallStateChanged()
فقط به مجوزREAD_CALL_LOG
نیاز دارید. شما به مجوزREAD_PHONE_STATE
نیاز ندارید.
دسترسی محدود به مکان Wi-Fi و اطلاعات اتصال
در اندروید 9، الزامات مجوز برای یک برنامه برای انجام اسکن وای فای سخت تر از نسخه های قبلی است. برای جزئیات، محدودیتهای اسکن Wi-Fi را ببینید.
محدودیتهای مشابهی برای متد getConnectionInfo()
نیز اعمال میشود که یک شی WifiInfo
را که اتصال Wi-Fi فعلی را توصیف میکند، برمیگرداند. فقط در صورتی میتوانید از روشهای این شی برای بازیابی مقادیر SSID و BSSID استفاده کنید که برنامه تماسگیرنده مجوزهای زیر را داشته باشد:
- ACCESS_FINE_LOCATION یا ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
برای بازیابی SSID یا BSSID نیز باید خدمات مکان در دستگاه فعال شود (در زیر تنظیمات > مکان ).
اطلاعات از روشهای سرویس Wi-Fi حذف شد
در Android 9، رویدادها و پخشهای زیر اطلاعاتی درباره موقعیت مکانی کاربر یا دادههای قابل شناسایی شخصی دریافت نمیکنند:
- متدهای
getScanResults()
وgetConnectionInfo()
ازWifiManager
. - متدهای
discoverServices()
وaddServiceRequest()
ازWifiP2pManager
. - پخش
NETWORK_STATE_CHANGED_ACTION
.
سیستم NETWORK_STATE_CHANGED_ACTION
که از Wi-Fi پخش میشود، دیگر حاوی SSID (قبلا EXTRA_SSID)، BSSID (قبلا EXTRA_BSSID) یا اطلاعات اتصال (قبلاً EXTRA_NETWORK_INFO) نیست. اگر برنامه شما به این اطلاعات نیاز دارد، به جای آن با getConnectionInfo()
تماس بگیرید.
اطلاعات تلفن اکنون به تنظیمات مکان دستگاه متکی است
اگر کاربر مکان دستگاه را در دستگاهی که Android 9 دارد غیرفعال کرده باشد، روشهای زیر نتیجهای را ارائه نمیدهند:
محدودیت در استفاده از رابط های غیر SDK
برای کمک به اطمینان از ثبات و سازگاری برنامه، پلتفرم استفاده از برخی روشها و زمینههای غیر SDK را محدود میکند. این محدودیتها اعمال میشوند چه بخواهید مستقیماً به این روشها و فیلدها دسترسی داشته باشید، از طریق بازتاب یا با استفاده از JNI. در Android 9، برنامه شما میتواند همچنان به این رابطهای محدود دسترسی داشته باشد. این پلتفرم از نان تست ها و ورودی های گزارش استفاده می کند تا توجه شما را جلب کند. اگر برنامه شما چنین نان تستی را نشان می دهد، مهم است که استراتژی پیاده سازی دیگری غیر از رابط کاربری محدود را دنبال کنید. اگر فکر می کنید که هیچ استراتژی جایگزینی امکان پذیر نیست، می توانید یک اشکال را برای درخواست تجدید نظر در محدودیت ارسال کنید.
محدودیتها در رابطهای غیر SDK حاوی اطلاعات مهم دیگری است. باید آن را بررسی کنید تا مطمئن شوید که برنامه شما به درستی کار می کند.
رفتار امنیتی تغییر می کند
تغییرات امنیتی دستگاه
Android 9 چندین قابلیت اضافه می کند که امنیت برنامه شما را بهبود می بخشد، صرف نظر از اینکه برنامه شما کدام نسخه را هدف قرار می دهد.
تغییرات پیاده سازی TLS
پیاده سازی TLS سیستم در اندروید 9 دستخوش تغییرات زیادی شده است:
- اگر نمونه ای از
SSLSocket
در حین ایجاد اتصال نتواند، سیستم یکIOException
به جایNullPointerException
پرتاب می کند. - کلاس
SSLEngine
به طور تمیز با هر هشدارclose_notify
که رخ می دهد کنترل می کند.
برای کسب اطلاعات بیشتر در مورد ایجاد درخواست های وب ایمن در یک برنامه Android، یک مثال HTTPS را ببینید.
فیلتر SECCOMP دقیق تر
اندروید 9 تماسهای سیستمی را که برای برنامهها در دسترس است محدودتر میکند. این رفتار یک برنامه افزودنی از فیلتر SECCOMP است که Android 8.0 (سطح API 26) شامل می شود .
تغییرات رمزنگاری
اندروید 9 تغییرات زیادی را در پیاده سازی و مدیریت الگوریتم های رمزنگاری ایجاد می کند.
پیاده سازی پارامترها و الگوریتم ها را رمزگذاری کنید
اندروید 9 پیاده سازی های اضافی پارامترهای الگوریتم را در Conscrypt ارائه می دهد. این پارامترها عبارتند از: AES، DESEDE، OAEP و EC. نسخههای Bouncy Castle این پارامترها و بسیاری از الگوریتمها از اندروید 9 منسوخ شدهاند.
اگر برنامه شما Android 8.1 (سطح API 27) یا پایینتر را هدف قرار میدهد، هنگام درخواست اجرای Bouncy Castle از یکی از این الگوریتمهای منسوخ، هشداری دریافت میکنید. با این حال، اگر اندروید 9 را هدف قرار دهید، هر یک از این درخواستها یک NoSuchAlgorithmException
میدهند.
تغییرات دیگر
اندروید 9 چندین تغییر دیگر مرتبط با رمزنگاری را معرفی می کند:
- هنگام استفاده از کلیدهای PBE، اگر Bouncy Castle منتظر یک بردار اولیه (IV) باشد و برنامه شما یکی را ارائه نکند، یک هشدار دریافت میکنید.
- اجرای Conscrypt رمز ARC4 به شما امکان می دهد ARC4/ECB/NoPadding یا ARC4/NONE/NoPadding را مشخص کنید.
- ارائه دهنده Crypto Java Cryptography Architecture (JCA) حذف شده است. در نتیجه، اگر برنامه شما
SecureRandom.getInstance("SHA1PRNG", "Crypto")
را فراخوانی کند، یکNoSuchProviderException
رخ می دهد. - اگر برنامه شما کلیدهای RSA را از بافرهایی که بزرگتر از ساختار کلید هستند تجزیه کند، دیگر استثنایی رخ نخواهد داد.
برای کسب اطلاعات بیشتر در مورد استفاده از قابلیتهای رمزنگاری اندروید، به Cryptography مراجعه کنید.
فایلهای رمزگذاری شده امن Android دیگر پشتیبانی نمیشوند
اندروید 9 به طور کامل پشتیبانی از فایل های رمزگذاری شده ایمن اندروید (ASEC) را حذف می کند.
در Android 2.2 (سطح API 8)، اندروید ASEC ها را برای پشتیبانی از عملکرد برنامه ها روی کارت SD معرفی کرد. در Android 6.0 (سطح API 23)، این پلتفرم یک فناوری دستگاه ذخیره سازی قابل قبول را معرفی کرد که توسعه دهندگان می توانند به جای ASEC از آن استفاده کنند.
به روز رسانی کتابخانه های ICU
اندروید 9 از نسخه 60 کتابخانه ICU استفاده می کند. اندروید 8.0 (سطح API 26) و اندروید 8.1 (سطح API 27) از ICU 58 استفاده می کنند.
ICU برای ارائه APIهای عمومی در زیر android.icu package
استفاده می شود و به صورت داخلی در پلتفرم Android برای پشتیبانی بین المللی استفاده می شود. به عنوان مثال، برای پیاده سازی کلاس های اندروید در java.util
، java.text
و android.text.format
استفاده می شود.
بهروزرسانی ICU 60 شامل بسیاری از تغییرات کوچک اما مفید است، از جمله پشتیبانی از دادههای Emoji 5.0 و فرمتهای تاریخ/زمان بهبود یافته، همانطور که در یادداشتهای انتشار ICU 59 و ICU 60 مستند شده است.
تغییرات قابل توجه در این به روز رسانی:
- نحوه مدیریت این پلتفرم با مناطق زمانی تغییر کرده است.
- پلتفرم GMT و UTC را بهتر مدیریت می کند. UTC دیگر مترادف GMT نیست.
ICU اکنون نام مناطق ترجمه شده را برای GMT و UTC ارائه می دهد. این تغییر قالببندی
android.icu
و رفتار تجزیه را برای مناطقی مانند "GMT"، "Etc/GMT"، "UTC"، "Etc/UTC" و "Zulu" تحت تاثیر قرار میدهد. -
java.text.SimpleDateFormat
اکنون از ICU برای ارائه نام های نمایشی برای UTC /GMT استفاده می کند، به این معنی:- قالب بندی
zzzz
یک رشته محلی طولانی برای بسیاری از مناطق ایجاد می کند. قبلاً "UTC" برای UTC و رشته هایی مانند "GMT+00:00" برای GMT تولید می کرد. - تجزیه
zzzz
رشته هایی مانند "زمان هماهنگ جهانی" و "زمان میانگین گرینویچ" را تشخیص می دهد. - اگر برنامهها فرض کنند که «UTC» یا «GMT+00:00» برای
zzzz
در همه زبانها خروجی دارند، ممکن است با مشکلات سازگاری مواجه شوند.
- قالب بندی
- رفتار
java.text.DateFormatSymbols.getZoneStrings()
تغییر کرده است:- همانند
SimpleDateFormat
، UTC و GMT اکنون نام های طولانی دارند. انواع DST نامهای منطقه زمانی برای منطقه UTC، مانند "UTC"، "Etc/UTC" و "Zulu" به GMT+00:00 تبدیل میشوند، که زمانی که نامی در دسترس نباشد، بازگشتی استاندارد است. رشته کد سختUTC
. - برخی از شناسههای ناحیه به درستی بهعنوان مترادف مناطق دیگر شناخته میشوند، بنابراین Android رشتههایی را برای شناسههای منطقه قدیمی، مانند
Eire
پیدا میکند که قبلاً قابل حل نبودند.
- همانند
- آسیا/هانوی دیگر یک منطقه شناخته شده نیست. به همین دلیل
java.util.TimeZones.getAvailableIds()
این مقدار را بر نمی گرداند وjava.util.TimeZone.getTimeZone()
آن را تشخیص نمی دهد. این رفتار با رفتارandroid.icu
موجود مطابقت دارد.
- پلتفرم GMT و UTC را بهتر مدیریت می کند. UTC دیگر مترادف GMT نیست.
- روش
android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String)
ممکن است حتی در هنگام تجزیه متن ارز قانونی، یکParseException
ایجاد کند. با استفاده ازNumberFormat.parseCurrency
، که از Android نسخه 7.0 (سطح API 24) برای متن ارز به سبکPLURALCURRENCYSTYLE
در دسترس است، از این مشکل جلوگیری کنید.
تغییرات تست اندروید
اندروید 9 تغییرات متعددی را در ساختار کتابخانه و کلاس چارچوب Android Test ایجاد می کند. این تغییرات به توسعه دهندگان کمک می کند تا از API های عمومی با پشتیبانی از چارچوب استفاده کنند، اما این تغییرات همچنین به انعطاف پذیری بیشتری در ساخت و اجرای آزمایش ها با استفاده از کتابخانه های شخص ثالث یا منطق سفارشی اجازه می دهد.
کتابخانه ها از چارچوب حذف شدند
Android 9 کلاسهای مبتنی بر JUnit را در سه کتابخانه سازماندهی مجدد میکند: android.test.base ، android.test.runner و android.test.mock . این تغییر به شما امکان میدهد آزمایشهایی را بر روی نسخهای از JUnit اجرا کنید که با وابستگیهای پروژه شما بهترین کار را دارد. این نسخه از JUnit ممکن است با نسخه ای که android.jar
ارائه می دهد متفاوت باشد.
برای کسب اطلاعات بیشتر درباره نحوه سازماندهی کلاسهای مبتنی بر JUnit در این کتابخانهها، و همچنین نحوه آمادهسازی پروژه برنامهتان برای نوشتن و اجرای آزمایشها، به راهاندازی پروژه برای تست Android مراجعه کنید.
آزمایش تغییرات ساخت مجموعه
متد addRequirements()
در کلاس TestSuiteBuilder
حذف شده است و خود کلاس TestSuiteBuilder
منسوخ شده است. متد addRequirements()
توسعه دهندگان را ملزم به ارائه آرگومان هایی می کرد که انواع آنها API های مخفی هستند و باعث می شود API نامعتبر باشد.
رسیور جاوا UTF
UTF-8 مجموعه نویسه های پیش فرض در اندروید است. یک دنباله بایت UTF-8 را می توان توسط یک سازنده String
، مانند String(byte[] bytes)
رمزگشایی کرد.
رمزگشای UTF-8 در اندروید 9 از استانداردهای یونیکد با دقت بیشتری نسبت به نسخه های قبلی پیروی می کند. تغییرات شامل موارد زیر است:
- غیرکوتاه ترین شکل UTF-8، مانند
<C0, AF>
، به عنوان بد شکل تلقی می شود. - شکل جانشین UTF-8، مانند
U+D800
..U+DFFF
، به عنوان بد شکل تلقی می شود. - بخش فرعی حداکثر با یک واحد
U+FFFD
جایگزین میشود. به عنوان مثال، در دنباله بایت "41 C0 AF 41 F4 80 80 41
"، بیشترین قسمت های فرعی "C0
"، "AF
" و "F4 80 80
" هستند. "F4 80 80
" می تواند زیر دنباله اولیه "F4 80 80 80
" باشد، اما "C0
" نمی تواند دنباله ابتدایی هر دنباله واحد کد به خوبی شکل گرفته باشد. بنابراین، خروجی باید "A\ufffd\ufffdA\ufffdA
" باشد. - برای رمزگشایی یک دنباله UTF-8 / CESU-8 اصلاح شده در Android 9 یا بالاتر، از متد
DataInputStream.readUTF()
یا روشNewStringUTF()
JNI استفاده کنید.
تأیید نام میزبان با استفاده از گواهی
RFC 2818 دو روش را برای تطبیق یک نام دامنه با یک گواهی توصیف می کند - با استفاده از نام های موجود در پسوند subjectAltName
( SAN
) یا در صورت عدم وجود پسوند SAN
، بازگشت به commonName
( CN
).
با این حال، بازگشت به CN
در RFC 2818 منسوخ شد. به همین دلیل، Android دیگر به استفاده از CN
برنمیگردد. برای تأیید نام میزبان، سرور باید یک گواهی با SAN
منطبق ارائه دهد. گواهینامه هایی که حاوی SAN
مطابق با نام میزبان نیستند، دیگر قابل اعتماد نیستند.
جستجوی آدرس شبکه می تواند باعث نقض شبکه شود
جستجوی آدرس شبکه که نیاز به تفکیک نام دارد میتواند شامل I/O شبکه باشد و بنابراین عملیات مسدود کردن در نظر گرفته میشود. عملیات مسدود کردن روی رشته اصلی می تواند باعث مکث یا jank شود.
کلاس StrictMode
یک ابزار توسعه است که به توسعه دهندگان کمک می کند تا مشکلات موجود در کد خود را شناسایی کنند.
در Android 9 و بالاتر، StrictMode
نقضهای شبکه ناشی از جستجوی آدرس شبکه را که به وضوح نام نیاز دارند، شناسایی میکند.
شما نباید برنامه های خود را با فعال بودن StrictMode
ارسال کنید. اگر این کار را انجام دهید، برنامههای شما میتوانند استثناهایی مانند NetworkOnMainThreadException
را هنگام استفاده از روشهای detectNetwork()
یا detectAll()
برای دریافت خطمشی که نقضهای شبکه را شناسایی میکند، تجربه کنند.
حل یک آدرس IP عددی یک عملیات مسدود کردن در نظر گرفته نمی شود. وضوح آدرس IP عددی مانند نسخه های قبل از اندروید 9 کار می کند.
برچسب گذاری سوکت
در نسخههای پلتفرم پایینتر از اندروید 9، اگر سوکتی با استفاده از متد setThreadStatsTag()
برچسبگذاری شود، زمانی که سوکت با استفاده از IPC بایندر با ظرف ParcelFileDescriptor
به فرآیند دیگری ارسال میشود، برچسبگذاری نمیشود.
در اندروید 9 و بالاتر، تگ سوکت زمانی که با استفاده از بایندر IPC به فرآیند دیگری ارسال میشود، حفظ میشود. این تغییر می تواند بر آمار ترافیک شبکه تأثیر بگذارد، به عنوان مثال، هنگام استفاده از متد queryDetailsForUidTag()
.
اگر میخواهید رفتار نسخههای قبلی را حفظ کنید، که سوکتی را که به فرآیند دیگری فرستاده میشود حذف میکند، میتوانید قبل از ارسال سوکت untagSocket()
را فراخوانی کنید.
مقدار بایت های موجود در سوکت گزارش شده است
متد available()
پس از فراخوانی متد shutdownInput()
0
برمی گرداند.
گزارش دقیق تر قابلیت های شبکه برای VPN ها
در Android 8.1 (سطح API 27) و پایینتر، کلاس NetworkCapabilities
فقط مجموعه محدودی از اطلاعات را برای VPNها، مانند TRANSPORT_VPN
گزارش میکند، اما NET_CAPABILITY_NOT_VPN
را حذف میکند. این اطلاعات محدود، تعیین اینکه آیا استفاده از VPN میتواند هزینههایی را برای کاربر برنامه به همراه داشته باشد، دشوار میکرد. به عنوان مثال، بررسی NET_CAPABILITY_NOT_METERED
تعیین نمی کند که آیا شبکه های اصلی اندازه گیری شده اند یا خیر.
در اندروید 9 و بالاتر، وقتی یک VPN متد setUnderlyingNetworks()
فراخوانی میکند، سیستم Android انتقالها و قابلیتهای هر شبکه زیربنایی را ادغام میکند و نتیجه را به عنوان قابلیتهای شبکه موثر شبکه VPN برمیگرداند.
در Android 9 و بالاتر، برنامههایی که قبلاً NET_CAPABILITY_NOT_METERED
را بررسی میکنند، قابلیتهای شبکه VPN و شبکههای زیربنایی را دریافت میکنند.
فایلهای موجود در پوشه xt_qtaguid دیگر در دسترس برنامهها نیستند
با شروع اندروید 9، برنامهها اجازه دسترسی خواندن مستقیم به فایلهای موجود در پوشه /proc/net/xt_qtaguid
را ندارند. دلیل آن اطمینان از سازگاری با برخی از دستگاه هایی است که اصلاً این فایل ها را ندارند.
API های عمومی که به این فایل ها متکی هستند، TrafficStats
و NetworkStatsManager
، همچنان به کار خود ادامه می دهند. با این حال، توابع cutils پشتیبانینشده، مانند qtaguid_tagSocket()
ممکن است آنطور که انتظار میرود – یا اصلاً – در دستگاههای مختلف کار نکنند.
الزام FLAG_ACTIVITY_NEW_TASK اکنون اجرا می شود
با Android 9، نمیتوانید فعالیتی را از یک زمینه غیرفعالی شروع کنید، مگر اینکه پرچم قصد FLAG_ACTIVITY_NEW_TASK
را پاس کنید. اگر بخواهید بدون عبور از این پرچم فعالیتی را شروع کنید، فعالیت شروع نمی شود و سیستم پیامی را در گزارش چاپ می کند.
چرخش صفحه نمایش تغییر می کند
با شروع اندروید 9، تغییرات قابل توجهی در حالت چرخش پرتره وجود دارد. در اندروید 8.0 (سطح API 26)، کاربران میتوانند با استفاده از کاشی تنظیمات سریع یا تنظیمات نمایش، بین حالتهای چرخش خودکار و چرخش عمودی جابهجا شوند. حالت عمودی به قفل چرخشی تغییر نام داده است و هنگامی که چرخش خودکار خاموش شود فعال است. هیچ تغییری در حالت چرخش خودکار وجود ندارد.
هنگامی که دستگاه در حالت قفل چرخشی است، کاربران می توانند صفحه نمایش خود را به هر چرخشی که توسط فعالیت قابل مشاهده بالا پشتیبانی می شود قفل کنند. یک فعالیت نباید فرض کند که همیشه به صورت پرتره ارائه می شود. اگر میتوان فعالیت بالا را در حالت چرخش خودکار در چندین چرخش ارائه کرد، همان گزینهها باید در حالت قفل چرخشی در دسترس باشند، با برخی استثناها بر اساس تنظیمات screenOrientation
فعالیت (جدول زیر را ببینید).
فعالیتهایی که جهتگیری خاصی را درخواست میکنند (مثلاً screenOrientation=landscape
)، اولویت قفل کاربر را نادیده میگیرند و مانند Android 8.0 رفتار میکنند.
تنظیمات ترجیحی جهت صفحه را می توان در سطح Activity در مانیفست Android یا به صورت برنامه نویسی با setRequestedOrientation () تنظیم کرد.
حالت قفل چرخش با تنظیم اولویت چرخش کاربر که WindowManager هنگام مدیریت چرخش فعالیت استفاده می کند، کار می کند. ترجیح چرخش کاربر ممکن است در موارد زیر تغییر کند. توجه داشته باشید که یک سوگیری برای بازگشت به چرخش طبیعی دستگاه وجود دارد که معمولاً برای دستگاههای فاکتور فرم تلفن به صورت عمودی است:
- هنگامی که کاربر یک پیشنهاد چرخش را می پذیرد، اولویت چرخش به پیشنهاد تغییر می کند.
- وقتی کاربر به یک برنامه پرتره اجباری (شامل صفحه قفل یا راهانداز) سوئیچ میکند، اولویت چرخش به حالت عمودی تغییر میکند.
جدول زیر رفتار چرخش را برای جهت گیری های رایج صفحه نمایش خلاصه می کند:
جهت صفحه نمایش | رفتار |
---|---|
نامشخص، کاربر | در چرخش خودکار و قفل چرخش، Activity را می توان به صورت عمودی یا افقی (و برعکس) رندر کرد. انتظار دارید از طرحبندیهای عمودی و افقی پشتیبانی شود. |
userLandscape | در چرخش خودکار و قفل چرخش، Activity میتواند به صورت افقی یا معکوس ارائه شود. انتظار داشته باشید که فقط طرحبندیهای منظره را پشتیبانی کنید. |
کاربر پرتره | در چرخش خودکار و قفل چرخشی، Activity میتواند به صورت عمودی یا معکوس ارائه شود. انتظار می رود که فقط از طرح بندی های پرتره پشتیبانی شود. |
fullUser | در چرخش خودکار و قفل چرخش، Activity را می توان به صورت عمودی یا افقی (و برعکس) رندر کرد. انتظار دارید از طرحبندیهای عمودی و افقی پشتیبانی شود. به کاربران قفل چرخشی این گزینه داده میشود که برای پرتره معکوس قفل کنند، اغلب 180 درجه. |
سنسور، فول سنسور، حسگر پرتره، سنسور منظره | ترجیح حالت قفل چرخش نادیده گرفته می شود و به گونه ای رفتار می شود که گویی چرخش خودکار فعال است. فقط در شرایط استثنایی با در نظر گرفتن UX بسیار دقیق از آن استفاده کنید. |
منسوخ شدن سرویس گیرنده Apache HTTP بر برنامه های دارای ClassLoader غیر استاندارد تأثیر می گذارد
با Android 6.0، پشتیبانی از سرویس گیرنده Apache HTTP را حذف کردیم . این تغییر روی اکثر برنامههایی که اندروید 9 یا بالاتر را هدف قرار نمیدهند، تأثیری ندارد. با این حال، این تغییر میتواند بر برنامههای خاصی که از ساختار ClassLoader
غیراستاندارد استفاده میکنند، تأثیر بگذارد، حتی اگر برنامهها Android 9 یا بالاتر را هدف قرار ندهند.
اگر یک برنامه از ClassLoader
غیر استانداردی استفاده کند که صریحاً به سیستم ClassLoader
محول می شود، ممکن است تحت تأثیر قرار گیرد. این برنامهها باید در عوض وقتی به دنبال کلاسها در org.apache.http.*
به برنامه ClassLoader
واگذار شوند. اگر آنها را به سیستم ClassLoader
واگذار کنند، برنامهها در Android 9 یا بالاتر با NoClassDefFoundError
از کار میافتند، زیرا آن کلاسها دیگر برای ClassLoader
سیستم شناخته نمیشوند. برای جلوگیری از مشکلات مشابه در آینده، برنامه ها به طور کلی باید کلاس ها را از طریق برنامه ClassLoader
بارگیری کنند نه اینکه مستقیماً به ClassLoader
سیستم دسترسی داشته باشند.
شمارش دوربین ها
برنامههایی که روی دستگاههای Android 9 اجرا میشوند میتوانند با فراخوانی getCameraIdList()
هر دوربین موجود را پیدا کنند. یک برنامه نباید تصور کند که دستگاه فقط یک دوربین پشتی یا فقط یک دوربین جلو دارد.
برای مثال، اگر برنامه شما دکمه ای برای جابجایی بین دوربین جلو و عقب دارد، ممکن است بیش از یک دوربین جلو یا عقب برای انتخاب وجود داشته باشد. شما باید فهرست دوربین را طی کنید، ویژگی های هر دوربین را بررسی کنید و تصمیم بگیرید که کدام دوربین را در معرض دید کاربر قرار دهید.
،اندروید 9 (سطح API 28) تعدادی تغییرات را در سیستم اندروید معرفی می کند. تغییرات رفتاری زیر برای همه برنامهها وقتی روی پلتفرم Android 9 اجرا میشوند، صرفنظر از سطح API مورد نظرشان اعمال میشود. همه توسعهدهندگان باید این تغییرات را بررسی کرده و برنامههای خود را تغییر دهند تا در صورت لزوم، به درستی از آنها پشتیبانی کنند.
برای تغییراتی که فقط بر برنامههایی تأثیر میگذارند که سطح API 28 یا بالاتر را هدف قرار میدهند، به تغییرات رفتار: برنامههایی که API سطح 28+ را هدف قرار میدهند، مراجعه کنید.
مدیریت نیرو
اندروید 9 ویژگی های جدیدی را برای بهبود مدیریت انرژی دستگاه معرفی می کند. این تغییرات، همراه با ویژگیهایی که قبلاً قبل از اندروید 9 وجود داشت، کمک میکند تا اطمینان حاصل شود که منابع سیستم در دسترس برنامههایی قرار میگیرد که بیشتر به آنها نیاز دارند.
برای جزئیات، به مدیریت نیرو مراجعه کنید.
حریم خصوصی تغییر می کند
برای افزایش حریم خصوصی کاربر، اندروید 9 چندین تغییر رفتاری را معرفی میکند، مانند محدود کردن دسترسی برنامههای پسزمینه به حسگرهای دستگاه، محدود کردن اطلاعات بازیابی شده از اسکنهای Wi-Fi، و قوانین جدید مجوز و گروههای مجوز مربوط به تماسهای تلفنی، وضعیت تلفن و Wi- اسکن Fi
این تغییرات بدون در نظر گرفتن نسخه SDK هدف، بر تمام برنامه های اجرا شده در اندروید 9 تأثیر می گذارد.
دسترسی محدود به حسگرها در پس زمینه
اندروید 9 امکان دسترسی برنامههای پسزمینه به ورودیهای کاربر و دادههای حسگر را محدود میکند. اگر برنامه شما در پسزمینه دستگاهی با Android 9 اجرا میشود، سیستم محدودیتهای زیر را برای برنامه شما اعمال میکند:
- برنامه شما نمی تواند به میکروفون یا دوربین دسترسی پیدا کند.
- حسگرهایی که از حالت گزارش مداوم استفاده می کنند، مانند شتاب سنج و ژیروسکوپ، رویدادها را دریافت نمی کنند.
- حسگرهایی که از حالتهای گزارش لحظهای یا یکشات استفاده میکنند، رویدادها را دریافت نمیکنند.
اگر برنامه شما نیاز به تشخیص رویدادهای حسگر در دستگاههای دارای Android 9 دارد، از سرویس پیشزمینه استفاده کنید.
دسترسی محدود به گزارش تماس ها
Android 9 گروه مجوز CALL_LOG
را معرفی میکند و مجوزهای READ_CALL_LOG
، WRITE_CALL_LOG
و PROCESS_OUTGOING_CALLS
را به این گروه منتقل میکند. در نسخه های قبلی اندروید، این مجوزها در گروه مجوز PHONE
قرار داشتند.
این گروه مجوز CALL_LOG
به کاربران امکان کنترل و دید بهتر برنامههایی را میدهد که به اطلاعات حساس در مورد تماسهای تلفنی مانند خواندن سوابق تماس تلفنی و شناسایی شماره تلفن نیاز دارند.
اگر برنامه شما نیاز به دسترسی به گزارش تماس دارد یا نیاز به پردازش تماسهای خروجی دارد، باید این مجوزها را صریحاً از گروه مجوز CALL_LOG
درخواست کنید. در غیر این صورت، یک SecurityException
رخ می دهد.
توجه: از آنجایی که این مجوزها گروهها را تغییر دادهاند و در زمان اجرا اعطا میشوند، این امکان برای کاربر وجود دارد که از دسترسی برنامه شما به اطلاعات گزارش تماسهای تلفنی خودداری کند. در این حالت، برنامه شما باید بتواند با عدم دسترسی به اطلاعات به خوبی برخورد کند.
اگر برنامه شما از قبل بهترین شیوه های مجوزهای زمان اجرا را دنبال می کند، می تواند تغییر در گروه مجوز را کنترل کند.
دسترسی محدود به شماره تلفن
برنامههایی که روی Android 9 اجرا میشوند، نمیتوانند شماره تلفن یا وضعیت تلفن را بدون دریافت مجوز READ_CALL_LOG
، بعلاوه سایر مجوزهایی که موارد استفاده برنامه شما به آن نیاز دارند، بخوانند.
شمارههای تلفن مرتبط با تماسهای ورودی و خروجی در پخش وضعیت تلفن ، مانند تماسهای ورودی و خروجی، قابل مشاهده هستند و از کلاس PhoneStateListener
قابل دسترسی هستند. با این حال، بدون مجوز READ_CALL_LOG
، قسمت شماره تلفن ارائه شده در پخشهای PHONE_STATE_CHANGED
و از طریق PhoneStateListener
خالی است.
برای خواندن شماره تلفن از وضعیت تلفن، برنامه خود را بهروزرسانی کنید تا مجوزهای لازم را بر اساس مورد استفاده خود درخواست کنید:
- برای خواندن اعداد از اقدام قصد
PHONE_STATE
، هم به مجوزREAD_CALL_LOG
و هم به مجوزREAD_PHONE_STATE
نیاز دارید. - برای خواندن اعداد از
onCallStateChanged()
فقط به مجوزREAD_CALL_LOG
نیاز دارید. شما به مجوزREAD_PHONE_STATE
نیاز ندارید.
دسترسی محدود به مکان Wi-Fi و اطلاعات اتصال
در اندروید 9، الزامات مجوز برای یک برنامه برای انجام اسکن وای فای سخت تر از نسخه های قبلی است. برای جزئیات، محدودیتهای اسکن Wi-Fi را ببینید.
محدودیتهای مشابهی برای متد getConnectionInfo()
نیز اعمال میشود که یک شی WifiInfo
را که اتصال Wi-Fi فعلی را توصیف میکند، برمیگرداند. فقط در صورتی میتوانید از روشهای این شی برای بازیابی مقادیر SSID و BSSID استفاده کنید که برنامه تماسگیرنده مجوزهای زیر را داشته باشد:
- ACCESS_FINE_LOCATION یا ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
برای بازیابی SSID یا BSSID نیز باید خدمات مکان در دستگاه فعال شود (در زیر تنظیمات > مکان ).
اطلاعات از روشهای سرویس Wi-Fi حذف شد
در Android 9، رویدادها و پخشهای زیر اطلاعاتی درباره موقعیت مکانی کاربر یا دادههای قابل شناسایی شخصی دریافت نمیکنند:
- متدهای
getScanResults()
وgetConnectionInfo()
ازWifiManager
. - متدهای
discoverServices()
وaddServiceRequest()
ازWifiP2pManager
. - پخش
NETWORK_STATE_CHANGED_ACTION
.
سیستم NETWORK_STATE_CHANGED_ACTION
که از Wi-Fi پخش میشود، دیگر حاوی SSID (قبلا EXTRA_SSID)، BSSID (قبلا EXTRA_BSSID) یا اطلاعات اتصال (قبلاً EXTRA_NETWORK_INFO) نیست. اگر برنامه شما به این اطلاعات نیاز دارد، به جای آن با getConnectionInfo()
تماس بگیرید.
اطلاعات تلفن اکنون به تنظیمات مکان دستگاه متکی است
اگر کاربر مکان دستگاه را در دستگاهی که Android 9 دارد غیرفعال کرده باشد، روشهای زیر نتیجهای را ارائه نمیدهند:
محدودیت در استفاده از رابط های غیر SDK
برای کمک به اطمینان از ثبات و سازگاری برنامه، پلتفرم استفاده از برخی روشها و زمینههای غیر SDK را محدود میکند. این محدودیتها اعمال میشوند چه بخواهید مستقیماً به این روشها و فیلدها دسترسی داشته باشید، از طریق بازتاب یا با استفاده از JNI. در Android 9، برنامه شما میتواند همچنان به این رابطهای محدود دسترسی داشته باشد. این پلتفرم از نان تست ها و ورودی های گزارش استفاده می کند تا توجه شما را جلب کند. اگر برنامه شما چنین نان تستی را نشان می دهد، مهم است که استراتژی پیاده سازی دیگری غیر از رابط کاربری محدود را دنبال کنید. اگر فکر می کنید که هیچ استراتژی جایگزینی امکان پذیر نیست، می توانید یک اشکال را برای درخواست تجدید نظر در محدودیت ارسال کنید.
محدودیتها در رابطهای غیر SDK حاوی اطلاعات مهم دیگری است. باید آن را بررسی کنید تا مطمئن شوید که برنامه شما به درستی کار می کند.
رفتار امنیتی تغییر می کند
تغییرات امنیتی دستگاه
Android 9 چندین قابلیت اضافه می کند که امنیت برنامه شما را بهبود می بخشد، صرف نظر از اینکه برنامه شما کدام نسخه را هدف قرار می دهد.
تغییرات پیاده سازی TLS
پیاده سازی TLS سیستم در اندروید 9 دستخوش تغییرات زیادی شده است:
- اگر نمونه ای از
SSLSocket
در حین ایجاد اتصال نتواند، سیستم یکIOException
به جایNullPointerException
پرتاب می کند. - کلاس
SSLEngine
به طور تمیز با هر هشدارclose_notify
که رخ می دهد کنترل می کند.
برای کسب اطلاعات بیشتر در مورد ایجاد درخواست های وب ایمن در یک برنامه Android، یک مثال HTTPS را ببینید.
فیلتر SECCOMP دقیق تر
اندروید 9 تماسهای سیستمی را که برای برنامهها در دسترس است محدودتر میکند. این رفتار یک برنامه افزودنی از فیلتر SECCOMP است که Android 8.0 (سطح API 26) شامل می شود .
تغییرات رمزنگاری
اندروید 9 تغییرات زیادی را در پیاده سازی و مدیریت الگوریتم های رمزنگاری ایجاد می کند.
پیاده سازی پارامترها و الگوریتم ها را رمزگذاری کنید
اندروید 9 پیاده سازی های اضافی پارامترهای الگوریتم را در Conscrypt ارائه می دهد. این پارامترها عبارتند از: AES، DESEDE، OAEP و EC. نسخههای Bouncy Castle این پارامترها و بسیاری از الگوریتمها از اندروید 9 منسوخ شدهاند.
اگر برنامه شما Android 8.1 (سطح API 27) یا پایینتر را هدف قرار میدهد، هنگام درخواست اجرای Bouncy Castle از یکی از این الگوریتمهای منسوخ، هشداری دریافت میکنید. با این حال، اگر اندروید 9 را هدف قرار دهید، هر یک از این درخواستها یک NoSuchAlgorithmException
میدهند.
تغییرات دیگر
اندروید 9 چندین تغییر دیگر مرتبط با رمزنگاری را معرفی می کند:
- هنگام استفاده از کلیدهای PBE، اگر Bouncy Castle منتظر یک بردار اولیه (IV) باشد و برنامه شما یکی را ارائه نکند، یک هشدار دریافت میکنید.
- اجرای Conscrypt رمز ARC4 به شما امکان می دهد ARC4/ECB/NoPadding یا ARC4/NONE/NoPadding را مشخص کنید.
- ارائه دهنده Crypto Java Cryptography Architecture (JCA) حذف شده است. در نتیجه، اگر برنامه شما
SecureRandom.getInstance("SHA1PRNG", "Crypto")
را فراخوانی کند، یکNoSuchProviderException
رخ می دهد. - اگر برنامه شما کلیدهای RSA را از بافرهایی که بزرگتر از ساختار کلید هستند تجزیه کند، دیگر استثنایی رخ نخواهد داد.
برای کسب اطلاعات بیشتر در مورد استفاده از قابلیتهای رمزنگاری اندروید، به Cryptography مراجعه کنید.
فایلهای رمزگذاری شده امن Android دیگر پشتیبانی نمیشوند
اندروید 9 به طور کامل پشتیبانی از فایل های رمزگذاری شده ایمن اندروید (ASEC) را حذف می کند.
در Android 2.2 (سطح API 8)، اندروید ASEC ها را برای پشتیبانی از عملکرد برنامه ها روی کارت SD معرفی کرد. در Android 6.0 (سطح API 23)، این پلتفرم یک فناوری دستگاه ذخیره سازی قابل قبول را معرفی کرد که توسعه دهندگان می توانند به جای ASEC از آن استفاده کنند.
به روز رسانی کتابخانه های ICU
اندروید 9 از نسخه 60 کتابخانه ICU استفاده می کند. اندروید 8.0 (سطح API 26) و اندروید 8.1 (سطح API 27) از ICU 58 استفاده می کنند.
ICU برای ارائه APIهای عمومی در زیر android.icu package
استفاده می شود و به صورت داخلی در پلتفرم Android برای پشتیبانی بین المللی استفاده می شود. به عنوان مثال، برای پیاده سازی کلاس های اندروید در java.util
، java.text
و android.text.format
استفاده می شود.
بهروزرسانی ICU 60 شامل بسیاری از تغییرات کوچک اما مفید است، از جمله پشتیبانی از دادههای Emoji 5.0 و فرمتهای تاریخ/زمان بهبود یافته، همانطور که در یادداشتهای انتشار ICU 59 و ICU 60 مستند شده است.
تغییرات قابل توجه در این به روز رسانی:
- نحوه مدیریت این پلتفرم با مناطق زمانی تغییر کرده است.
- پلتفرم GMT و UTC را بهتر مدیریت می کند. UTC دیگر مترادف GMT نیست.
ICU اکنون نام مناطق ترجمه شده را برای GMT و UTC ارائه می دهد. این تغییر قالببندی
android.icu
و رفتار تجزیه را برای مناطقی مانند "GMT"، "Etc/GMT"، "UTC"، "Etc/UTC" و "Zulu" تحت تاثیر قرار میدهد. -
java.text.SimpleDateFormat
اکنون از ICU برای ارائه نام های نمایشی برای UTC /GMT استفاده می کند، به این معنی:- قالب بندی
zzzz
یک رشته محلی طولانی برای بسیاری از مناطق ایجاد می کند. قبلاً "UTC" برای UTC و رشته هایی مانند "GMT+00:00" برای GMT تولید می کرد. - تجزیه
zzzz
رشته هایی مانند "زمان هماهنگ جهانی" و "زمان میانگین گرینویچ" را تشخیص می دهد. - اگر برنامهها فرض کنند که «UTC» یا «GMT+00:00» برای
zzzz
در همه زبانها خروجی دارند، ممکن است با مشکلات سازگاری مواجه شوند.
- قالب بندی
- رفتار
java.text.DateFormatSymbols.getZoneStrings()
تغییر کرده است:- همانند
SimpleDateFormat
، UTC و GMT اکنون نام های طولانی دارند. انواع DST نامهای منطقه زمانی برای منطقه UTC، مانند "UTC"، "Etc/UTC" و "Zulu" به GMT+00:00 تبدیل میشوند، که زمانی که نامی در دسترس نباشد، بازگشتی استاندارد است. رشته کد سختUTC
. - برخی از شناسههای ناحیه به درستی بهعنوان مترادف مناطق دیگر شناخته میشوند، بنابراین Android رشتههایی را برای شناسههای منطقه قدیمی، مانند
Eire
پیدا میکند که قبلاً قابل حل نبودند.
- همانند
- آسیا/هانوی دیگر یک منطقه شناخته شده نیست. به همین دلیل
java.util.TimeZones.getAvailableIds()
این مقدار را بر نمی گرداند وjava.util.TimeZone.getTimeZone()
آن را تشخیص نمی دهد. این رفتار با رفتارandroid.icu
موجود مطابقت دارد.
- پلتفرم GMT و UTC را بهتر مدیریت می کند. UTC دیگر مترادف GMT نیست.
- روش
android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String)
ممکن است حتی در هنگام تجزیه متن ارز قانونی، یکParseException
ایجاد کند. با استفاده ازNumberFormat.parseCurrency
، که از Android نسخه 7.0 (سطح API 24) برای متن ارز به سبکPLURALCURRENCYSTYLE
در دسترس است، از این مشکل جلوگیری کنید.
تغییرات تست اندروید
اندروید 9 تغییرات متعددی را در ساختار کتابخانه و کلاس چارچوب Android Test ایجاد می کند. این تغییرات به توسعه دهندگان کمک می کند تا از API های عمومی با پشتیبانی از چارچوب استفاده کنند، اما این تغییرات همچنین به انعطاف پذیری بیشتری در ساخت و اجرای آزمایش ها با استفاده از کتابخانه های شخص ثالث یا منطق سفارشی اجازه می دهد.
کتابخانه ها از چارچوب حذف شدند
Android 9 کلاسهای مبتنی بر JUnit را در سه کتابخانه سازماندهی مجدد میکند: android.test.base ، android.test.runner و android.test.mock . این تغییر به شما امکان میدهد آزمایشهایی را بر روی نسخهای از JUnit اجرا کنید که با وابستگیهای پروژه شما بهترین کار را دارد. این نسخه از JUnit ممکن است با نسخه ای که android.jar
ارائه می دهد متفاوت باشد.
برای کسب اطلاعات بیشتر درباره نحوه سازماندهی کلاسهای مبتنی بر JUnit در این کتابخانهها، و همچنین نحوه آمادهسازی پروژه برنامهتان برای نوشتن و اجرای آزمایشها، به راهاندازی پروژه برای تست Android مراجعه کنید.
آزمایش تغییرات ساخت مجموعه
متد addRequirements()
در کلاس TestSuiteBuilder
حذف شده است و خود کلاس TestSuiteBuilder
منسوخ شده است. متد addRequirements()
توسعه دهندگان را ملزم به ارائه آرگومان هایی می کرد که انواع آنها API های مخفی هستند و باعث می شود API نامعتبر باشد.
رسیور جاوا UTF
UTF-8 مجموعه نویسه های پیش فرض در اندروید است. یک دنباله بایت UTF-8 را می توان توسط یک سازنده String
، مانند String(byte[] bytes)
رمزگشایی کرد.
رمزگشای UTF-8 در اندروید 9 از استانداردهای یونیکد با دقت بیشتری نسبت به نسخه های قبلی پیروی می کند. تغییرات شامل موارد زیر است:
- غیرکوتاه ترین شکل UTF-8، مانند
<C0, AF>
، به عنوان بد شکل تلقی می شود. - شکل جانشین UTF-8، مانند
U+D800
..U+DFFF
، به عنوان بد شکل تلقی می شود. - بخش فرعی حداکثر با یک واحد
U+FFFD
جایگزین میشود. به عنوان مثال، در دنباله بایت "41 C0 AF 41 F4 80 80 41
"، بیشترین قسمت های فرعی "C0
"، "AF
" و "F4 80 80
" هستند. "F4 80 80
" می تواند زیر دنباله اولیه "F4 80 80 80
" باشد، اما "C0
" نمی تواند دنباله ابتدایی هر دنباله واحد کد به خوبی شکل گرفته باشد. بنابراین، خروجی باید "A\ufffd\ufffdA\ufffdA
" باشد. - برای رمزگشایی یک دنباله UTF-8 / CESU-8 اصلاح شده در Android 9 یا بالاتر، از متد
DataInputStream.readUTF()
یا روشNewStringUTF()
JNI استفاده کنید.
تأیید نام میزبان با استفاده از گواهی
RFC 2818 دو روش را برای تطبیق یک نام دامنه با یک گواهی توصیف می کند - با استفاده از نام های موجود در پسوند subjectAltName
( SAN
) یا در صورت عدم وجود پسوند SAN
، بازگشت به commonName
( CN
).
با این حال، بازگشت به CN
در RFC 2818 منسوخ شد. به همین دلیل، Android دیگر به استفاده از CN
برنمیگردد. برای تأیید نام میزبان، سرور باید یک گواهی با SAN
منطبق ارائه دهد. گواهینامه هایی که حاوی SAN
مطابق با نام میزبان نیستند، دیگر قابل اعتماد نیستند.
جستجوی آدرس شبکه می تواند باعث نقض شبکه شود
جستجوی آدرس شبکه که نیاز به تفکیک نام دارد میتواند شامل I/O شبکه باشد و بنابراین عملیات مسدود کردن در نظر گرفته میشود. عملیات مسدود کردن روی رشته اصلی می تواند باعث مکث یا jank شود.
کلاس StrictMode
یک ابزار توسعه است که به توسعه دهندگان کمک می کند تا مشکلات موجود در کد خود را شناسایی کنند.
در Android 9 و بالاتر، StrictMode
نقضهای شبکه ناشی از جستجوی آدرس شبکه را که به وضوح نام نیاز دارند، شناسایی میکند.
شما نباید برنامه های خود را با فعال بودن StrictMode
ارسال کنید. اگر این کار را انجام دهید، برنامههای شما میتوانند استثناهایی مانند NetworkOnMainThreadException
را هنگام استفاده از روشهای detectNetwork()
یا detectAll()
برای دریافت خطمشی که نقضهای شبکه را شناسایی میکند، تجربه کنند.
حل یک آدرس IP عددی یک عملیات مسدود کردن در نظر گرفته نمی شود. وضوح آدرس IP عددی مانند نسخه های قبل از اندروید 9 کار می کند.
برچسب گذاری سوکت
در نسخههای پلتفرم پایینتر از اندروید 9، اگر سوکتی با استفاده از متد setThreadStatsTag()
برچسبگذاری شود، زمانی که سوکت با استفاده از IPC بایندر با ظرف ParcelFileDescriptor
به فرآیند دیگری ارسال میشود، برچسبگذاری نمیشود.
در اندروید 9 و بالاتر، تگ سوکت زمانی که با استفاده از بایندر IPC به فرآیند دیگری ارسال میشود، حفظ میشود. این تغییر می تواند بر آمار ترافیک شبکه تأثیر بگذارد، به عنوان مثال، هنگام استفاده از متد queryDetailsForUidTag()
.
اگر میخواهید رفتار نسخههای قبلی را حفظ کنید، که سوکتی را که به فرآیند دیگری فرستاده میشود حذف میکند، میتوانید قبل از ارسال سوکت untagSocket()
را فراخوانی کنید.
مقدار بایت های موجود در سوکت گزارش شده است
متد available()
پس از فراخوانی متد shutdownInput()
0
برمی گرداند.
گزارش دقیق تر قابلیت های شبکه برای VPN ها
در Android 8.1 (سطح API 27) و پایینتر، کلاس NetworkCapabilities
فقط مجموعه محدودی از اطلاعات را برای VPNها، مانند TRANSPORT_VPN
گزارش میکند، اما NET_CAPABILITY_NOT_VPN
را حذف میکند. این اطلاعات محدود، تعیین اینکه آیا استفاده از VPN میتواند هزینههایی را برای کاربر برنامه به همراه داشته باشد، دشوار میکرد. به عنوان مثال، بررسی NET_CAPABILITY_NOT_METERED
تعیین نمی کند که آیا شبکه های اصلی اندازه گیری شده اند یا خیر.
در اندروید 9 و بالاتر، وقتی یک VPN متد setUnderlyingNetworks()
فراخوانی میکند، سیستم Android انتقالها و قابلیتهای هر شبکه زیربنایی را ادغام میکند و نتیجه را به عنوان قابلیتهای شبکه موثر شبکه VPN برمیگرداند.
در Android 9 و بالاتر، برنامههایی که قبلاً NET_CAPABILITY_NOT_METERED
را بررسی میکنند، قابلیتهای شبکه VPN و شبکههای زیربنایی را دریافت میکنند.
فایلهای موجود در پوشه xt_qtaguid دیگر در دسترس برنامهها نیستند
با شروع اندروید 9، برنامهها اجازه دسترسی خواندن مستقیم به فایلهای موجود در پوشه /proc/net/xt_qtaguid
را ندارند. دلیل آن اطمینان از سازگاری با برخی از دستگاه هایی است که اصلاً این فایل ها را ندارند.
API های عمومی که به این فایل ها متکی هستند، TrafficStats
و NetworkStatsManager
، همچنان به کار خود ادامه می دهند. با این حال، توابع cutils پشتیبانینشده، مانند qtaguid_tagSocket()
ممکن است آنطور که انتظار میرود – یا اصلاً – در دستگاههای مختلف کار نکنند.
الزام FLAG_ACTIVITY_NEW_TASK اکنون اجرا می شود
با Android 9، نمیتوانید فعالیتی را از یک زمینه غیرفعالی شروع کنید، مگر اینکه پرچم قصد FLAG_ACTIVITY_NEW_TASK
را پاس کنید. اگر بخواهید بدون عبور از این پرچم فعالیتی را شروع کنید، فعالیت شروع نمی شود و سیستم پیامی را در گزارش چاپ می کند.
چرخش صفحه نمایش تغییر می کند
با شروع اندروید 9، تغییرات قابل توجهی در حالت چرخش پرتره وجود دارد. در اندروید 8.0 (سطح API 26)، کاربران میتوانند با استفاده از کاشی تنظیمات سریع یا تنظیمات نمایش، بین حالتهای چرخش خودکار و چرخش عمودی جابهجا شوند. حالت عمودی به قفل چرخشی تغییر نام داده است و هنگامی که چرخش خودکار خاموش شود فعال است. هیچ تغییری در حالت چرخش خودکار وجود ندارد.
هنگامی که دستگاه در حالت قفل چرخشی است، کاربران می توانند صفحه نمایش خود را به هر چرخشی که توسط فعالیت قابل مشاهده بالا پشتیبانی می شود قفل کنند. یک فعالیت نباید فرض کند که همیشه به صورت پرتره ارائه می شود. اگر میتوان فعالیت بالا را در حالت چرخش خودکار در چندین چرخش ارائه کرد، همان گزینهها باید در حالت قفل چرخشی در دسترس باشند، با برخی استثناها بر اساس تنظیمات screenOrientation
فعالیت (جدول زیر را ببینید).
فعالیتهایی که جهتگیری خاصی را درخواست میکنند (مثلاً screenOrientation=landscape
)، اولویت قفل کاربر را نادیده میگیرند و مانند Android 8.0 رفتار میکنند.
تنظیمات ترجیحی جهت صفحه را می توان در سطح Activity در مانیفست Android یا به صورت برنامه نویسی با setRequestedOrientation () تنظیم کرد.
حالت قفل چرخش با تنظیم اولویت چرخش کاربر که WindowManager هنگام مدیریت چرخش فعالیت استفاده می کند، کار می کند. ترجیح چرخش کاربر ممکن است در موارد زیر تغییر کند. توجه داشته باشید که یک سوگیری برای بازگشت به چرخش طبیعی دستگاه وجود دارد که معمولاً برای دستگاههای فاکتور فرم تلفن به صورت عمودی است:
- هنگامی که کاربر یک پیشنهاد چرخش را می پذیرد، اولویت چرخش به پیشنهاد تغییر می کند.
- وقتی کاربر به یک برنامه پرتره اجباری (شامل صفحه قفل یا راهانداز) سوئیچ میکند، اولویت چرخش به حالت عمودی تغییر میکند.
جدول زیر رفتار چرخش را برای جهت گیری های رایج صفحه نمایش خلاصه می کند:
جهت صفحه نمایش | رفتار |
---|---|
نامشخص، کاربر | در چرخش خودکار و قفل چرخش، Activity را می توان به صورت عمودی یا افقی (و برعکس) رندر کرد. انتظار دارید از طرحبندیهای عمودی و افقی پشتیبانی شود. |
userLandscape | در چرخش خودکار و قفل چرخش، Activity میتواند به صورت افقی یا معکوس ارائه شود. انتظار داشته باشید که فقط طرحبندیهای منظره را پشتیبانی کنید. |
کاربر پرتره | در چرخش خودکار و قفل چرخشی، Activity میتواند به صورت عمودی یا معکوس ارائه شود. انتظار می رود که فقط از طرح بندی های پرتره پشتیبانی شود. |
fullUser | در چرخش خودکار و قفل چرخش، Activity را می توان به صورت عمودی یا افقی (و برعکس) رندر کرد. انتظار دارید از طرحبندیهای عمودی و افقی پشتیبانی شود. به کاربران قفل چرخشی این گزینه داده میشود که برای پرتره معکوس قفل کنند، اغلب 180 درجه. |
سنسور، فول سنسور، حسگر پرتره، سنسور منظره | ترجیح حالت قفل چرخش نادیده گرفته می شود و به گونه ای رفتار می شود که گویی چرخش خودکار فعال است. فقط در شرایط استثنایی با در نظر گرفتن UX بسیار دقیق از آن استفاده کنید. |
منسوخ شدن سرویس گیرنده Apache HTTP بر برنامه های دارای ClassLoader غیر استاندارد تأثیر می گذارد
با Android 6.0، پشتیبانی از سرویس گیرنده Apache HTTP را حذف کردیم . این تغییر روی اکثر برنامههایی که اندروید 9 یا بالاتر را هدف قرار نمیدهند، تأثیری ندارد. با این حال، این تغییر میتواند بر برنامههای خاصی که از ساختار ClassLoader
غیراستاندارد استفاده میکنند، تأثیر بگذارد، حتی اگر برنامهها Android 9 یا بالاتر را هدف قرار ندهند.
اگر یک برنامه از ClassLoader
غیر استانداردی استفاده کند که صریحاً به سیستم ClassLoader
محول می شود، ممکن است تحت تأثیر قرار گیرد. این برنامهها باید در عوض وقتی به دنبال کلاسها در org.apache.http.*
به برنامه ClassLoader
واگذار شوند. اگر آنها را به سیستم ClassLoader
واگذار کنند، برنامهها در Android 9 یا بالاتر با NoClassDefFoundError
از کار میافتند، زیرا آن کلاسها دیگر برای ClassLoader
سیستم شناخته نمیشوند. برای جلوگیری از مشکلات مشابه در آینده، برنامه ها به طور کلی باید کلاس ها را از طریق برنامه ClassLoader
بارگیری کنند نه اینکه مستقیماً به ClassLoader
سیستم دسترسی داشته باشند.
شمارش دوربین ها
برنامههایی که روی دستگاههای Android 9 اجرا میشوند میتوانند با فراخوانی getCameraIdList()
هر دوربین موجود را پیدا کنند. یک برنامه نباید تصور کند که دستگاه فقط یک دوربین پشتی یا فقط یک دوربین جلو دارد.
برای مثال، اگر برنامه شما دکمه ای برای جابجایی بین دوربین جلو و عقب دارد، ممکن است بیش از یک دوربین جلو یا عقب برای انتخاب وجود داشته باشد. شما باید فهرست دوربین را طی کنید، ویژگی های هر دوربین را بررسی کنید و تصمیم بگیرید که کدام دوربین را در معرض دید کاربر قرار دهید.