Wiadomości o usługach

Trzecia wersja beta Androida 17

Czas czytania: 5 minut
Matthew McCullough
Vice President, Product Management, Android Developer

Android 17 osiągnął dziś oficjalnie stabilność platformy w wersji beta 3. Oznacza to, że interfejs API jest zablokowany. Możesz przeprowadzić ostateczne testy zgodności i przesłać do Sklepu Play aplikacje przeznaczone na Androida 17. Wersja beta 3 zawiera też wiele nowych funkcji, które pomogą Ci tworzyć lepsze, bezpieczniejsze i bardziej zintegrowane aplikacje.

Przygotuj aplikacje, biblioteki, narzędzia i silniki gier.

Jeśli tworzysz pakiet SDK, bibliotekę, narzędzie lub silnik gry, tym bardziej ważne jest, aby przygotować teraz wszelkie niezbędne aktualizacje. Dzięki temu deweloperzy aplikacji i gier nie będą mieli problemów ze zgodnością i będą mogli korzystać z najnowszych funkcji pakietu SDK. Poinformuj deweloperów, którzy korzystają z Twoich usług, czy konieczne są aktualizacje, aby w pełni obsługiwać Androida 17.

large_Android17Timeline01.png

Testowanie polega na zainstalowaniu aplikacji produkcyjnej lub testowej korzystającej z biblioteki lub silnika za pomocą Google Play lub w inny sposób na urządzeniu lub emulatorze z Androidem 17 Beta 3. Sprawdź wszystkie ścieżki w aplikacji i poszukaj problemów z funkcjonalnością lub interfejsem. Sprawdź zmiany w zachowaniu, aby skupić się na testowaniu. Każda wersja Androida zawiera zmiany na platformie, które poprawiają prywatność, bezpieczeństwo i ogólną wygodę użytkowników. Te zmiany mogą mieć wpływ na Twoje aplikacje. Oto kilka zmian, na których warto się skupić:

  • Możliwość zmiany rozmiaru na dużych ekranach: gdy zaczniesz kierować aplikację na Androida 17, nie będziesz już mieć możliwości wycofania się z utrzymywania ograniczeń dotyczących orientacji, możliwości zmiany rozmiaru i formatu obrazu na dużych ekranach.
  • Dynamiczne wczytywanie kodu: jeśli Twoja aplikacja jest kierowana na Androida 17 lub nowszego, bezpieczniejsza ochrona przed dynamicznym wczytywaniem kodu (DCL) wprowadzona w Androidzie 14 w przypadku plików DEX i JAR obejmuje teraz biblioteki natywne. Wszystkie pliki natywne wczytywane za pomocą funkcji System.load() muszą być oznaczone jako tylko do odczytu. W przeciwnym razie system zgłosi błąd UnsatisfiedLinkError.
  • Domyślne włączanie CT: protokół Certificate Transparency (CT) jest domyślnie włączony. (Na Androidzie 16 funkcja CT jest dostępna, ale aplikacje musiały wyrazić na nią zgodę).
  • Ochrona sieci lokalnej: aplikacje kierowane na Androida 17 lub nowszego mają domyślnie zablokowany dostęp do sieci lokalnej. W miarę możliwości przełącz się na selektory chroniące prywatność i używaj nowego uprawnienia ACCESS_LOCAL_NETWORK, aby uzyskać szeroki i trwały dostęp.

Ulepszenia multimediów i aparatu

Opcje dostosowywania selektora zdjęć

Android umożliwia teraz dostosowanie wyglądu selektora zdjęć, aby lepiej pasował do interfejsu aplikacji. Korzystając z nowego interfejsu PhotoPickerUiCustomizationParams API, możesz zmienić współczynnik proporcji widoku siatki ze standardowego kwadratu 1:1 na pionowy wyświetlacz 9:16. Ta elastyczność dotyczy zarówno intencji ACTION_PICK_IMAGES, jak i wbudowanego selektora zdjęć, co pozwala zachować spójną estetykę, gdy użytkownicy wchodzą w interakcję z multimediami.

