ویژگی‌ها و میاناهای برنامه‌سازی کاربردی Android 9

‫Android 9 (سطح API 28) ویژگی‌ها و قابلیت‌های جدید فوق‌العاده‌ای را برای کاربران و توسعه‌دهندگان معرفی می‌کند. این سند موارد جدید برای توسعه‌دهندگان را برجسته می‌کند.

برای آشنایی با میاناهای برنامه‌سازی کاربردی جدید، گزارش تفاوت میانای برنامه‌سازی کاربردی را بخوانید یا به مرجع میانای برنامه‌سازی کاربردی Android مراجعه کنید. همچنین حتماً تغییرات رفتار Android 9 را بررسی کنید تا با زمینه‌هایی که تغییرات پلاتفرم ممکن است بر برنامه‌هایتان تأثیر بگذارد آشنا شوید.

مکان‌یابی داخلی با Wi-Fi RTT

میاناهای برنامه‌سازی کاربردی جدید «نوشتار هم‌زمان» از مکان‌یابی در فضای بسته در برنامه‌هایتان پشتیبانی می‌کنند.

‫Android 9 پشتیبانی پلاتفرم از پروتکل Wi-Fi با استاندارد IEEE 802.11-2016 را اضافه می‌کند. این پروتکل که با نام زمان رفت‌وبرگشت Wi-Fi (RTT) نیز شناخته می‌شود، به شما امکان می‌دهد از موقعیت‌یابی داخلی در برنامه‌هایتان بهره ببرید.

در دستگاه‌هایی که از Android 9 با پشتیبانی سخت‌افزاری استفاده می‌کنند، برنامه‌هایتان می‌توانند از میاناهای برنامه‌سازی کاربردی RTT برای اندازه‌گیری فاصله تا نقاط دسترسی Wi-Fi نزدیک که از RTT پشتیبانی می‌کنند استفاده کنند. دستگاه باید خدمات مکان را فعال کرده باشد و اسکن Wi-Fi را روشن کرده باشد (در تنظیمات > مکان)، و برنامه شما باید ACCESS_FINE_LOCATION اجازه داشته باشد. برای استفاده از «نوشتار هم‌زمان»، دستگاه نیازی به اتصال به نقاط دسترسی ندارد. برای حفظ حریم خصوصی، فقط تلفن می‌تواند فاصله تا نقطه دسترسی را تعیین کند؛ نقطه‌های دسترسی این اطلاعات را ندارند.

اگر دستگاهتان فاصله تا ۳ نقطه دسترسی یا بیشتر را اندازه‌گیری کند، می‌توانید از الگوریتم چندضلعی برای تخمین موقعیت دستگاه که بهترین تناسب را با آن اندازه‌گیری‌ها دارد استفاده کنید. نتیجه معمولاً در محدوده ۱ تا ۲ متر دقیق است.

با این دقت، می‌توانید تجربه‌های جدیدی بسازید، مثل پیمایش درون ساختمان و خدمات مکان‌مبنای دقیق، مثل کنترل صوتی رفع ابهام (برای مثال، «این چراغ را روشن کن») و اطلاعات مکان‌مبنا (مثل «آیا برای این محصول پیشنهاد ویژه وجود دارد؟»).

میانای برنامه‌سازی کاربردی WiFi RTT را در برنامه نمایشی Android WifiRttScan درحال استفاده ببینید.

برای کسب اطلاعات بیشتر، مکان Wi-Fi: فاصله‌یابی با RTT را ببینید.

پشتیبانی از برش نمایشگر

صفحه «گزینه‌های توسعه‌دهندگان» که اندازه‌های برش مختلف را نشان می‌دهد

آزمایش برش نمایشگر بااستفاده از شبیه‌ساز

‫Android 9 از جدیدترین صفحه‌های نمایش لبه‌به‌لبه که دارای برش‌های نمایشگر برای دوربین‌ها و بلندگوها هستند پشتیبانی می‌کند. کلاس DisplayCutout به شما امکان می‌دهد مکان و شکل نواحی غیرعملکردی را که محتوا نباید در آن‌ها نمایش داده شود پیدا کنید. برای تعیین وجود و جای‌گیری این نواحی برش، از روش getDisplayCutout() استفاده کنید.

ویژگی جدید چیدمان پنجره، layoutInDisplayCutoutMode، به برنامه شما امکان می‌دهد محتوایش را در اطراف برش‌های دستگاه بچیند. می‌توانید این مشخصه را روی یکی از مقادیر زیر تنظیم کنید:

می‌توانید برش صفحه را در هر دستگاه یا شبیه‌سازی که Android 9 در آن اجرا می‌شود به‌صورت زیر شبیه‌سازی کنید:

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

اعلان‌ها

‫Android 9 چندین بهبود در اعلان‌ها ارائه می‌دهد که همه آن‌ها برای توسعه‌دهندگانی که سطح میانای برنامه‌سازی کاربردی ۲۸ و بالاتر را هدف‌یابی می‌کنند دردسترس است.

اعلان‌های پیام‌رسانی

MessagingStyle با عکس پیوست‌شده.

اعلان پیام‌رسانی

MessagingStyle با پاسخ‌ها و مکالمه.

برای کد نمونه‌ای که از اعلان‌ها، ازجمله ویژگی‌های Android 9، استفاده می‌کند، به نمونه افراد مراجعه کنید.

تجربه پیام‌رسانی بهبودیافته

