اندروید 6.0 (سطح 23 API) همراه با ویژگیها و قابلیتهای جدید، شامل انواع تغییرات سیستم و تغییرات رفتاری API است. این سند برخی از تغییرات کلیدی را که باید درک کنید و در برنامههای خود در نظر بگیرید، برجسته میکند.
اگر قبلاً اپلیکیشنی را برای اندروید منتشر کرده اید، توجه داشته باشید که این تغییرات در پلتفرم روی اپلیکیشن شما تاثیر می گذارد.
مجوزهای زمان اجرا
این نسخه یک مدل مجوز جدید را معرفی می کند، که در آن کاربران اکنون می توانند مستقیماً مجوزهای برنامه را در زمان اجرا مدیریت کنند. این مدل به کاربران دید و کنترل بهتری بر مجوزها می دهد، در حالی که فرآیندهای نصب و به روز رسانی خودکار را برای توسعه دهندگان برنامه ساده می کند. کاربران می توانند مجوزها را به صورت جداگانه برای برنامه های نصب شده اعطا یا لغو کنند.
در برنامههایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار میدهند، حتماً مجوزها را در زمان اجرا بررسی کرده و درخواست کنید. برای تعیین اینکه آیا به برنامه شما مجوز اعطا شده است یا خیر، روش new checkSelfPermission()
را فراخوانی کنید. برای درخواست مجوز، متد new requestPermissions()
را فراخوانی کنید. حتی اگر برنامه شما اندروید 6.0 (سطح API 23) را هدف قرار نمی دهد، باید برنامه خود را تحت مدل مجوزهای جدید آزمایش کنید.
برای جزئیات در مورد پشتیبانی از مدل مجوزهای جدید در برنامه خود، به کار با مجوزهای سیستم مراجعه کنید. برای نکاتی درباره نحوه ارزیابی تأثیر بر برنامهتان، به یادداشتهای استفاده از مجوزها مراجعه کنید.
Doze و App Standby
این نسخه بهینهسازیهای جدید صرفهجویی در مصرف انرژی را برای دستگاهها و برنامههای غیرفعال معرفی میکند. این ویژگیها بر همه برنامهها تأثیر میگذارد، بنابراین مطمئن شوید که برنامههای خود را در این حالتهای جدید آزمایش کنید.
- Doze : اگر کاربر دستگاهی را از برق جدا کند و آن را با صفحه خاموش برای مدتی ثابت رها کند، دستگاه به حالت Doze می رود، جایی که سعی می کند سیستم را در حالت خواب نگه دارد. در این حالت، دستگاهها بهطور دورهای برای مدت کوتاهی فعالیتهای عادی خود را از سر میگیرند تا همگامسازی برنامهها اتفاق بیفتد و سیستم بتواند هر گونه عملیات معلق را انجام دهد.
- App Standby : App Standby به سیستم اجازه میدهد تا زمانی که کاربر به طور فعال از برنامه استفاده نمیکند، بیکار است یا خیر. این سیستم زمانی این تصمیم را می گیرد که کاربر برای مدت معینی برنامه را لمس نکند. اگر دستگاه قطع شود، سیستم دسترسی به شبکه را غیرفعال میکند و همگامسازیها و کارهای برنامههایی را که بیکار میداند به حالت تعلیق در میآورد.
برای کسب اطلاعات بیشتر در مورد این تغییرات صرفه جویی در مصرف انرژی، به بهینه سازی برای Doze و App Standby مراجعه کنید.
حذف کلاینت HTTP Apache
نسخه اندروید 6.0 پشتیبانی از سرویس گیرنده Apache HTTP را حذف می کند. اگر برنامه شما از این سرویس گیرنده استفاده می کند و Android 2.3 (سطح API 9) یا بالاتر را هدف قرار می دهد، به جای آن از کلاس HttpURLConnection
استفاده کنید. این API کارآمدتر است زیرا استفاده از شبکه را از طریق فشرده سازی شفاف و ذخیره پاسخ کاهش می دهد و مصرف انرژی را به حداقل می رساند. برای ادامه استفاده از Apache HTTP API، ابتدا باید وابستگی زمان کامپایل زیر را در فایل build.gradle
خود اعلام کنید:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
اندروید در حال دور شدن از OpenSSL به کتابخانه BoringSSL است. اگر از Android NDK در برنامه خود استفاده میکنید، به کتابخانههای رمزنگاری که بخشی از API NDK نیستند، مانند libcrypto.so
و libssl.so
، پیوند ندهید. این کتابخانهها APIهای عمومی نیستند و ممکن است بدون اطلاع قبلی در نسخهها و دستگاهها تغییر کنند یا خراب شوند. علاوه بر این، ممکن است خود را در معرض آسیبپذیریهای امنیتی قرار دهید. در عوض، کد بومی خود را تغییر دهید تا APIهای رمزنگاری جاوا را از طریق JNI فراخوانی کنید یا به صورت ایستا با یک کتابخانه رمزنگاری انتخابی خود پیوند برقرار کنید.
دسترسی به شناسه سخت افزار
برای ارائه محافظت بیشتر از دادهها به کاربران، با شروع این نسخه، Android دسترسی برنامهریزی شده به شناسه سختافزار محلی دستگاه را برای برنامههایی که از APIهای Wi-Fi و بلوتوث استفاده میکنند حذف میکند. متدهای WifiInfo.getMacAddress()
و BluetoothAdapter.getAddress()
اکنون مقدار ثابت 02:00:00:00:00:00
برمی گرداند.
برای دسترسی به شناسههای سختافزار دستگاههای خارجی مجاور از طریق اسکن بلوتوث و Wi-Fi، اکنون برنامه شما باید مجوزهای ACCESS_FINE_LOCATION
یا ACCESS_COARSE_LOCATION
را داشته باشد:
توجه : وقتی دستگاهی که دارای Android 6.0 (سطح API 23) است، یک اسکن پسزمینه Wi-Fi یا بلوتوث را آغاز میکند، این عملیات برای دستگاههای خارجی قابل مشاهده است که از یک آدرس MAC تصادفی منشا میگیرد.
اطلاعیه ها
این نسخه متد Notification.setLatestEventInfo()
حذف می کند. به جای آن از کلاس Notification.Builder
برای ساخت اعلان ها استفاده کنید. برای بهروزرسانی مکرر یک اعلان، از نمونه Notification.Builder
دوباره استفاده کنید. برای دریافت نمونههای بهروزرسانی شده Notification
، متد build()
فراخوانی کنید.
دستور adb shell dumpsys notification
دیگر متن اعلان شما را چاپ نمی کند. به جای آن از دستور adb shell dumpsys notification --noredact
برای چاپ متن در یک شی اعلان استفاده کنید.
تغییرات AudioManager
تنظیم مستقیم صدا یا نادیده گرفتن جریانهای خاص از طریق کلاس AudioManager
دیگر پشتیبانی نمیشود. متد setStreamSolo()
منسوخ شده است و به جای آن باید متد requestAudioFocus()
را فراخوانی کنید. به طور مشابه، متد setStreamMute()
منسوخ شده است. در عوض، متد adjustStreamVolume()
را فراخوانی کنید و مقدار جهت ADJUST_MUTE
یا ADJUST_UNMUTE
را ارسال کنید.
انتخاب متن
وقتی کاربران متنی را در برنامه شما انتخاب میکنند، اکنون میتوانید اقدامات انتخاب متن مانند برش ، کپی و جایگذاری را در یک نوار ابزار شناور نمایش دهید. پیادهسازی تعامل کاربر مشابه با نوار اقدام متنی است، همانطور که در فعال کردن حالت کنش متنی برای نماهای فردی توضیح داده شده است.
برای پیاده سازی نوار ابزار شناور برای انتخاب متن، تغییرات زیر را در برنامه های موجود خود اعمال کنید:
- در
View
یاActivity
شی، تماسهایActionMode
خود را ازstartActionMode(Callback)
بهstartActionMode(Callback, ActionMode.TYPE_FLOATING)
تغییر دهید. - اجرای فعلی
ActionMode.Callback
را بگیرید و در عوض آن را گسترش دهیدActionMode.Callback2
. - روش
onGetContentRect()
را نادیده بگیرید تا مختصات شیRect
محتوا (مانند مستطیل انتخاب متن) را در view ارائه کنید. - اگر موقعیت مستطیل دیگر معتبر نیست، و این تنها عنصری است که باید باطل شود، متد
invalidateContentRect()
را فراخوانی کنید.
اگر از نسخه 22.2 کتابخانه پشتیبانی Android استفاده میکنید، توجه داشته باشید که نوار ابزار شناور سازگار با عقب نیست و appcompat بهطور پیشفرض کنترل اشیاء ActionMode
را در دست میگیرد. این کار از نمایش نوار ابزارهای شناور جلوگیری می کند. برای فعال کردن پشتیبانی ActionMode
در AppCompatActivity
، getDelegate()
را فراخوانی کنید، سپس setHandleNativeActionModesEnabled()
را در شی AppCompatDelegate
برگشتی فراخوانی کنید و پارامتر ورودی را روی false
قرار دهید. این فراخوانی کنترل اشیاء ActionMode
را به فریمورک برمی گرداند. در دستگاههای دارای Android 6.0 (سطح API 23)، که به چارچوب اجازه میدهد از حالتهای ActionBar
یا نوار ابزار شناور پشتیبانی کند، در حالی که در دستگاههای دارای Android 5.1 (سطح API 22) یا پایینتر، فقط حالتهای ActionBar
پشتیبانی میشوند.
تغییرات نشانک مرورگر
این نسخه پشتیبانی از نشانک های جهانی را حذف می کند. متدهای android.provider.Browser.getAllBookmarks()
و android.provider.Browser.saveBookmark()
اکنون حذف شده اند. به همین ترتیب، مجوزهای READ_HISTORY_BOOKMARKS
و WRITE_HISTORY_BOOKMARKS
حذف می شوند. اگر برنامه شما Android 6.0 (سطح API 23) یا بالاتر را هدف قرار میدهد، به نشانکهای ارائهدهنده جهانی دسترسی نداشته باشید یا از مجوزهای نشانک استفاده نکنید. در عوض، برنامه شما باید داده های نشانک ها را در داخل ذخیره کند.
تغییرات Android Keystore
با این نسخه، ارائهدهنده Android Keystore دیگر از DSA پشتیبانی نمیکند. ECDSA هنوز پشتیبانی می شود.
هنگامی که صفحه قفل ایمن غیرفعال یا بازنشانی شود (مثلاً توسط کاربر یا مدیر دستگاه) کلیدهایی که در حالت استراحت نیازی به رمزگذاری ندارند، دیگر حذف نخواهند شد. کلیدهایی که در حالت استراحت نیاز به رمزگذاری دارند در طول این رویدادها حذف خواهند شد.
تغییرات وای فای و شبکه
این نسخه تغییرات رفتاری زیر را در Wi-Fi و API های شبکه معرفی می کند.
- برنامه های شما اکنون می توانند وضعیت اشیاء
WifiConfiguration
را تنها در صورتی تغییر دهند که این اشیاء را ایجاد کرده باشید. شما مجاز به تغییر یا حذف اشیاءWifiConfiguration
ایجاد شده توسط کاربر یا سایر برنامه ها نیستید. - قبلاً، اگر یک برنامه با استفاده از
enableNetwork()
با تنظیماتdisableAllOthers=true
، دستگاه را مجبور به اتصال به یک شبکه Wi-Fi خاص می کرد، دستگاه از شبکه های دیگر مانند داده های تلفن همراه قطع می شد. در این نسخه، دستگاه دیگر از چنین شبکه های دیگری قطع نمی شود. اگرtargetSdkVersion
برنامه شما“20”
یا کمتر باشد، به شبکه Wi-Fi انتخاب شده پین می شود. اگرtargetSdkVersion
برنامه شما“21”
یا بالاتر است، از APIهای چند شبکه ای (مانندopenConnection()
،bindSocket()
و روش جدیدbindProcessToNetwork()
) استفاده کنید تا مطمئن شوید که ترافیک شبکه آن به شبکه انتخابی ارسال می شود.
تغییرات سرویس دوربین
در این نسخه، مدل دسترسی به منابع به اشتراک گذاشته شده در سرویس دوربین از مدل دسترسی "اولین خدمت، اولین خدمت" قبلی به مدل دسترسی که در آن فرآیندهای با اولویت بالا ترجیح داده شده است، تغییر کرده است. تغییرات در رفتار خدمات عبارتند از:
- دسترسی به منابع زیرسیستم دوربین، از جمله باز کردن و پیکربندی یک دستگاه دوربین، بر اساس "اولویت" فرآیند درخواست مشتری اعطا می شود. فرآیندهای برنامه با فعالیت های قابل مشاهده توسط کاربر یا پیش زمینه عموماً اولویت بیشتری دارند و به دست آوردن منابع دوربین و استفاده از آنها قابل اعتمادتر می شود.
- هنگامی که یک برنامه با اولویت بالاتر سعی میکند از دوربین استفاده کند، کلاینتهای دوربین فعال برای برنامههای با اولویت پایینتر ممکن است «اخراج» شوند. در
Camera
API منسوخ شده، این منجر بهonError()
برای کلاینت خارج شده می شود. درCamera2
API، منجر به فراخوانیonDisconnected()
برای کلاینت خارج شده می شود. - در دستگاههایی با سختافزار دوربین مناسب، فرآیندهای کاربردی جداگانه میتوانند به طور مستقل دستگاههای دوربین جداگانه را باز کرده و به طور همزمان استفاده کنند. با این حال، موارد استفاده چند فرآیندی، که در آن دسترسی همزمان باعث کاهش قابل توجه عملکرد یا قابلیتهای هر یک از دستگاههای دوربین باز میشود، اکنون توسط سرویس دوربین شناسایی و غیرمجاز شدهاند. این تغییر ممکن است منجر به "اخراج" برای مشتریان با اولویت پایین تر شود، حتی زمانی که هیچ برنامه دیگری مستقیماً سعی در دسترسی به همان دستگاه دوربین ندارد.
- تغییر کاربر فعلی باعث میشود که کلاینتهای دوربین فعال در برنامههای متعلق به حساب کاربری قبلی خارج شوند. دسترسی به دوربین به نمایه های کاربری که متعلق به کاربر فعلی دستگاه است محدود می شود. در عمل، این بدان معناست که برای مثال، یک حساب «مهمان» نمیتواند از فرآیندهای در حال اجرا که از زیرسیستم دوربین استفاده میکنند، هنگامی که کاربر به حساب دیگری تغییر مکان داده است، ترک کند.
زمان اجرا
اکنون زمان اجرا ART به درستی قوانین دسترسی متد newInstance()
را پیاده سازی می کند. این تغییر مشکلی را برطرف میکند که در آن Dalvik قوانین دسترسی را در نسخههای قبلی به درستی بررسی میکرد. اگر برنامه شما از متد newInstance()
استفاده میکند و میخواهید بررسیهای دسترسی را لغو کنید، متد setAccessible()
را با پارامتر ورودی روی true
فراخوانی کنید. اگر برنامه شما از کتابخانه v7 appcompat یا کتابخانه v7 recyclerview استفاده می کند، باید برنامه خود را برای استفاده به آخرین نسخه این کتابخانه ها به روز کنید. در غیر این صورت، مطمئن شوید که هر کلاس سفارشی که از XML به آن ارجاع داده می شود، به روز شده باشد تا سازنده کلاس آنها قابل دسترسی باشد.
این نسخه رفتار پیوند دهنده پویا را به روز می کند. پیوند دهنده پویا اکنون تفاوت بین soname
یک کتابخانه و مسیر آن ( اشکال عمومی 6670 ) را درک می کند و جستجو بر اساس soname
اکنون پیاده سازی شده است. برنامههایی که قبلاً کار میکردند و ورودیهای DT_NEEDED
بدی دارند (معمولاً مسیرهای مطلق در سیستم فایل ماشین ساخت) ممکن است هنگام بارگیری از کار بیفتند.
پرچم dlopen(3) RTLD_LOCAL
اکنون به درستی اجرا شده است. توجه داشته باشید که RTLD_LOCAL
پیشفرض است، بنابراین فراخوانهای dlopen(3)
که به صراحت از RTLD_LOCAL
استفاده نکردهاند تحت تأثیر قرار میگیرند (مگر اینکه برنامه شما به صراحت از RTLD_GLOBAL
استفاده کرده باشد). با RTLD_LOCAL
، نمادها در دسترس کتابخانههایی قرار نمیگیرند که با فراخوانیهای بعدی به dlopen(3)
بارگیری میشوند (برخلاف ارجاع توسط ورودیهای DT_NEEDED
).
در نسخههای قبلی Android، اگر برنامه شما از سیستم درخواست میکرد که یک کتابخانه مشترک با جابجایی متن بارگیری کند، سیستم یک هشدار نمایش میدهد اما همچنان اجازه میدهد کتابخانه بارگیری شود. در ابتدای این نسخه، اگر نسخه SDK هدف برنامه شما 23 یا بالاتر باشد، سیستم این کتابخانه را رد می کند. برای کمک به تشخیص اینکه آیا کتابخانه ای بارگیری نمی شود، برنامه شما باید خطای dlopen(3)
ثبت کند و متن شرح مشکلی را که فراخوانی dlerror(3)
برمی گرداند، اضافه کند. برای کسب اطلاعات بیشتر در مورد مدیریت جابجایی متن، به این راهنما مراجعه کنید.
اعتبار سنجی APK
این پلتفرم اکنون اعتبارسنجی دقیق تری برای APK ها انجام می دهد. اگر فایلی در مانیفست اعلام شده باشد اما در خود APK وجود نداشته باشد، یک APK خراب در نظر گرفته می شود. در صورت حذف هر یک از محتویات، یک APK باید دوباره امضا شود.
اتصال USB
اتصالات دستگاه از طریق درگاه USB اکنون به طور پیش فرض روی حالت فقط شارژ تنظیم شده است. برای دسترسی به دستگاه و محتوای آن از طریق اتصال USB، کاربران باید صریحاً اجازه چنین تعاملاتی را بدهند. اگر برنامه شما از تعامل کاربر با دستگاه از طریق درگاه USB پشتیبانی میکند، در نظر داشته باشید که تعامل باید صریحاً فعال باشد.
تغییرات Android for Work
این نسخه شامل تغییرات رفتاری زیر برای Android for Work است:
- تماس های کاری در زمینه های شخصی Google Dialer Call Log اکنون وقتی کاربر تماسهای گذشته را مشاهده میکند، مخاطبین کاری را نشان میدهد. تنظیم
setCrossProfileCallerIdDisabled()
رویtrue
، مخاطبین نمایه کاری را در گزارش تماس Google Dialer پنهان می کند. تنها در صورتی کهsetBluetoothContactSharingDisabled()
رویfalse
تنظیم کرده باشید، میتوانند همراه با مخاطبین شخصی در دستگاهها از طریق بلوتوث نمایش داده شوند. به طور پیش فرض رویtrue
تنظیم شده است. - حذف پیکربندی Wi-Fi: پیکربندیهای Wi-Fi اضافه شده توسط مالک نمایه (به عنوان مثال، از طریق تماس با متد
addNetwork()
) اکنون در صورت حذف آن نمایه کاری حذف میشوند. - قفل کردن پیکربندی Wi-Fi: اگر
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
غیرصفر باشد، هر پیکربندی Wi-Fi ایجاد شده توسط یک مالک فعال دستگاه دیگر نمی تواند توسط کاربر تغییر یا حذف شود. کاربر همچنان می تواند تنظیمات Wi-Fi خود را ایجاد و تغییر دهد. صاحبان دستگاه های فعال این امتیاز را دارند که هر گونه پیکربندی Wi-Fi را ویرایش یا حذف کنند، از جمله پیکربندی هایی که توسط آنها ایجاد نشده است. - دانلود کنترلکننده خطمشی دستگاه از طریق افزودن حساب Google: وقتی یک حساب Google که نیاز به مدیریت از طریق برنامه کنترلکننده خطمشی دستگاه (DPC) دارد به دستگاهی خارج از یک زمینه مدیریتشده اضافه میشود، اکنون جریان حساب افزودن از کاربر میخواهد WPC مناسب را نصب کند. این رفتار همچنین برای حسابهایی که از طریق تنظیمات > حسابها و در برنامه راهاندازی اولیه دستگاه اضافه شدهاند، اعمال میشود.
- تغییرات در رفتارهای خاص
DevicePolicyManager
API:- فراخوانی متد
setCameraDisabled()
روی دوربین فقط برای کاربر تماس گیرنده تاثیر می گذارد. فراخوانی آن از نمایه مدیریت شده تأثیری بر برنامه های دوربین در حال اجرا در کاربر اصلی ندارد. - علاوه بر این، متد
setKeyguardDisabledFeatures()
اکنون برای مالکان پروفایل و همچنین برای صاحبان دستگاه در دسترس است. - یک مالک نمایه میتواند این محدودیتهای محافظ کلید را تنظیم کند:
-
KEYGUARD_DISABLE_TRUST_AGENTS
وKEYGUARD_DISABLE_FINGERPRINT
، که بر تنظیمات محافظ صفحه کلید برای کاربر اصلی نمایه تأثیر میگذارند. -
KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
، که فقط بر اعلان های ایجاد شده توسط برنامه های کاربردی در نمایه مدیریت شده تأثیر می گذارد.
-
- متدهای
DevicePolicyManager.createAndInitializeUser()
وDevicePolicyManager.createUser()
منسوخ شده اند. - متد
setScreenCaptureDisabled()
اکنون ساختار کمکی را نیز هنگامی که یک برنامه از کاربر در پیش زمینه است مسدود می کند. -
EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
اکنون SHA-256 پیشفرض است. SHA-1 هنوز برای سازگاری با عقب پشتیبانی می شود اما در آینده حذف خواهد شد.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
اکنون فقط SHA-256 را می پذیرد. - APIهای اولیه ساز دستگاه که در Android 6.0 (سطح API 23) وجود داشت اکنون حذف شده اند.
-
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
حذف شده است، بنابراین NFC bump provisioning نمی تواند قفل دستگاه محافظت شده بازنشانی کارخانه ای را به صورت برنامه ریزی باز کند. - اکنون میتوانید از
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
اضافی برای انتقال دادهها به برنامه مالک دستگاه در طول ارائه NFC دستگاه مدیریتشده استفاده کنید. - APIهای Android for Work برای مجوزهای زمان اجرا M از جمله نمایههای Work، لایه کمکی و موارد دیگر بهینه شدهاند. APIهای مجوز
DevicePolicyManager
جدید بر برنامههای قبل از M تأثیر نمیگذارند. - وقتی کاربران از قسمت همزمان جریان راهاندازی که از طریق یک هدف
ACTION_PROVISION_MANAGED_PROFILE
یاACTION_PROVISION_MANAGED_DEVICE
آغاز شده است، خارج میشوند، سیستم اکنون یک کد نتیجهRESULT_CANCELED
را برمیگرداند.
- فراخوانی متد
- تغییرات در سایر API ها :
- استفاده از داده: کلاس
android.app.usage.NetworkUsageStats
بهNetworkStats
تغییر نام داده است.
- استفاده از داده: کلاس
- تغییرات در تنظیمات جهانی :
- این تنظیمات دیگر از طریق
setGlobalSettings()
قابل تنظیم نیستند:-
BLUETOOTH_ON
-
DEVELOPMENT_SETTINGS_ENABLED
-
MODE_RINGER
-
NETWORK_PREFERENCE
-
WIFI_ON
-
- اکنون می توان این تنظیمات جهانی را از طریق
setGlobalSettings()
تنظیم کرد:
- این تنظیمات دیگر از طریق