large_(Default)11aspectratio.png

To wszystko robimy, aby selektor zdjęć na Androidzie, który chroni prywatność, idealnie pasował do Twojej aplikacji. Dowiedz się więcej o tym, jak zintegrować selektor zdjęć bezpośrednio z aplikacją, aby zapewnić użytkownikom jak najlepsze wrażenia

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)

Obsługa formatu obrazu RAW14: Android 17 wprowadza obsługę formatu obrazu RAW14 – faktycznego standardu branżowego w przypadku zaawansowanej fotografii cyfrowej – za pomocą nowej stałej ImageFormat.RAW14. RAW14 to 14-bitowy format jednokanałowy, w którym na 7 bajtach zapisywane są 4 kolejne piksele.

Rozszerzenia aparatu zdefiniowane przez dostawcę: Android 17 dodaje rozszerzenia zdefiniowane przez dostawcę, aby umożliwić partnerom sprzętowym definiowanie i wdrażanie niestandardowych trybów rozszerzeń aparatu. Dzięki temu możesz korzystać z najlepszych i najnowszych funkcji aparatu, takich jak „Super Resolution” czy najnowocześniejsze ulepszenia oparte na AI. Możesz wysyłać zapytania o te tryby za pomocą interfejsu isExtensionSupported(int).

Interfejsy API typu urządzenia z kamerą: nowe interfejsy API Androida 17 umożliwiają sprawdzanie typu urządzenia, aby określić, czy kamera jest wbudowanym sprzętem, zewnętrzną kamerą internetową USB czy kamerą wirtualną.

Obsługa aparatów słuchowych Bluetooth LE Audio

Android zawiera teraz specjalną kategorię urządzeń dla aparatów słuchowych Bluetooth Low Energy (BLE) Audio. Dzięki stałej AudioDeviceInfo.TYPE_BLE_HEARING_AID aplikacja może teraz odróżniać aparaty słuchowe od zwykłych zestawów słuchawkowych.

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 }

Szczegółowe kierowanie dźwięku do aparatów słuchowych

Android 17 umożliwia użytkownikom niezależne zarządzanie tym, gdzie mają być odtwarzane określone dźwięki systemowe. Mogą oni kierować powiadomienia, dzwonki i alarmy do podłączonych aparatów słuchowych lub wbudowanego głośnika urządzenia.

Oprogramowanie do kodowania Extended HE-AAC

Android 17 wprowadza dostarczany przez system rozszerzony koder oprogramowania HE-AAC. Ten koder obsługuje zarówno niskie, jak i wysokie szybkości transmisji bitów przy użyciu ujednoliconego kodowania mowy i dźwięku. Dostęp do tego kodera można uzyskać za pomocą interfejsu MediaCodec, używając nazwy c2.android.xheaac.encoder lub wysyłając zapytanie o typ 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)

Ulepszenia wydajności i baterii

Ograniczanie wybudzeń dzięki obsłudze odbiorników dla alarmów typu „allow-while-idle”

Android 17 wprowadza nowy wariant metody AlarmManager.setExactAndAllowWhileIdle, który zamiast PendingIntent akceptuje OnAlarmListener. Ten nowy mechanizm oparty na wywołaniach zwrotnych jest idealny dla aplikacji, które obecnie polegają na ciągłych wybudzeniach, aby wykonywać okresowe zadania, takie jak aplikacje do obsługi wiadomości utrzymujące połączenia gniazdowe.

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

Aktualizacje dotyczące prywatności

Przycisk lokalizacji udostępniany przez system

localcafe.jpg

Android wprowadza przycisk lokalizacji renderowany przez system, który możesz osadzić bezpośrednio w układzie aplikacji za pomocą biblioteki Android Jetpack. Gdy użytkownik kliknie ten przycisk systemowy, Twoja aplikacja uzyska dostęp do dokładnej lokalizacji tylko w bieżącej sesji. Aby to zrobić, musisz zadeklarować uprawnienie USE_LOCATION_BUTTON.