از Android 7.0 (سطح API 24) می‌توانید اقدامی برای پاسخ دادن به پیام‌ها یا وارد کردن مستقیم نوشتار دیگر از اعلان اضافه کنید. ‫Android 9 این ویژگی را با بهبودهای زیر ارتقا می‌دهد:

  • پشتیبانی ساده‌شده برای شرکت‌کنندگان مکالمه: از Person کلاس برای شناسایی افراد درگیر در مکالمه، ازجمله تصویرهای نمایه و نشانی‌های وب آن‌ها استفاده می‌شود. بسیاری از میاناهای برنامه‌سازی کاربردی دیگر، مثل addMessage()، اکنون به‌جای CharSequence از کلاس Person استفاده می‌کنند. کلاس Person همچنین از الگوی طراحی «سازنده» پشتیبانی می‌کند.

  • پشتیبانی از تصاویر: Android 9 اکنون تصاویر را در «اعلان‌های پیام‌رسانی» در تلفن‌ها نمایش می‌دهد. می‌توانید از setData() در پیام برای نمایش تصویر استفاده کنید. تکه‌کد زیر نشان می‌دهد که چگونه Person و پیامی حاوی تصویر ایجاد کنید.

کاتلین

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

جاوا

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • ذخیره کردن پاسخ‌ها به‌عنوان پیش‌نویس: برنامه شما می‌تواند EXTRA_REMOTE_INPUT_DRAFT ارسال‌شده توسط سیستم را زمانی‌که کاربر به‌طور تصادفی اعلان پیام‌رسانی را می‌بندد بازیابی کند. می‌توانید از این مورد اضافی برای پیش‌پر کردن فیلدهای نوشتاری در برنامه استفاده کنید تا کاربران بتوانند پاسخشان را تکمیل کنند.

  • تشخیص اینکه مکالمه گروهی است یا نه: می‌توانید از setGroupConversation() برای شناسایی هدفمند مکالمه به‌عنوان مکالمه گروهی یا غیرگروهی استفاده کنید.

  • کنش معنایی را برای هدف تنظیم کنید: این setSemanticAction() روش به شما امکان می‌دهد به کنش‌ها معنای معنایی بدهید، مثل «علامت‌گذاری به‌عنوان خوانده‌شده»، «حذف»، «پاسخ»، و غیره.

  • «پاسخ هوشمند»: Android 9 از همان پاسخ‌های پیشنهادی موجود در برنامه پیام‌رسانی شما پشتیبانی می‌کند. از RemoteInput.setChoices() برای ارائه مجموعه‌ای از پاسخ‌های استاندارد به کاربر استفاده کنید.

تنظیمات کانال، همه‌فرستی‌ها، و «مزاحم نشوید»

‫Android 8.0 کانال‌های اعلان را معرفی کرد که به شما امکان می‌دهد برای هر نوع اعلانی که می‌خواهید نمایش داده شود، کانال قابل‌سفارشی‌سازی توسط کاربر ایجاد کنید. ‫Android 9 تنظیمات کانال اعلان را با این تغییرات ساده‌تر می‌کند:

  • مسدود کردن گروه‌های کانال: کاربران اکنون می‌توانند کل گروه‌های کانال را در تنظیمات اعلان یک برنامه مسدود کنند. می‌توانید از روش isBlocked() برای شناسایی زمان مسدود شدن یک گروه استفاده کنید و در نتیجه، هیچ اعلانی برای کانال‌های آن گروه ارسال نکنید.

    علاوه‌براین، برنامه شما می‌تواند بااستفاده از روش جدید getNotificationChannelGroup() تنظیمات گروه کانال فعلی را پُرسمان کند.

  • انواع هدف پخش جدید: سیستم Android اکنون وقتی وضعیت مسدود کردن کانال‌های اعلان و گروه‌های کانال تغییر می‌کند، هدف‌های پخش ارسال می‌کند. برنامه‌ای که مالک کانال یا گروه مسدودشده است می‌تواند به این هدف‌ها گوش دهد و متناسب با آن واکنش نشان دهد. برای اطلاعات بیشتر درباره این کنش‌های هدف و عناصر اضافی، به فهرست ثابت‌های به‌روزشده در NotificationManager مرجع مراجعه کنید. برای اطلاعات درباره واکنش به اهداف همه‌فرستی، به همه‌فرستی‌ها مراجعه کنید.

  • NotificationManager.Policy سه دسته اولویت «مزاحم نشوید» جدید دارد:

    • PRIORITY_CATEGORY_ALARMS زنگ‌های ساعت را در اولویت قرار می‌دهد.
    • PRIORITY_CATEGORY_MEDIA صداهای منابع رسانه‌ای، مثل رسانه و مسیریابی صوتی، را در اولویت قرار می‌دهد.
    • PRIORITY_CATEGORY_SYSTEM صداهای سیستم را در اولویت قرار می‌دهد.
  • ‫NotificationManager.Policy همچنین هفت ثابت جدید «مزاحم نشوید» دارد که می‌توانید از آن‌ها برای سرکوب کردن وقفه‌های دیداری استفاده کنید:

    • SUPPRESSED_EFFECT_FULL_SCREEN_INTENT از راه‌اندازی فعالیت تمام‌صفحه ازطریق اعلان جلوگیری می‌کند.
    • SUPPRESSED_EFFECT_LIGHTS چراغ اعلان را مسدود می‌کند.
    • SUPPRESSED_EFFECT_PEEK از نمایش مختصر اعلان‌ها در نمای اعلان («سرک کشیدن») جلوگیری می‌کند.
    • SUPPRESSED_EFFECT_STATUS_BAR مانع از نمایش اعلان‌ها در نوار وضعیت در دستگاه‌هایی می‌شود که از نوار وضعیت پشتیبانی می‌کنند.
    • SUPPRESSED_EFFECT_BADGE نشان‌های روی دستگاه‌هایی که از نشان پشتیبانی می‌کنند را مسدود می‌کند. برای اطلاعات بیشتر، به اصلاح نشان اعلان مراجعه کنید.
    • SUPPRESSED_EFFECT_AMBIENT اعلان‌ها را در دستگاه‌هایی که از نمایشگر محیطی پشتیبانی می‌کنند مسدود می‌کند.
    • SUPPRESSED_EFFECT_NOTIFICATION_LIST از نمایش اعلان‌ها در نمای فهرست در دستگاه‌هایی که از نمای فهرست پشتیبانی می‌کنند، مانند سایه اعلان یا صفحه قفل، جلوگیری می‌کند.

