اخبار محصول

سومین نسخه بتای Android 17

‫۵ دقیقه خواندن
مشاهده نمایه Matthew McCullough
Matthew McCullough معاون رئیس، مدیریت محصول، توسعه‌دهنده نرم‌افزار Android

Android 17 امروز با نسخه بتا ۳ رسماً به پایداری پلاتفرم رسید. این یعنی سطح API قفل شده است؛ می‌توانید آزمایش سازگاری نهایی را انجام دهید و برنامه‌های هدف Android 17 را به «فروشگاه Play» ارسال کنید. علاوه‌براین، نسخه Beta 3 قابلیت‌های جدیدی را ارائه می‌دهد تا به شما کمک کند برنامه‌های بهتر، ایمن‌تر، و بسیار یکپارچه‌تری بسازید.

برنامه‌ها، کتابخانه‌ها، ابزارها، و موتورهای بازی‌تان را آماده کنید!

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

large_Android17Timeline01.png

آزمایش شامل نصب برنامه تولیدی یا برنامه آزمایشی شما بااستفاده از کتابخانه یا موتور شما بااستفاده از Google Play یا روش‌های دیگر در دستگاه یا شبیه‌ساز دارای Android 17 Beta 3 است. همه جریان‌های برنامه‌تان را بررسی کنید و به‌دنبال مشکلات عملکردی یا میانای کاربر بگردید. تغییرات رفتاری را مرور کنید تا آزمایش‌هایتان را متمرکز کنید. هر نسخه پخش Android حاوی تغییراتی در پلاتفرم است که حریم خصوصی، امنیت، و تجربه کلی کاربر را بهبود می‌بخشد و این تغییرات می‌تواند بر برنامه‌هایتان تأثیر بگذارد. در اینجا برخی‌از تغییراتی که باید روی آن‌ها تمرکز کنید آورده شده است:

  • قابلیت تغییر اندازه در صفحه‌نمایش‌های بزرگ: وقتی Android 17 را هدف قرار دهید، دیگر نمی‌توانید از حفظ محدودیت‌های جهت، قابلیت تغییر اندازه، و نسبت ابعادی در صفحه‌نمایش‌های بزرگ انصراف دهید.
  • بار کردن کد پویا: اگر برنامه شما Android 17 یا بالاتر را هدف‌یابی می‌کند، محافظت «بار کردن کد پویای ایمن‌تر» (DCL) که در Android 14 برای فایل‌های DEX و JAR معرفی شد، اکنون به کتابخانه‌های بومی گسترش یافته است. همه فایل‌های بومی بارشده بااستفاده از System.load() باید به‌عنوان فقط خواندنی علامت‌گذاری شوند. درغیراین‌صورت، سیستم UnsatisfiedLinkError را برمی‌گرداند.
  • فعال کردن CT به‌طور پیش‌فرض: شفافیت گواهینامه (CT) به‌طور پیش‌فرض فعال است. (در Android 16،‏ CT دردسترس است اما برنامه‌ها باید آن را فعال کنند.)
  • محافظت‌های شبکه محلی: برنامه‌هایی که Android 17 یا بالاتر را هدف قرار می‌دهند، به‌طور پیش‌فرض دسترسی به شبکه محلی را مسدود می‌کنند. درصورت امکان، به استفاده از انتخابگرهای حافظ حریم خصوصی بروید و از ACCESS_LOCAL_NETWORK جدید برای دسترسی گسترده و دائمی استفاده کنید.

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

گزینه‌های سفارشی‌سازی «انتخاب‌گر عکس»

اکنون Android به شما امکان می‌دهد ارائه دیداری انتخاب‌گر عکس را سفارشی‌سازی کنید تا میانای کاربر برنامه‌تان را بهتر تکمیل کند. بااستفاده از میانای برنامه‌سازی کاربردی جدید PhotoPickerUiCustomizationParams، می‌توانید نسبت ابعادی نمای جدولی را از مربع استاندارد ۱:۱ به نمایش عمودی ۹:۱۶ تغییر دهید. این انعطاف‌پذیری هم به قصد ACTION_PICK_IMAGES و هم به انتخاب‌گر عکس جاسازی‌شده گسترش می‌یابد و به شما امکان می‌دهد هنگام تعامل کاربران با رسانه، زیبایی منسجمی را حفظ کنید.

large_(Default)11aspectratio.png

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

val params = PhotoPickerUiCustomizationParams.Builder()
.setAspectRatio(PhotoPickerUiCustomizationParams.ASPECT_RATIO_PORTRAIT_9_16)
.build()
val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
putExtra(MediaStore.EXTRA_PICK_IMAGES_UI_CUSTOMIZATION_PARAMS, params)
}
startActivityForResult(intent, REQUEST_CODE)

پشتیبانی از قالب تصویر RAW14: Android 17 پشتیبانی از قالب تصویر RAW14 را (که استاندارد صنعتی واقعی برای عکاسی دیجیتال پیشرفته است) ازطریق ثابت جدید ImageFormat.RAW14 معرفی می‌کند. ‫RAW14 یک قالب تک‌کاناله با ۱۴ بیت در هر پیکسل است که از چیدمان متراکم استفاده می‌کند، به‌طوری‌که هر چهار پیکسل متوالی در هفت بایت بسته‌بندی می‌شوند.