Oddzielne ustawienia widoczności hasła dla klawiatur dotykowych i fizycznych

Ta funkcja dzieli istniejące ustawienie systemowe „Pokaż hasła” na 2 osobne preferencje użytkownika: jedną dla wprowadzania danych za pomocą dotyku, a drugą dla wprowadzania danych za pomocą klawiatury fizycznej (sprzętowej). Znaki wpisywane za pomocą klawiatur fizycznych są teraz domyślnie od razu ukrywane.

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

Bezpieczeństwo

Wymuszone dynamiczne wczytywanie kodu tylko do odczytu

Aby zwiększyć bezpieczeństwo i ochronę przed atakami polegającymi na wstrzykiwaniu kodu, Android wymusza teraz, aby dynamicznie wczytywane biblioteki natywne były tylko do odczytu. Jeśli Twoja aplikacja jest kierowana na Androida 17 lub nowszego, wszystkie pliki natywne wczytywane za pomocą funkcji System.load() muszą być wcześniej oznaczone jako tylko do odczytu.

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)

Hybrydowe podpisywanie pakietów APK za pomocą kryptografii postkwantowej

Aby przygotować się na przyszłe postępy w dziedzinie komputerów kwantowych, Android wprowadza obsługę kryptografii postkwantowej (PQC) w ramach nowego schematu podpisywania plików APK w wersji 3.2. Ten schemat wykorzystuje podejście hybrydowe, łącząc klasyczny podpis z podpisem ML-DSA.

Wrażenia użytkowników i interfejs systemu

Lepsza obsługa widżetów na wyświetlaczach zewnętrznych

Ta funkcja poprawia spójność wizualną widżetów aplikacji, gdy są one wyświetlane na podłączonych lub zewnętrznych ekranach o różnej gęstości pikseli przy użyciu jednostek DP lub 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
)

Ukryte etykiety aplikacji na ekranie głównym

Hiddenapplabelsonthehomescreen.png

Android udostępnia teraz ustawienie użytkownika, które pozwala ukryć nazwy aplikacji (etykiety) w obszarze roboczym ekranu głównego. Upewnij się, że ikona aplikacji jest charakterystyczna i łatwo rozpoznawalna.

Interaktywny obraz w obrazie na komputerze

W przeciwieństwie do tradycyjnego trybu obraz w obrazie przypięte okna pozostają interaktywne i zawsze wyświetlają się nad innymi oknami aplikacji w trybie pulpitu.

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) {}
}
)

Przeprojektowany pasek narzędzi nagrywania ekranu

large_Recording-redesign.png

Główna funkcja

Ustawienia wykluczeń aplikacji VPN

Korzystając z nowego intencji ACTION_VPN_APP_EXCLUSION_SETTINGS, aplikacja może uruchomić ekran Ustawienia zarządzany przez system, na którym użytkownicy mogą wybrać aplikacje, które mają pomijać tunel VPN.

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

Aktualizacje interfejsu API OpenJDK 25 i 21

Ta aktualizacja wprowadza wiele funkcji i ulepszeń z OpenJDK 21 i OpenJDK 25, w tym najnowszą obsługę Unicode i ulepszoną obsługę SSL dla nazwanych grup w TLS.

Pierwsze kroki z Androidem 17

Możesz zarejestrować dowolne obsługiwane urządzenie Pixel lub używać 64-bitowych obrazów systemu w emulatorze Androida.

  • Skompiluj aplikację z użyciem nowego pakietu SDK i zgłoś problemy na stronie z opiniami.
  • Sprawdź, czy Twoja obecna aplikacja jest zgodna z Androidem 17 i czy zmiany w tym systemie mają na nią wpływ.

Pełne informacje znajdziesz na stronie dla deweloperów Androida 17.

Autor:

Czytaj dalej