پشتیبانی از چند دوربین و به‌روزرسانی‌های دوربین

در دستگاه‌های دارای Android 9، می‌توانید به‌طور هم‌زمان از دو یا چند دوربین فیزیکی به جاری‌سازی‌ها دسترسی داشته باشید. در دستگاه‌هایی که دوربین جلو یا پشت دوگانه دارند، می‌توانید ویژگی‌های نوآورانه‌ای ایجاد کنید که با یک دوربین امکان‌پذیر نیست، مثل زوم یکپارچه، بوکه، و دید استریو. این API همچنین به شما امکان می‌دهد جریان دوربین منطقی یا ترکیبی را فراخوانی کنید که به‌طور خودکار بین دو یا چند دوربین جابه‌جا می‌شود.

بهبودهای دیگر در دوربین شامل پارامترهای جلسه اضافی است که به کاهش تأخیر درطول ضبط اولیه کمک می‌کند، و هم‌رسانی سطحی که به کاربران دوربین امکان می‌دهد بدون نیاز به توقف و شروع جاری‌سازی دوربین، از عهده موارد استفاده مختلف برآیند. همچنین «میاناهای برنامه‌سازی کاربردی» برای پشتیبانی از فلاش نمایشگرمحور و دسترسی به برچسب‌های زمان OIS برای پایدارسازی تصویر در سطح برنامه و جلوه‌های ویژه اضافه کرده‌ایم.

در Android 9، API چنددوربینی از دوربین‌های تک‌رنگ برای دستگاه‌های دارای قابلیت FULL یا LIMITED پشتیبانی می‌کند. برونداد تک‌رنگ ازطریق قالب YUV_420_888 با Y به‌عنوان خاکستری، U (Cb) به‌عنوان ۱۲۸، و V (Cr) به‌عنوان ۱۲۸ به‌دست می‌آید.

‫Android 9 همچنین پشتیبانی از دوربین‌های USB/UVC خارجی را در دستگاه‌های پشتیبانی‌شده فعال می‌کند.

‫ImageDecoder برای عناصر طراحی‌شدنی و بیت‌مپ‌ها

‫Android 9 کلاس ImageDecoder را معرفی می‌کند که رویکردی مدرن برای رمزگشایی تصاویر ارائه می‌دهد. به‌جای میاناهای برنامه‌سازی کاربردی BitmapFactory و BitmapFactory.Options از این کلاس استفاده کنید.

‫ImageDecoder به شما امکان می‌دهد Drawable یا Bitmap را از بافر بایت، فایل، یا نشانی وب ایجاد کنید. برای رمزگشایی تصویر، ابتدا createSource() را با منبع تصویر رمزگذاری‌شده فراخوانی کنید. سپس با ارسال شیء ImageDecoder.Source ، decodeDrawable() یا decodeBitmap() را فراخوانی کنید تا Drawable یا Bitmap ایجاد شود. برای تغییر تنظیمات پیش‌فرض، OnHeaderDecodedListener را به decodeDrawable() یا decodeBitmap() ارسال کنید. ImageDecoder تماس onHeaderDecoded() با پهنا و ارتفاع پیش‌فرض تصویر، پس‌از مشخص شدن آن‌ها. اگر تصویر کدبندی‌شده گیف پویانمایی‌شده یا WebP باشد، decodeDrawable() Drawable را برمی‌گرداند که نمونه‌ای از AnimatedImageDrawable کلاس است.

روش‌های مختلفی وجود دارد که می‌توانید برای تنظیم ویژگی‌های تصویر استفاده کنید:

  • برای مقیاس‌بندی تصویر رمزگشایی‌شده به اندازه دقیق، ابعاد هدف را به setTargetSize() منتقل کنید. همچنین می‌توانید تصاویر را بااستفاده از اندازه نمونه مقیاس‌بندی کنید. اندازه نمونه را مستقیماً به setTargetSampleSize() ارسال کنید.
  • برای برش دادن تصویر در محدوده تصویر مقیاس‌بندی‌شده، setCrop() را فراخوانی کنید.
  • برای ایجاد کردن بیت‌مپ تغییرپذیر، true را به setMutableRequired() ارسال کنید.

ImageDecoder همچنین به شما امکان می‌دهد جلوه‌های سفارشی و پیچیده به تصویر اضافه کنید، مثل گوشه‌های گرد یا نقاب‌های دایره‌ای. از setPostProcessor() با نمونه‌ای از PostProcessor کلاس برای اجرای هر فرمان طراحی که می‌خواهید استفاده کنید.

پویانمایی

‫Android 9 کلاس AnimatedImageDrawable را برای طراحی و نمایش تصاویر پویانمایی‌شده GIF و WebP معرفی می‌کند. AnimatedImageDrawable عملکردی مشابه AnimatedVectorDrawable دارد، به‌این‌صورت که رشته رندر پویانمایی‌های AnimatedImageDrawable را هدایت می‌کند. رشته رندر همچنین از یک رشته کارگر برای رمزگشایی استفاده می‌کند، به‌طوری‌که رمزگشایی با سایر عملیات در رشته رندر تداخل نمی‌کند. این پیاده‌سازی به برنامه شما امکان می‌دهد تصویر پویانمایی‌شده‌ای را بدون مدیریت به‌روزرسانی‌های آن یا تداخل با رویدادهای دیگر در رشته میانای کاربر برنامه‌تان نمایش دهد.

AnimatedImageDrawable را می‌توان بااستفاده از نمونه‌ای از ImageDecoder رمزگشایی کرد. تکه‌کد زیر نحوه استفاده از ImageDecoder برای رمزگشایی AnimatedImageDrawable را نشان می‌دهد:

