ویژگی ها و API های اندروید 8.1

اندروید 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 دستور دهید که همیشه پس از مواجهه با یک تهدید شناخته شده به حالت امن بازگردند:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</manifest>

MyWebActivity.java

کاتلین

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!");
            }
        }
    });
}

MyWebViewClient.java

کاتلین

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 مراجعه کنید.