Nowości o produktach

Trzecia wersja beta Androida 17

5 min czytania
Matthew McCullough
Wiceprezes ds. zarządzania produktami, deweloper Androida

Android 17 dziś oficjalnie osiągnął stabilność platformy dzięki wersji beta 3. Oznacza to, że powierzchnia interfejsu API jest zablokowana. Możesz przeprowadzić ostateczne testy zgodności i przesłać do Sklepu Play aplikacje kierowane na Androida 17. Ponadto wersja beta 3 wprowadza wiele nowych funkcji, które pomogą Ci tworzyć lepsze, bezpieczniejsze i bardziej zintegrowane aplikacje.

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

Jeśli tworzysz pakiet SDK, bibliotekę, narzędzie lub silnik gier, tym ważniejsze jest, aby przygotować teraz wszystkie niezbędne aktualizacje. Dzięki temu deweloperzy aplikacji i gier nie będą blokowani przez problemy ze zgodnością i będą mogli korzystać z najnowszych funkcji pakietu SDK. Poinformuj deweloperów, że do pełnej obsługi Androida 17 wymagane są aktualizacje.

large_Android17Timeline01.png

Testowanie polega na zainstalowaniu w Google Play lub w inny sposób aplikacji produkcyjnej albo testowej korzystającej z Twojej biblioteki lub silnika na urządzeniu lub emulatorze z Androidem 17 w wersji beta 3. Sprawdź wszystkie ścieżki w aplikacji i poszukaj problemów z funkcjonalnością lub interfejsem. Aby skupić się na testowaniu, zapoznaj się ze zmianami w zachowaniu. Każda wersja Androida zawiera zmiany platformy, które zwiększają 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ć:

  • Zmiana rozmiaru na dużych ekranach: gdy zaczniesz kierować aplikację na Androida 17, nie będziesz już mieć możliwości rezygnacji z zachowania orientacji, zmiany rozmiaru i ograniczeń proporcji na dużych ekranach.
  • Dynamiczne wczytywanie kodu: jeśli Twoja aplikacja jest kierowana na Androida 17 lub nowszego, 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: przejrzystość certyfikatów (CT) jest domyślnie włączona. (W Androidzie 16 funkcja CT jest dostępna, ale aplikacje musiały ją włączyć).
  • Ochrona sieci lokalnej: aplikacje kierowane na Androida 17 lub nowszego mają domyślnie zablokowany dostęp do sieci lokalnej. Jeśli to możliwe, przejdź na selektory chroniące prywatność i użyj 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. Dzięki nowemu interfejsowi PhotoPickerUiCustomizationParams API możesz zmienić proporcje widoku siatki ze standardowego kwadratu 1:1 na wyświetlacz pionowy 9:16. Ta elastyczność obejmuje zarówno intencję ACTION_PICK_IMAGES, jak i wbudowany selektor zdjęć, co pozwala zachować spójny wygląd, gdy użytkownicy wchodzą w interakcję z multimediami.

large_(Default)11aspectratio.png

To wszystko jest częścią naszych działań, które mają na celu zapewnienie, że selektor zdjęć na Androidzie chroniący prywatność będzie bezproblemowo pasował do Twojej aplikacji. Dowiedz się więcej o tym, jak możesz osadzić selektor zdjęć bezpośrednio w aplikacji, aby zapewnić 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 – de facto standardu branżowego w przypadku zaawansowanej fotografii cyfrowej – za pomocą nowej stałej ImageFormat.RAW14. RAW14 to format jednokanałowy, 14-bitowy na piksel, który wykorzystuje gęsto upakowany układ, w którym każde 4 kolejne piksele są upakowane w 7 bajtach.

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) API.

Interfejsy API typu urządzenia z aparatem: nowe interfejsy API Androida 17 umożliwiają wysyłanie zapytań o typ urządzenia, aby sprawdzić, czy aparat jest wbudowany, czy jest to zewnętrzna kamera internetowa USB, czy też aparat wirtualny.

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 dodaniu stałej AudioDeviceInfo.TYPE_BLE_HEARING_AID Twoja 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 odtwarzane są 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.

Rozszerzony koder oprogramowania 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 API, 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 blokad wybudzania dzięki obsłudze słuchaczy alarmów allow-while-idle

Android 17 wprowadza nowy wariant AlarmManager.setExactAndAllowWhileIdle, który akceptuje OnAlarmListener zamiast PendingIntent. Ten nowy mechanizm oparty na wywołaniach zwrotnych jest idealny w przypadku aplikacji, które obecnie polegają na ciągłych blokadach wybudzania w celu wykonywania okresowych zadań, takich jak aplikacje do przesyłania wiadomości utrzymujące połączenia gniazd.

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 dostarczany przez system

localcafe.jpg

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

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

Ta funkcja dzieli dotychczasowe ustawienie systemowe „Pokaż hasła” na 2 odrębne preferencje użytkownika: jedną dla danych wejściowych dotykowych, a drugą dla danych wejściowych z klawiatury fizycznej. Znaki wpisywane za pomocą klawiatury fizycznej są teraz domyślnie natychmiast ukrywane.

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

Bezpieczeństwo

Wymuszone wczytywanie kodu dynamicznego tylko do odczytu

Aby zwiększyć bezpieczeństwo przed atakami polegającymi na wstrzykiwaniu kodu, Android wymaga 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 plików APK za pomocą kryptografii postkwantowej (PQC)

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

Wygoda użytkowania 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 wyświetlaczach 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 umożliwia ukrywanie nazw aplikacji (etykiet) w obszarze roboczym na ekranie głównym. Upewnij się, że ikona aplikacji jest wyraźna i rozpoznawalna.

Interaktywny obraz w obrazie na komputerze

W przeciwieństwie do tradycyjnego trybu obraz w obrazie te przypięte okna pozostają interaktywne, a jednocześnie zawsze znajdują się na wierzchu innych okien 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 do nagrywania ekranu

large_Recording-redesign.png

Główna funkcjonalność

Ustawienia wykluczania aplikacji z sieci VPN

Za pomocą nowej intencji ACTION_VPN_APP_EXCLUSION_SETTINGS Twoja aplikacja może uruchomić ekran ustawień 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 OpenJDK 25 i 21 API

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żyć 64-bitowych obrazów systemu w Android Emulator.

  • Skompiluj aplikację za pomocą nowego pakietu SDK i zgłoś problemy na stronie opinii.
  • Przetestuj bieżącą aplikację pod kątem zgodności i sprawdź, czy zmiany w Androidzie 17 mają na nią wpływ.

Więcej informacji znajdziesz na stronie dla deweloperów Androida 17.

Autor:

Czytaj dalej