کاتلین

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

جاوا

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

‫ImageDecoder چندین روش دارد که به شما امکان می‌دهد تصویر را بیشتر تغییر دهید. برای مثال، می‌توانید از روش setPostProcessor() برای اصلاح ظاهر تصویر، مثل اعمال ماسک دایره‌ای یا گوشه‌های گرد، استفاده کنید.

ویدیو HDR VP9، فشرده‌سازی تصویر HEIF، و «میاناهای برنامه‌سازی کاربردی رسانه»

‫Android 9 از «نمایه 2 VP9» با «دامنه پویای بالا» (HDR) پشتیبانی داخلی ارائه می‌دهد، بنابراین می‌توانید فیلم‌های دارای HDR را از YouTube،‏ Play Movies، و منابع دیگر در دستگاه‌های سازگار با HDR به کاربران خود ارائه دهید.

‫Android 9 همچنین از کدبندی تصاویر بااستفاده از قالب «فایل تصویری با کارایی بالا» (HEIF یا HEIC) پشتیبانی می‌کند که فشرده‌سازی را بهبود می‌بخشد و استفاده از فضای ذخیره‌سازی و داده‌های شبکه را کاهش می‌دهد. نمونه‌های تصویر ثابت HEIF در کلاس‌های MediaMuxer و MediaExtractor پشتیبانی می‌شوند. با پشتیبانی پلاتفرم در دستگاه‌های Android 9، ارسال و استفاده از تصاویر HEIF از سرور زیرین شما آسان است. پس‌از اینکه مطمئن شدید برنامه‌تان با این قالب داده برای هم‌رسانی و نمایش سازگار است، HEIF را به‌عنوان قالب ذخیره‌سازی تصویر در برنامه‌تان امتحان کنید. می‌توانید بااستفاده از ImageDecoder یا BitmapFactory (که یک بیت‌مپ از فایل JPEG دریافت می‌کند) تبدیل jpeg به heic را انجام دهید. سپس می‌توانید از HeifWriter برای نوشتن تصاویر ثابت HEIF از بافرهای بایت YUV یا نمونه‌های Surface یا Bitmap استفاده کنید.

سنجه‌های رسانه از کلاس‌های AudioTrack، AudioRecord، و MediaDrm نیز دردسترس هستند.

‫Android 9 روش‌هایی را به کلاس MediaDRM برای دریافت سنجه‌ها، سطوح HDCP، سطوح امنیتی، و تعداد جلسه‌ها، و برای افزودن کنترل بیشتر بر سطوح امنیتی و توقف‌های ایمن معرفی می‌کند. برای جزئیات، گزارش تفاوت میانای برنامه‌سازی کاربردی را ببینید.

در Android 9، میانای برنامه‌سازی کاربردی AAudio از چندین مشخصه AAudioStream دیگر، ازجمله کاربرد، نوع محتوا، و پیش‌تنظیم ورودی پشتیبانی می‌کند. بااستفاده از این مشخصه‌ها، می‌توانید جاری‌سازی‌هایی ایجاد کنید که برای برنامه‌های VoIP یا دوربین فیلمبرداری بهینه‌سازی شده‌اند. همچنین می‌توانید شناسه جلسه را تنظیم کنید تا جاری‌سازی AAudio را با زیرمیکسی که می‌تواند شامل جلوه‌ها باشد مرتبط کنید. از AudioEffect API برای کنترل جلوه‌ها استفاده کنید.

‫Android 9 AudioEffect API را برای پردازش دینامیک معرفی می‌کند. با این کلاس، می‌توانید جلوه‌های صوتی مبتنی بر کانال—ازجمله برابرسازی، فشرده‌سازی چندباندی، و محدودکننده—را در مراحل مختلف بسازید. تعداد باندها و مراحل فعال قابل پیکربندی است و اکثر پارامترها را می‌توان به‌صورت هم‌زمان کنترل کرد.

حساسیت هزینه داده در JobScheduler

از Android 9 به بعد، JobScheduler می‌تواند از نشان‌های وضعیت شبکه ارائه‌شده توسط شرکت‌های مخابراتی برای بهبود مدیریت کارهای مربوط به شبکه استفاده کند.

کارها می‌توانند اندازه داده تخمینی خود را اعلام کنند، پیش‌دریافت سیگنال انجام دهند، و الزامات دقیق شبکه را مشخص کنند. سپس JobScheduler کار را براساس وضعیت شبکه مدیریت می‌کند. برای مثال، وقتی شبکه نشان می‌دهد که شلوغ است، JobScheduler ممکن است درخواست‌های شبکه بزرگ را به‌تعویق بیندازد. وقتی در شبکه بدون محدودیت حجم هستید، JobScheduler می‌تواند کارهای پیش‌دریافت را برای بهبود تجربه کاربر اجرا کند، مثلاً با پیش‌دریافت کردن عنوان‌ها.

هنگام افزودن کار، درصورت لزوم از setEstimatedNetworkBytes()، setPrefetch()، و setRequiredNetwork() استفاده کنید تا به JobScheduler کمک کنید کار را به‌درستی انجام دهد. وقتی کارتان اجرا می‌شود، حتماً از شیء Network برگردانده‌شده توسط JobParameters.getNetwork() استفاده کنید. درغیراین‌صورت، به‌طور ضمنی از شبکه پیش‌فرض دستگاه استفاده خواهید کرد که ممکن است نیازهای شما را برآورده نکند و باعث مصرف ناخواسته داده شود.

میانای برنامه‌سازی کاربردی شبکه‌های عصبی ۱.۱