افزونه‌های دوربین تعریف‌شده توسط فروشنده: Android 17 افزونه‌های تعریف‌شده توسط فروشنده را اضافه می‌کند تا شرکای سخت‌افزاری بتوانند حالت‌های افزونه دوربین سفارشی را تعریف و پیاده‌سازی کنند و به شما امکان دهند به بهترین و جدیدترین ویژگی‌های دوربین، مانند «وضوح فوق‌العاده» یا بهبودهای پیشرفته مبتنی بر هوش مصنوعی، دسترسی داشته باشید. می‌توانید این حالت‌ها را بااستفاده از میانای برنامه‌سازی کاربردی isExtensionSupported(int)‎ جستجو کنید.

میاناهای برنامه‌سازی کاربردی نوع دستگاه دوربین: میاناهای برنامه‌سازی کاربردی جدید Android 17 به شما امکان می‌دهد نوع دستگاه اصلی را جستجو کنید تا تشخیص دهید دوربین سخت‌افزار داخلی است، وب‌بین USB خارجی است، یا دوربین مجازی است.

پشتیبانی از سمعک «صدای بلوتوث کم‌مصرف»

Android اکنون شامل یک دسته دستگاه خاص برای سمعک‌های «صدای بلوتوث کم‌مصرف» (BLE) است. با افزودن ثابت AudioDeviceInfo.TYPE_BLE_HEARING_AID، برنامه‌تان اکنون می‌تواند سمعک‌ها را از هدست‌های معمولی تشخیص دهد.

val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
val isHearingAidConnected = devices.any { it.type == AudioDeviceInfo.TYPE_BLE_HEARING_AID }

مسیریابی صوتی دانه‌ای برای سمعک‌ها

Android 17 به کاربران اجازه می‌دهد به‌طور مستقل مدیریت کنند که صداهای خاص سیستم کجا پخش شود. آن‌ها می‌توانند انتخاب کنند که اعلان‌ها، آهنگ‌های زنگ، و هشدارها به سمعک‌های متصل‌شده یا بلندگوی داخلی دستگاه هدایت شوند.

کدبند نرم‌افزاری HE-AAC گسترش‌یافته

Android 17 یک کدبند نرم‌افزاری Extended HE-AAC ارائه‌شده توسط سیستم را معرفی می‌کند. این کدبند از نرخ بیت‌های پایین و بالا بااستفاده از کدبندی گفتار و صدای یکپارچه پشتیبانی می‌کند. می‌توانید ازطریق MediaCodec API بااستفاده از نام c2.android.xheaac.encoder یا با پُرسمان برای نوع MIME audio/mp4a-latm به این کدبند دسترسی پیدا کنید.

val encoder = MediaCodec.createByCodecName("c2.android.xheaac.encoder")
val format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 48000, 1)
format.setInteger(MediaFormat.KEY_BIT_RATE, 24000)
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectXHE)
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)

بهبود عملکرد و باتری

کاهش قفل‌های بیدارباش با پشتیبانی شنونده برای هشدارهای «مجاز درحالت بیکار»

‫Android 17 نوع جدیدی از AlarmManager.setExactAndAllowWhileIdle را معرفی می‌کند که به‌جای PendingIntent، یک OnAlarmListener را می‌پذیرد. این سازوکار جدید مبتنی بر فراخوانی برگشتی برای برنامه‌هایی ایده‌آل است که درحال‌حاضر برای انجام کارهای دوره‌ای به قفل‌های بیداری مداوم متکی هستند، مانند برنامه‌های پیام‌رسانی که اتصال‌های سوکت را حفظ می‌کنند.

val alarmManager = getSystemService(AlarmManager::class.java)
val listener = AlarmManager.OnAlarmListener {
// Do work here
}
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 60000,
listener,
null
)

به‌روزرسانی‌های حریم خصوصی

دکمه مکان ارائه‌شده توسط سیستم

localcafe.jpg

‫Android درحال معرفی دکمه مکان با ارائه سیستم است که می‌توانید آن را بااستفاده از کتابخانه Android Jetpack مستقیماً در چیدمان برنامه‌تان جاسازی کنید. وقتی کاربر روی این دکمه سیستم تک‌ضرب می‌زند، برنامه شما فقط برای جلسه فعلی به مکان دقیق دسترسی پیدا می‌کند. برای پیاده‌سازی این مورد، باید اجازه USE_LOCATION_BUTTON را اعلام کنید.

تنظیمات رؤیت‌پذیری گذرواژه مجزا برای صفحه‌کلیدهای لمسی و فیزیکی

این ویژگی تنظیمات سیستم «نمایش گذرواژه‌ها» را به دو اولویت کاربری مجزا تقسیم می‌کند: یکی برای ورودی‌های لمسی و دیگری برای ورودی‌های صفحه‌کلید فیزیکی (سخت‌افزاری). نویسه‌هایی که ازطریق صفحه‌کلید فیزیکی وارد می‌شوند اکنون به‌طور پیش‌فرض بلافاصله پنهان می‌شوند.

