اندروید 8.1 (سطح API 27) انواع ویژگی ها و قابلیت های جدید را برای کاربران و توسعه دهندگان معرفی می کند. این سند موارد جدیدی را برای توسعه دهندگان برجسته می کند.
Android Oreo (نسخه Go)
Android Go ابتکار ما برای بهینه سازی تجربه اندروید برای میلیاردها نفری است که در سراسر جهان آنلاین می شوند. با شروع اندروید 8.1، اندروید را به یک پلتفرم عالی برای دستگاههای سطح پایه تبدیل میکنیم. ویژگیهای موجود در پیکربندی Android Oreo (نسخه Go) عبارتند از:
- بهینه سازی حافظه بهبود استفاده از حافظه در سراسر پلتفرم برای اطمینان از اینکه برنامه ها می توانند به طور موثر در دستگاه هایی با رم 1 گیگابایت یا کمتر اجرا شوند.
- گزینه های هدف گیری انعطاف پذیر ثابت ویژگیهای سختافزاری جدید که به شما امکان میدهد توزیع برنامههای خود را به دستگاههای معمولی یا کم رم از طریق Google Play هدف قرار دهید.
- گوگل پلی. در حالی که همه برنامهها در دستگاههای دارای Android Oreo (نسخه Go) در دسترس خواهند بود، Google Play به برنامههایی که بهطور خاص توسط توسعهدهندگان بهینهسازی شدهاند، دید میدهد تا با دستورالعملهای میلیاردی ساختمان، تجربهای عالی را برای میلیاردها نفر فراهم کند.
ما ساختمان را برای میلیاردها دستورالعمل با راهنمایی های اضافی در مورد نحوه بهینه سازی برنامه خود برای دستگاه های دارای Android Oreo (نسخه Go) به روز کرده ایم. برای اکثر توسعهدهندگان، بهینهسازی APK موجود یا استفاده از ویژگی APK چندگانه Google Play برای هدفگیری نسخهای از APK خود برای دستگاههای با رم پایین، بهترین راه برای آماده شدن برای دستگاههای دارای Android Oreo (نسخه Go) است. به یاد داشته باشید که سبکتر و کارآمدتر کردن برنامه به نفع تمام مخاطبان شما، صرف نظر از دستگاه است.
API شبکه های عصبی
Neural Networks API محاسبات و استنتاج سریعتری را برای چارچوبهای یادگیری ماشین روی دستگاه مانند TensorFlow Lite -کتابخانه چند پلتفرمی ML Google برای تلفن همراه- و همچنین Caffe2 و دیگران فراهم میکند. برای دانلودها و اسناد از مخزن منبع باز TensorFlow Lite دیدن کنید. TensorFlow Lite با API شبکههای عصبی کار میکند تا مدلهایی مانند MobileNets ، Inception v3 و Smart Reply را به طور کارآمد در دستگاه تلفن همراه شما اجرا کند.
بهروزرسانیهای چارچوب تکمیل خودکار
Android 8.1 (سطح API 27) چندین بهبود را در چارچوب تکمیل خودکار ارائه می دهد که می توانید آنها را در برنامه های خود بگنجانید.
کلاس BaseAdapter
اکنون شامل متد setAutofillOptions()
است که به شما امکان می دهد نمایش رشته ای از مقادیر موجود در یک آداپتور را ارائه دهید. این برای کنترل های اسپینر که به صورت پویا مقادیر را در آداپتورهای خود تولید می کنند مفید است. برای مثال، میتوانید از متد setAutofillOptions()
برای ارائه نمایش رشتهای از فهرست سالهایی که کاربران میتوانند به عنوان بخشی از تاریخ انقضای کارت اعتباری انتخاب کنند، استفاده کنید. سرویس های تکمیل خودکار می توانند از نمایش رشته برای پرکردن مناسب نماهایی که به داده ها نیاز دارند استفاده کنند.
علاوه بر این، کلاس AutofillManager
شامل متد notifyViewVisibilityChanged(View, int, boolean)
که میتوانید با فراخوانی آن چارچوب را در مورد تغییرات در نمایان بودن یک نما در ساختار مجازی مطلع کنید. همچنین روش برای ساختارهای غیر مجازی اضافه بار وجود دارد. با این حال، ساختارهای غیر مجازی معمولاً از شما نمیخواهند که به طور صریح چارچوب را مطلع کنید، زیرا این متد قبلاً توسط کلاس View
فراخوانی شده است.
Android 8.1 همچنین با افزودن پشتیبانی از CustomDescription and
Validator
در SaveInfo
به خدمات تکمیل خودکار توانایی بیشتری برای سفارشیسازی هزینه ذخیرهسازی رابط کاربری میدهد.
توضیحات سفارشی برای کمک به سرویس تکمیل خودکار مفید هستند تا موارد ذخیره شده را روشن کند. به عنوان مثال، هنگامی که صفحه دارای یک کارت اعتباری است، می تواند نشانی از بانک کارت اعتباری، چهار رقم آخر شماره کارت اعتباری و شماره انقضای آن را نمایش دهد. برای کسب اطلاعات بیشتر، به کلاس CustomDescription
مراجعه کنید.
اشیاء Validator
برای جلوگیری از نمایش رابط کاربری ذخیره خودکار تکمیل خودکار زمانی که شرط اعتبارسنجی برآورده نمی شود استفاده می شود. برای کسب اطلاعات بیشتر، کلاس Validator را به همراه زیر کلاس های آن، LuhnChecksumValidator و RegexValidator ببینید.
اطلاعیه ها
اندروید 8.1 شامل تغییرات زیر در اعلانها میشود:
- اکنون برنامه ها فقط می توانند یک بار در ثانیه صدای هشدار اعلان ایجاد کنند. صداهای هشداری که بیش از این نرخ هستند در صف قرار نمی گیرند و از بین می روند. این تغییر بر سایر جنبههای رفتار اعلان تأثیر نمیگذارد و پیامهای اعلان همچنان همانطور که انتظار میرفت پست میشوند.
-
NotificationListenerService
وConditionProviderService
در دستگاههای مجهز به رم کم Android که با فراخوانیActivityManager.isLowRamDevice()
true
برمیگردانند پشتیبانی نمیشوند.
به روز رسانی EditText
با شروع API سطح 27، روش EditText.getText()
یک Editable
را برمی گرداند. قبلاً یک CharSequence
برگردانده بود. این تغییر سازگار با عقب است، زیرا Editable
CharSequence
پیاده سازی می کند.
رابط Editable
قابلیت های اضافی ارزشمندی را ارائه می دهد. برای مثال، از آنجایی که Editable
رابط Spannable
را نیز پیادهسازی میکند، میتوانید نشانهگذاری را روی محتوای یک نمونه از EditText
اعمال کنید.
اقدامات مرور ایمن برنامهای
با استفاده از اجرای WebView
Safe Browsing API، برنامه شما میتواند تشخیص دهد که چه زمانی نمونهای از WebView
تلاش میکند به URL که Google آن را بهعنوان یک تهدید شناختهشده طبقهبندی کرده است حرکت کند. به طور پیش فرض، WebView
یک بینابینی را نشان می دهد که به کاربران در مورد تهدید شناخته شده هشدار می دهد. این صفحه به کاربران این امکان را می دهد که URL را به هر حال بارگیری کنند یا به صفحه قبلی ایمن بازگردند.
در Android 8.1، میتوانید به صورت برنامهریزی تعریف کنید که چگونه برنامه شما به یک تهدید شناخته شده پاسخ میدهد:
- میتوانید کنترل کنید که آیا برنامه شما تهدیدات شناخته شده را به «مرور ایمن» گزارش میدهد یا خیر.
- میتوانید هر بار که برنامهتان با URLی مواجه میشود که «مرور ایمن» آن را بهعنوان یک تهدید شناختهشده طبقهبندی میکند، بهطور خودکار یک عمل خاص مانند بازگشت به ایمنی را انجام دهید.
توجه: برای محافظت بهینه در برابر تهدیدات شناخته شده، قبل از فراخوانی متد loadUrl()
یک شی WebView
، صبر کنید تا مرور ایمن را مقداردهی کنید.
تکههای کد زیر نشان میدهد که چگونه میتوانید به نمونههای برنامه WebView
دستور دهید که همیشه پس از مواجهه با یک تهدید شناخته شده به حالت امن بازگردند:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
کاتلین
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
جاوا
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
کاتلین
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
جاوا
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
استخراج کننده ریز عکسها
کلاس MediaMetadataRetriever
یک متد جدید به نام getScaledFrameAtTime()
دارد که یک فریم را در نزدیکی یک موقعیت زمانی معین پیدا می کند و یک بیت مپ با نسبت ابعادی مشابه فریم منبع را برمی گرداند، اما مقیاس بندی شده تا در یک مستطیل با عرض و ارتفاع معین قرار گیرد. این برای تولید تصاویر کوچک از ویدیو مفید است.
توصیه میکنیم از این روش بهجای getFrameAtTime()
استفاده کنید که میتواند حافظه را هدر دهد زیرا یک بیت مپ با وضوح تصویر منبع را برمیگرداند. به عنوان مثال، یک فریم از یک ویدیوی 4K یک بیت مپ 16 مگابایتی خواهد بود، بسیار بزرگتر از آنچه برای یک تصویر کوچک نیاز دارید.
API حافظه مشترک
Android 8.1 (سطح API 27) یک SharedMemory
API جدید معرفی می کند. این کلاس به شما امکان می دهد یک نمونه SharedMemory
ناشناس ایجاد، نقشه برداری و مدیریت کنید. شما حفاظت از حافظه را روی یک شی SharedMemory
برای خواندن و/یا نوشتن تنظیم میکنید، و از آنجایی که شی SharedMemory
Parcelable است، میتوانید به راحتی آن را از طریق AIDL به فرآیند دیگری منتقل کنید.
SharedMemory
API با تسهیلات ASharedMemory
در NDK تعامل دارد. ASharedMemory
به یک توصیفگر فایل دسترسی می دهد که می تواند برای خواندن و نوشتن نقشه برداری شود. این یک راه عالی برای به اشتراک گذاشتن مقادیر زیادی از داده ها بین برنامه ها یا بین چندین فرآیند در یک برنامه واحد است.
WallpaperColors API
Android 8.1 (سطح API 27) به تصویر زمینه زنده شما اجازه می دهد تا اطلاعات رنگی را به رابط کاربری سیستم ارائه دهد. این کار را با ایجاد یک شی WallpaperColors
از یک bitmap، یک drawable یا با استفاده از سه رنگ انتخاب شده به صورت دستی انجام می دهید. شما همچنین می توانید این اطلاعات رنگ را بازیابی کنید.
برای ایجاد یک شی WallpaperColors
، یکی از موارد زیر را انجام دهید:
- برای ایجاد یک شی
WallpaperColors
با استفاده از سه رنگ، یک نمونه از کلاسWallpaperColors
با عبور رنگ اصلی، ثانویه و سوم ایجاد کنید. رنگ اصلی نباید پوچ باشد. - برای ایجاد یک شی
WallpaperColors
از یک بیت مپ، متدfromBitmap()
را با ارسال منبع بیت مپ به عنوان پارامتر فراخوانی کنید. - برای ایجاد یک شی
WallpaperColors
از یک drawable، متدfromDrawable()
را با ارسال منبع drawable به عنوان پارامتر فراخوانی کنید.
برای بازیابی جزئیات رنگ اولیه، ثانویه یا سوم از کاغذ دیواری، روش های زیر را فراخوانی کنید:
-
getPrimaryColor()
بیشترین رنگ تصویر زمینه را به نمایش می گذارد. -
getSecondaryColor()
دومین رنگ برجسته والپیپر را برمی گرداند. - متد
getTertiaryColor()
سومین رنگ برجسته والپیپر را برمی گرداند.
برای اطلاع به سیستم در مورد هرگونه تغییر رنگ قابل توجه در تصویر زمینه زنده خود، متد notifyColorsChanged()
را فراخوانی کنید. این روش یک رویداد چرخه حیات onComputeColors()
را راهاندازی میکند که در آن فرصتی برای ارائه یک شی WallpaperColors
جدید دارید.
برای افزودن شنونده برای تغییرات رنگ، می توانید متد addOnColorsChangedListener()
را فراخوانی کنید. همچنین میتوانید متد getWallpaperColors()
را برای بازیابی رنگهای اصلی یک کاغذ دیواری فراخوانی کنید.
به روز رسانی اثر انگشت
کلاس FingerprintManager
کدهای خطای زیر را معرفی کرده است:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
- کاربر بارها سعی کرده است قفل دستگاه خود را با استفاده از خواننده اثر انگشت باز کند. -
FINGERPRINT_ERROR_VENDOR
- یک خطای اثر انگشت خوان خاص فروشنده رخ داد.
به روز رسانی رمزنگاری
تعدادی از تغییرات رمزنگاری با اندروید 8.1 انجام شده است:
- الگوریتم های جدیدی در Conscrypt پیاده سازی شده است. پیاده سازی Conscrypt ترجیحاً نسبت به اجرای Bouncy Castle موجود استفاده می شود. الگوریتم های جدید عبارتند از:
-
AlgorithmParameters:GCM
-
KeyGenerator:AES
-
KeyGenerator:DESEDE
-
KeyGenerator:HMACMD5
-
KeyGenerator:HMACSHA1
-
KeyGenerator:HMACSHA224
-
KeyGenerator:HMACSHA256
-
KeyGenerator:HMACSHA384
-
KeyGenerator:HMACSHA512
-
SecretKeyFactory:DESEDE
-
Signature:NONEWITHECDSA
-
-
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
دیگر برای الگوریتم هایی که از GCM استفاده می کنند کار نمی کند. در عوض، ازgetParameterSpec(GCMParameterSpec.class)
استفاده کنید. - بسیاری از کلاس های داخلی Conscrypt مرتبط با TLS بازسازی شدند. از آنجایی که توسعه دهندگان گاهی اوقات به صورت بازتابی به این موارد دسترسی دارند، شیم ها برای پشتیبانی از استفاده قبلی در جای خود باقی می مانند، اما برخی جزئیات تغییر کرده اند. به عنوان مثال، سوکت ها قبلا از نوع
OpenSSLSocketImpl
بودند، اما اکنون از نوعConscryptFileDescriptorSocket
یاConscryptEngineSocket
هستند که هر دوOpenSSLSocketImpl
گسترش می دهند. - روشهای
SSLSession
که برای پرتابIllegalArgumentException
استفاده میشوند، در صورت ارسال یک مرجع تهی، اکنونNullPointerException
پرتاب میکنند. - RSA
KeyFactory
دیگر اجازه تولید کلیدها را از آرایه های بایتی بزرگتر از کلید رمزگذاری شده نمی دهد. فراخوانی برایgeneratePrivate()
وgeneratePublic()
که یکKeySpec
ارائه می کنند که در آن ساختار کلید کل بافر را پر نمی کند، منجر بهInvalidKeySpecException
می شود. - هنگامی که سوکت خواندن با بسته شدن سوکت قطع می شود، Conscrypt برای بازگشت -1 از خواندن استفاده می کند. خواندن اکنون
SocketException
می اندازد. - مجموعه گواهیهای CA ریشه تغییر کرده است، اکثراً تعداد زیادی از گواهیهای منسوخ را حذف میکنند، اما گواهیهای ریشه WoSign و StartCom را نیز حذف میکنند. برای اطلاعات بیشتر در مورد این تصمیم، به پست وبلاگ امنیتی Google، حذف نهایی اعتماد در WoSign و گواهیهای StartCom مراجعه کنید.