میانای برنامه‌سازی کاربردی شبکه‌های عصبی در Android 8.1 (سطح API 27) معرفی شد تا یادگیری ماشین درون‌دستگاهی در Android را تسریع کند. ‫Android 9 «میانای برنامه‌سازی کاربردی» را گسترش می‌دهد و بهبود می‌بخشد و از نه عملکرد جدید پشتیبانی می‌کند:

مشکل شناخته‌شده: هنگام انتقال ANEURALNETWORKS_TENSOR_QUANT8_ASYMM تنسورها به ANEURALNETWORKS_PAD عملیات، که در Android 9 و نسخه‌های بالاتر دردسترس است، برونداد NNAPI ممکن است با برونداد چارچوب‌های یادگیری ماشین سطح بالاتر، مثل TensorFlow Lite، مطابقت نداشته باشد. تا زمانی که مشکل حل شود، باید فقط ANEURALNETWORKS_TENSOR_FLOAT32 را ارسال کنید.

علاوه‌براین، این API تابع جدیدی نیز معرفی می‌کند، ANeuralNetworksModel_relaxComputationFloat32toFloat16()، که به شما امکان می‌دهد مشخص کنید آیا ANEURALNETWORKS_TENSOR_FLOAT32 با محدوده و دقتی به اندازه قالب IEEE 754 16-bit floating-point محاسبه شود یا نه.

چارچوب تکمیل خودکار

‫Android 9 چندین بهبود معرفی می‌کند که سرویس‌های تکمیل خودکار می‌توانند برای بهبود بیشتر تجربه کاربری هنگام تکمیل فرم‌ها پیاده‌سازی کنند. برای کسب اطلاعات بیشتر درباره نحوه استفاده از ویژگی‌های تکمیل خودکار در برنامه‌تان، راهنمای چارچوب تکمیل خودکار را ببینید.

بهبودهای امنیتی

‫Android 9 تعدادی ویژگی امنیتی معرفی می‌کند که در بخش‌های زیر خلاصه شده است:

تأیید محافظت‌شده Android

دستگاه‌های پشتیبانی‌شده که Android 9 یا بالاتر دارند به شما امکان می‌دهند از «تأییدیه محافظت‌شده Android» استفاده کنید. هنگام استفاده از این گردش کار، برنامه شما پیام‌واره‌ای به کاربر نمایش می‌دهد و از او می‌خواهد بیانیه کوتاهی را تأیید کند. این بیانیه به برنامه امکان می‌دهد تأیید کند که کاربر می‌خواهد تراکنش حساسی مثل پرداخت را تکمیل کند.

اگر کاربر بیانیه را بپذیرد، Android Keystore امضای رمزنگاری‌شده‌ای را که با کد اصالت‌سنجی پیام درهم‌سازی کلیددار (HMAC) محافظت می‌شود دریافت و ذخیره می‌کند. پس‌از اینکه Android Keystore معتبر بودن پیام را تأیید کرد، برنامه شما می‌تواند از کلید تولیدشده از trustedConfirmationRequired در محیط اجرای مطمئن (TEE) برای امضای پیامی که کاربر پذیرفته است استفاده کند. امضا با اطمینان بسیار بالا نشان می‌دهد که کاربر بیانیه را دیده است و با آن موافقت کرده است.

احتیاط: «تأییدیه محافظت‌شده Android» کانال اطلاعاتی امنی برای کاربر فراهم نمی‌کند. برنامه شما نمی‌تواند هیچ‌گونه تضمین محرمانگی فراتر از آنچه پلاتفرم Android ارائه می‌دهد را فرض کند. به‌طور خاص، از این گردش کار برای نمایش اطلاعات حساسی که معمولاً در دستگاه کاربر نشان نمی‌دهید استفاده نکنید.

برای راهنمایی درباره افزودن پشتیبانی از «تأییدیه محافظت‌شده Android»، به راهنمای تأییدیه محافظت‌شده Android مراجعه کنید.

کادر گفتگوی یکپارچه اصالت‌سنجی زیست‌سنجشی

در Android 9، سیستم ازطرف برنامه شما کادرهای گفتگوی اصالت‌سنجی زیست‌سنجشی ارائه می‌دهد. این قابلیت ظاهر، احساس، و جایگاه استانداردی برای کادر گفتگو ایجاد می‌کند و به کاربران اطمینان بیشتری می‌دهد که دربرابر یک بررسی‌کننده اطلاعات اعتباری زیست‌سنجشی مورداعتماد اصالت‌سنجی می‌کنند.

اگر برنامه‌تان از FingerprintManager برای نمایش کادر گفتگوی اصالت‌سنجی اثر انگشت به کاربران استفاده می‌کند، به‌جای آن از BiometricPrompt استفاده کنید. ‫BiometricPrompt برای نمایش دادن چارگوش گفتگوی اصالت‌سنجی به سیستم متکی است. همچنین رفتار خود را تغییر می‌دهد تا با نوع اصالت‌سنجی زیست‌سنجشی که کاربر انتخاب کرده است سازگار شود.

واحد امنیتی سخت‌افزار

دستگاه‌های پشتیبانی‌شده که Android 9 یا بالاتر در آن‌ها نصب شده است می‌توانند «کلید StrongBox KeyMint» (قبلاً Keymaster) داشته باشند، پیاده‌سازی «میان‌افزار KeyMint» (قبلاً Keymaster) که در واحد امنیتی سخت‌افزاری قرار دارد. این واحد شامل موارد زیر است:

  • CPU خودش.
  • فضای ذخیره‌سازی ایمن.
  • تولیدکننده اعداد تصادفی واقعی.
  • سازوکارهای اضافی برای مقاومت دربرابر دستکاری بسته و بارگیری غیرمجاز برنامه‌ها.

هنگام بررسی کلیدهای ذخیره‌شده در StrongBox KeyMint، سیستم تمامیت کلید را با «محیط اجرای امن» (TEE) تأیید می‌کند.