val isPhysical = event.source and InputDevice.SOURCE_KEYBOARD == InputDevice.SOURCE_KEYBOARD
val shouldShow = android.text.ShowSecretsSetting.shouldShowPassword(context, isPhysical)

امنیت

بار کردن کد پویای فقط خواندنی اجباری شد

برای بهبود امنیت دربرابر حملات تزریق کد، Android اکنون الزام می‌کند که کتابخانه‌های بومی بارشده به‌صورت پویا باید فقط خواندنی باشند. اگر برنامه شما Android 17 یا بالاتر را هدف قرار می‌دهد، همه فایل‌های بومی بارشده بااستفاده از System.load() باید ازقبل به‌عنوان فقط خواندنی علامت‌گذاری شوند.

val libraryFile = File(context.filesDir, "my_native_lib.so")
// Mark the file as read-only before loading to comply with Android 17+ security requirements
libraryFile.setReadOnly()
System.load(libraryFile.absolutePath)

امضای ترکیبی APK رمزنگاری پساکوانتومی (PQC)

برای آماده شدن برای پیشرفت‌های آینده در محاسبات کوانتومی، Android پشتیبانی از «رمزنگاری پساکوانتومی» (PQC) را ازطریق «طرح امضای APK» جدید نسخه ۳.۲ معرفی می‌کند. این طرح از رویکردی ترکیبی استفاده می‌کند که امضای کلاسیک را با امضای ML-DSA ترکیب می‌کند.

تجربه کاربری و واسط کاربر سیستم

پشتیبانی بهتر از ابزارک‌ها در نمایشگرهای خارجی

این ویژگی بااستفاده از واحدهای DP یا SP، سازگاری بصری ابزاره‌های برنامه را هنگام نمایش در نمایشگرهای متصل یا خارجی با تراکم پیکسل متفاوت بهبود می‌بخشد.

val options = appWidgetManager.getAppWidgetOptions(appWidgetId)
val displayId = options.getInt(AppWidgetManager.OPTION_APPWIDGET_DISPLAY_ID)
val remoteViews = RemoteViews(context.packageName, R.layout.widget_layout)
remoteViews.setViewPadding(
R.id.container,
16f, 8f, 16f, 8f,
TypedValue.COMPLEX_UNIT_DIP
)

برچسب‌های برنامه پنهان در صفحه اصلی

Hiddenapplabelsonthehomescreen.png

اکنون Android تنظیماتی را برای کاربر ارائه می‌دهد تا نام (برچسب) برنامه‌ها را در فضای کاری صفحه اصلی پنهان کند. مطمئن شوید نماد برنامه‌تان متمایز و قابل‌تشخیص باشد.

تصویردرتصویر تعاملی رایانه

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

val appTask: ActivityManager.AppTask = activity.getSystemService(ActivityManager::class.java).appTasks[0]
appTask.requestWindowingLayer(
ActivityManager.AppTask.WINDOWING_LAYER_PINNED,
context.mainExecutor,
object : OutcomeReceiver<Int, Exception> {
override fun onResult(result: Int) {
if (result == ActivityManager.AppTask.WINDOWING_LAYER_REQUEST_GRANTED) {
// Task successfully moved to pinned layer
}
}
override fun onError(error: Exception) {}
}
)

نوارابزار ضبط صفحه‌نمایش بازطراحی‌شده

large_Recording-redesign.png

عملکرد اصلی

تنظیمات مستثنی کردن برنامه وی‌پی‌ان

بااستفاده از Intent جدید ACTION_VPN_APP_EXCLUSION_SETTINGS، برنامه شما می‌تواند صفحه «تنظیمات» تحت مدیریت سیستم را راه‌اندازی کند که در آن کاربران می‌توانند برنامه‌هایی را برای دور زدن تونل VPN انتخاب کنند.

val intent = Intent(Settings.ACTION_VPN_APP_EXCLUSION_SETTINGS)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}

به‌روزرسانی‌های میانای برنامه‌سازی کاربردی OpenJDK 25 و 21

این به‌روزرسانی ویژگی‌ها و اصلاحات گسترده‌ای را از OpenJDK 21 و OpenJDK 25 به‌همراه دارد، ازجمله جدیدترین پشتیبانی از Unicode و پشتیبانی بهبودیافته از SSL برای گروه‌های نام‌گذاری‌شده در TLS.

شروع به کار با Android 17

می‌توانید هر دستگاه Pixel پشتیبانی‌شده‌ای را ثبت‌نام کنید یا از تصاویر سیستم ۶۴ بیتی با «شبیه‌ساز Android» استفاده کنید.

  • با کیت توسعه نرم‌افزار جدید کامپایل کنید و مشکلات را در صفحه بازخورد گزارش کنید.
  • برنامه فعلی‌تان را ازنظر سازگاری آزمایش کنید و ببینید آیا برنامه‌تان تحت‌تأثیر تغییرات Android 17 قرار می‌گیرد یا نه.

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

نویسنده:
ادامه خواندن