برای کسب اطلاعات بیشتر درباره استفاده از StrongBox KeyMint، به واحد امنیت سخت‌افزاری مراجعه کنید.

وارد کردن کلید امن در Keystore

‫Android 9 با افزودن امکان وارد کردن ایمن کلیدهای رمزگذاری‌شده به «انبار کلیدها» بااستفاده از قالب کلید کدبندی‌شده ASN.1، امنیت بیشتری برای رمزگشایی کلید فراهم می‌کند. سپس KeyMint کلیدهای موجود در Keystore را رمزگشایی می‌کند، بنابراین محتوای کلیدها هرگز به‌صورت متن ساده در حافظه میزبان دستگاه ظاهر نمی‌شود.

درباره نحوه وارد کردن کلیدهای رمزگذاری‌شده به‌صورت امن‌تر بیشتر بدانید.

طرح امضای APK با جایگزینی کلید

‫Android 9 از «طرح امضای APK نسخه ۳» پشتیبانی می‌کند. این طرح گزینه گنجاندن مدرک چرخش در بلوک امضای خود برای هر گواهینامه امضا را دارد. این قابلیت به برنامه شما امکان می‌دهد با پیوند دادن گواهینامه‌های امضای قبلی فایل APK به گواهینامه‌ای که اکنون با آن امضا شده است، با گواهینامه امضای جدیدی امضا شود.

درباره نحوه چرخاندن کلیدها بااستفاده از apksigner بیشتر بدانید.

گزینه مجاز کردن رمزگشایی کلید فقط در دستگاه‌های قفل‌نشده

‫Android 9 پرچم unlockedDeviceRequired را معرفی می‌کند. این گزینه تعیین می‌کند که آیا «انبار کلیدها» قبل‌از اجازه دادن به رمزگشایی هرگونه داده درحال انتقال یا ذخیره‌شده بااستفاده از کلید مشخص‌شده، نیاز به باز کردن قفل صفحه دارد یا نه. این نوع کلیدها برای رمزگذاری داده‌های حساس برای ذخیره در دیسک، مانند داده‌های بهداشتی یا سازمانی، بسیار مناسب هستند. این پرچم به کاربران اطمینان بیشتری می‌دهد که داده‌ها درحالی‌که دستگاه قفل است قابل رمزگشایی نیستند و درصورت گم شدن یا دزدیده شدن تلفن، داده‌ها ایمن می‌مانند.

برای اینکه کلید درحالی‌که دستگاه قفل است از رمزگشایی ایمن بماند، پرچم را با ارسال true به روش setUnlockedDeviceRequired() فعال کنید. پس‌از تکمیل این مرحله، وقتی صفحه کاربر قفل می‌شود، هرگونه تلاش برای رمزگشایی یا امضای داده بااستفاده از این کلید ناموفق خواهد بود. برای دسترسی به دستگاه قفل‌شده، باید پین، گذرواژه، اثر انگشت، یا عامل مطمئن دیگری وارد کنید.

پشتیبانی از رمزگذاری قدیمی

دستگاه‌های Android 9 که با Keymaster 4 عرضه می‌شوند از «الگوریتم رمزگذاری داده سه‌گانه» یا Triple DES پشتیبانی می‌کنند. اگر برنامه شما با سیستم‌های قدیمی که به Triple DES نیاز دارند تعامل‌پذیری دارد، هنگام رمزگذاری اطلاعات اعتباری حساس از این نوع رمز استفاده کنید.

برای کسب اطلاعات بیشتر درباره نحوه ایمن‌تر کردن برنامه‌تان، به امنیت برای توسعه‌دهندگان Android مراجعه کنید.

منسوخ شدن WPS

«راه‌اندازی حفاظت‌شده Wi-Fi» (WPS) به‌دلایل امنیتی منسوخ شده است.

نسخه‌های پشتیبان Android

‫Android 9 عملکرد جدید و گزینه‌های توسعه‌دهنده مرتبط با پشتیبان‌گیری و بازیابی را اضافه می‌کند. جزئیات این تغییرات در بخش‌های زیر آمده است.

پشتیبان‌گیری‌های رمزگذاری سمت کارخواه

‫Android 9 از رمزگذاری پشتیبان‌گیری‌های Android با رمز سمت کارخواه پشتیبانی می‌کند. این پشتیبانی به‌طور خودکار زمانی فعال می‌شود که شرایط زیر برقرار باشد:

وقتی این اقدام حریم خصوصی فعال باشد، برای بازیابی داده‌ها از پشتیبان‌گیری‌های انجام‌شده توسط دستگاه کاربر، پین، الگو، یا گذرواژه دستگاه لازم است. برای کسب اطلاعات بیشتر درباره فناوری پشت این ویژگی، به مقاله سفید خدمات Google Cloud Key Vault مراجعه کنید.

شرایط دستگاه موردنیاز برای پشتیبان‌گیری را تعریف کنید

اگر داده‌های برنامه‌تان شامل اطلاعات حساس یا اولویت‌ها باشد، Android 9 به شما امکان می‌دهد شرایط دستگاه را که تحت آن داده‌های برنامه‌تان در نسخه پشتیبان کاربر گنجانده می‌شود تعریف کنید، برای مثال، زمانی که رمزگذاری سمت مشتری فعال است یا انتقال محلی دستگاه به دستگاه درحال انجام است.

برای کسب اطلاعات بیشتر درباره پشتیبان‌گیری از داده‌ها در دستگاه‌های Android، به نمای کلی پشتیبان‌گیری داده‌ها مراجعه کنید.

دسترس‌پذیری

‫Android 9 بهبودهایی در چارچوب دسترس‌پذیری ارائه می‌دهد که ارائه تجربه‌های بهتر به کاربران برنامه شما را آسان‌تر می‌کند.

معناشناسی ناوبری

ویژگی‌های اضافه‌شده در Android 9 تعریف نحوه پیمایش خدمات دسترس‌پذیری، به‌ویژه صفحه‌خوان‌ها، از بخشی از صفحه به بخش دیگر را برای شما آسان‌تر می‌کند. این مشخصه‌ها می‌توانند به کاربرانی که اختلالات بینایی دارند کمک کنند به‌سرعت در نوشتار «میانای کاربر» برنامه‌تان حرکت کنند و به آن‌ها امکان دهند انتخاب کنند.

برای مثال، در برنامه خرید، صفحه‌خوان می‌تواند به کاربران کمک کند مستقیماً از یک دسته معامله به دسته بعدی پیمایش کنند، بدون اینکه صفحه‌خوان قبل‌از رفتن به دسته بعدی مجبور باشد همه موارد موجود در یک دسته را بخواند.

عنوان‌های قاب دسترس‌پذیری

در Android 8.1 (میانای برنامه‌سازی کاربردی سطح ۲۷) و پایین‌تر، خدمات دسترس‌پذیری همیشه نمی‌توانند تشخیص دهند که چه زمانی بخش خاصی از صفحه‌نمایش به‌روز شده است، مثلاً وقتی فعالیتی یک تکه را با تکه دیگری جایگزین می‌کند. بخش‌ها شامل عناصر رابط کاربری گروه‌بندی‌شده منطقی و مرتبط دیداری هستند که معمولاً یک تکه را تشکیل می‌دهند.

در Android 9، می‌توانید عنوان‌های پانل دسترس‌پذیری یا عنوان‌های قابل‌شناسایی به‌صورت جداگانه برای این پانل‌ها ارائه دهید. اگر پانلی عنوان پانل دسترس‌پذیری داشته باشد، خدمات دسترس‌پذیری هنگام تغییر پانل اطلاعات دقیق‌تری دریافت می‌کنند. این قابلیت به سرویس‌ها امکان می‌دهد اطلاعات دقیق‌تری درباره آنچه در میانای کاربر تغییر کرده است به کاربر ارائه دهند.

برای مشخص کردن عنوان قاب، از android:accessibilityPaneTitle مشخصه استفاده کنید. همچنین می‌توانید عنوان قاب واسط کاربر را که در زمان اجرا جایگزین می‌شود بااستفاده از setAccessibilityPaneTitle() به‌روز کنید. برای مثال، می‌توانید برای ناحیه محتوای یک Fragment شیء عنوان ارائه دهید.

پیمایش براساس عنوان

اگر برنامه شما محتوای نوشتاری‌ای را نمایش می‌دهد که شامل عنوان‌های منطقی است، android:accessibilityHeading ویژگی را برای نمونه‌های View که نشان‌دهنده آن عنوان‌ها است روی true تنظیم کنید. با افزودن این سرصفحه‌ها، به خدمات دسترس‌پذیری اجازه می‌دهید به کاربران کمک کنند مستقیماً از یک سرصفحه به سرصفحه بعدی پیمایش کنند. هر سرویس دسترس‌پذیری می‌تواند از این قابلیت برای بهبود تجربه پیمایش رابط کاربری کاربران استفاده کند.

ناوبری و برونداد گروه

صفحه‌خوان‌ها به‌طور سنتی از android:focusable ویژگی برای تعیین زمان خواندن ViewGroup یا مجموعه‌ای از View اشیا به‌عنوان یک واحد استفاده می‌کنند. به این ترتیب، کاربران می‌توانند بفهمند که بازدیدها ازنظر منطقی با یکدیگر مرتبط هستند.

در Android 8.1 و نسخه‌های قدیمی‌تر، باید هر هدف View را در ViewGroup به‌عنوان غیرقابل‌تمرکز علامت‌گذاری کنید و خود ViewGroup را به‌عنوان قابل‌تمرکز علامت‌گذاری کنید. این ترتیب باعث شد برخی‌از نمونه‌های View به‌گونه‌ای به‌عنوان قابل‌تمرکز علامت‌گذاری شوند که پیمایش با صفحه‌کلید را دشوارتر می‌کرد.

از Android 9 به بعد، می‌توانید از مشخصه android:screenReaderFocusable به‌جای مشخصه android:focusable در شرایطی استفاده کنید که تمرکزپذیر کردن شیء View پیامدهای نامطلوبی داشته باشد. «صفحه‌خوان‌ها» کانون را روی همه عناصری که android:screenReaderFocusable یا android:focusable روی true تنظیم شده است قرار می‌دهند.

کنش‌های تسهیلات

‫Android 9 از انجام اقدامات تسهیل‌کننده ازطرف کاربران پشتیبانی می‌کند:

تعامل با ابزارهای راهنمایی
ویژگی‌های اضافه‌شده در چارچوب دسترس‌پذیری به شما امکان می‌دهد به راهنمای ابزار در میانای کاربری برنامه دسترسی داشته باشید. از getTooltipText() برای خواندن نوشتار نکته‌ابزار و از ACTION_SHOW_TOOLTIP و ACTION_HIDE_TOOLTIP برای دستور دادن به نمونه‌های View برای نمایش یا پنهان کردن نکته‌ابزار استفاده کنید.
کنش‌های عمومی اضافه شد
‫Android 9 از دو کنش دستگاه اضافی در کلاس AccessibilityService پشتیبانی می‌کند. سرویس شما می‌تواند به کاربران کمک کند دستگاه‌هایشان را قفل کنند و بااستفاده از کنش‌های GLOBAL_ACTION_LOCK_SCREEN و GLOBAL_ACTION_TAKE_SCREENSHOT به‌ترتیب نماگرفت بگیرند.

جزئیات تغییر پنجره

‫Android 9 ردیابی به‌روزرسانی‌های پنجره برنامه را وقتی برنامه چندین پنجره را به‌طور هم‌زمان بازطراحی می‌کند آسان‌تر می‌کند. وقتی TYPE_WINDOWS_CHANGED رویدادی رخ می‌دهد، از getWindowChanges() API برای تعیین نحوه تغییر پنجره‌ها استفاده کنید. درطول به‌روزرسانی چند پنجره‌ای، هر پنجره مجموعه رویدادهای خود را تولید می‌کند. getSource() روش نمای ریشه پنجره مرتبط با هر رویداد را برمی‌گرداند.

اگر برنامه‌ای برای اشیای View خود عنوان‌های صفحه دسترس‌پذیری تعریف کرده باشد، سرویس شما می‌تواند وقتی «میانای کاربری» برنامه به‌روزرسانی می‌شود آن را تشخیص دهد. وقتی رویدادی TYPE_WINDOW_STATE_CHANGED رخ می‌دهد، از انواع برگشت‌داده‌شده توسط getContentChangeTypes() برای تعیین نحوه تغییر پنجره استفاده کنید. برای مثال، چارچوب می‌تواند وقتی پانلی عنوان جدیدی دارد یا وقتی پانلی ناپدید شده است تشخیص دهد.

چرخش

برای حذف چرخش‌های ناخواسته، حالت جدیدی اضافه کرده‌ایم که جهت فعلی را حتی اگر موقعیت دستگاه تغییر کند ثابت می‌کند. کاربران می‌توانند چرخش را درصورت نیاز با فشار دادن دکمه‌ای در نوار سیستم به‌صورت دستی راه‌اندازی کنند.

در اکثر موارد، تأثیرات سازگاری برای برنامه‌ها حداقل است. بااین‌حال، اگر برنامه شما رفتار چرخش سفارشی‌شده‌ای داشته باشد یا از تنظیمات غیرمعمول گرایش صفحه استفاده کند، ممکن است با مشکلاتی مواجه شوید که قبلاً متوجه آن‌ها نشده‌اید، زیرا اولویت چرخش کاربر همیشه روی حالت عمودی تنظیم می‌شد. به شما توصیه می‌کنیم که رفتار چرخش را در همه فعالیت‌های کلیدی برنامه‌تان بررسی کنید و مطمئن شوید که همه تنظیمات جهت صفحه‌نمایش شما همچنان تجربه بهینه را ارائه می‌دهند.

برای جزئیات بیشتر، تغییرات رفتار مرتبط را ببینید.

تلفن همراهی درحال چرخش که حالت چرخش جدید را نشان می‌دهد و به کاربران امکان می‌دهد چرخش را به‌صورت دستی راه‌اندازی کنند

حالت چرخش جدید به کاربران امکان می‌دهد درصورت نیاز بااستفاده از دکمه‌ای در نوار سیستم، چرخش را به‌صورت دستی راه‌اندازی کنند.

نوشتار

‫Android 9 ویژگی‌های مرتبط با نوشتار زیر را به پلاتفرم می‌آورد:

  • نوشتار پیش‌محاسبه‌شده: کلاس PrecomputedText با فعال کردن امکان محاسبه و ذخیره کردن اطلاعات موردنیاز ازقبل، عملکرد پرداز کردن نوشتار را بهبود می‌بخشد. همچنین به برنامه شما امکان می‌دهد چیدمان نوشتار را خارج از رشته اصلی انجام دهد.

  • «بزرگ‌نما»: کلاس Magnifier ابزاره پلاتفرمی است که API بزرگ‌نمایی ارائه می‌دهد و امکان تجربه ویژگی بزرگ‌نمایی یکپارچه را در همه برنامه‌ها فراهم می‌کند.

  • پیونددهی هوشمند: Android 9 کلاس TextClassifier را بهبود می‌بخشد، که از یادگیری ماشین برای شناسایی برخی‌از نهادها در نوشتار انتخاب‌شده و پیشنهاد کنش‌ها استفاده می‌کند. برای مثال، TextClassifier می‌تواند برنامه شما را قادر سازد تشخیص دهد که کاربر شماره تلفنی را انتخاب کرده است. برنامه شما می‌تواند به کاربر پیشنهاد دهد که بااستفاده از آن شماره تماس تلفنی برقرار کند. ویژگی‌های TextClassifier جایگزین عملکرد کلاس Linkify می‌شود.

  • چیدمان نوشتار: چندین روش و مشخصه راحت پیاده‌سازی طراحی واسط کاربر را آسان‌تر می‌کند. برای جزئیات، مستندات مرجع TextView را ببینید.

تبدیل پیش‌ازموقع ART فایل‌های DEX

در دستگاه‌های دارای Android 9 یا بالاتر، زمان اجرای Android (ART) بااستفاده از کامپایلر پیش‌اززمان، فایل‌های فشرده «قالب اجرایی Dalvik» (DEX) را با تبدیل فایل‌های DEX در بسته برنامه به نمایش فشرده‌تر بهینه‌سازی می‌کند. این تغییر به برنامه شما امکان می‌دهد سریع‌تر شروع شود و فضای دیسک و RAM کمتری مصرف کند.

این بهبود به‌ویژه برای دستگاه‌های پایین‌رده با سرعت‌های ورودی/خروجی دیسک کندتر مفید است.

ردیابی سیستم درون‌دستگاهی

‫Android 9 به شما امکان می‌دهد ردپاهای سیستم را از دستگاهتان ضبط کنید، سپس گزارشی از این ضبط‌ها را با تیم توسعه‌تان هم‌رسانی کنید. این گزارش از قالب‌های مختلف، ازجمله HTML، پشتیبانی می‌کند.

با جمع‌آوری این ردپاها، می‌توانید داده‌های زمان‌بندی مربوط به فرایندها و رشته‌های برنامه‌تان را ضبط کنید و انواع دیگر وضعیت‌های دستگاه را که در سطح جهانی اهمیت دارند مشاهده کنید.

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