Oprócz nowych funkcji i możliwości Android 6.0 (poziom interfejsu API 23) oferuje różne zmian systemu i działania interfejsu API. Omówienie tego dokumentu kluczowe zmiany, które należy zrozumieć i uwzględnić w swoich aplikacjach.
Jeśli masz już opublikowaną aplikację na Androida, pamiętaj, że te zmiany w na Twoją aplikację.
Uprawnienia czasu działania
W tej wersji wprowadziliśmy nowy model uprawnień, w którym użytkownicy mogą teraz bezpośrednio zarządzać i uprawnienia aplikacji w czasie działania. Ten model zapewnia użytkownikom większą widoczność i kontrolę uprawnień, przy jednoczesnym usprawnieniu procesu instalacji i automatycznych aktualizacji dla deweloperów aplikacji. Użytkownicy mogą przyznawać i odbierać uprawnienia pojedynczo zainstalowanym aplikacjom.
W aplikacjach kierowanych na Androida 6.0 (poziom interfejsu API 23) lub nowszego sprawdź, czy i żądanie
uprawnień w czasie działania aplikacji. Aby sprawdzić, czy aplikacja otrzymała te uprawnienia, wywołaj metodę
nowy checkSelfPermission()
. Aby poprosić o uprawnienia, wywołaj nowe
requestPermissions()
. Nawet jeśli Twoja aplikacja nie jest kierowana na Androida 6.0 (poziom interfejsu API 23), przetestuj ją pod
do nowego modelu uprawnień.
Szczegółowe informacje na temat obsługi nowego modelu uprawnień w aplikacji znajdziesz w Praca z uprawnieniami systemu Aby dowiedzieć się, jak ocenić wpływ na aplikację, zobacz Uwagi o korzystaniu z uprawnień.
Uśpienie i tryb czuwania aplikacji
W tej wersji wprowadziliśmy nowe optymalizacje pozwalające oszczędzać energię w przypadku nieaktywnych urządzeń i aplikacji. Te wpłyną na wszystkie aplikacje, więc pamiętaj o przetestowaniu aplikacji w nowych trybach.
- Uśpienie: jeśli użytkownik odłączy urządzenie, pozostawi je bez ruchu i ma wyłączony ekran. na pewien czas urządzenie przechodzi w tryb uśpienia, w którym próbuje utrzymać działanie systemu. w stanie uśpienia. W tym trybie urządzenia okresowo wznawiają normalne działanie przez krótki czas by umożliwić synchronizację aplikacji i wykonanie oczekujących operacji.
- Czuwanie aplikacji: umożliwia systemowi wykrycie, że aplikacja jest bezczynna. gdy użytkownik jej nie używa. System określa to, czy użytkownik nie dotknij aplikacji przez określony czas. Jeśli urządzenie jest odłączone, system wyłącza sieć uzyskuje dostęp do synchronizacji i zadań aplikacji uznanych za nieaktywne, a także zawiesza synchronizacje i zadania.
Więcej informacji o tych zmianach oszczędzających energię znajdziesz w artykule Optymalizacja pod kątem funkcji Uśpienie i Czuwanie aplikacji
Usunięcie klienta HTTP Apache
W Androidzie 6.0 usunięto obsługę klienta HTTP Apache. Jeśli Twoja aplikacja używa tego klienta i
jest kierowana na Androida 2.3 (poziom interfejsu API 9) lub nowszego, użyj klasy HttpURLConnection
. Ten interfejs API jest wydajniejszy, ponieważ zmniejsza wykorzystanie sieci przez przezroczystą kompresję
i buforowanie odpowiedzi, a także minimalizuje zużycie energii. Aby nadal korzystać z interfejsów Apache HTTP API,
musi najpierw zadeklarować w pliku build.gradle
tę zależność czasu kompilowania:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android odchodzi od OpenSSL na rzecz
BoringSSL
bibliotece. Jeśli w swojej aplikacji używasz pakietu Android NDK, nie twórz powiązania z bibliotekami kryptograficznymi
które nie są częścią interfejsu NDK API, na przykład libcrypto.so
i libssl.so
. Te
biblioteki nie są publicznymi interfejsami API i mogą ulec zmianie lub awarii bez powiadomienia w różnych wersjach i urządzeniach.
Dodatkowo możesz narazić się na luki w zabezpieczeniach. Zamiast tego zmodyfikuj
natywny kod do wywoływania interfejsów API kryptografii Java przez JNI lub do statycznego powiązania
do biblioteki kryptograficznej.
Dostęp do identyfikatora sprzętu
Aby zapewnić użytkownikom lepszą ochronę danych, od tej wersji Androida
usuwa automatyczny dostęp do lokalnego identyfikatora sprzętowego urządzenia w
przez interfejsy API Wi-Fi i Bluetooth.
WifiInfo.getMacAddress()
oraz
BluetoothAdapter.getAddress()
metod
zwracają teraz stałą wartość 02:00:00:00:00:00
.
Aby uzyskać dostęp do identyfikatorów sprzętowych urządzeń zewnętrznych w pobliżu podczas skanowania przez Bluetooth i Wi-Fi:
aplikacja musi teraz mieć ACCESS_FINE_LOCATION
lub
Uprawnienia (ACCESS_COARSE_LOCATION
):
Uwaga: gdy urządzenie z Androidem 6.0 (poziom interfejsu API 23) inicjuje skanowania przez Wi-Fi lub Bluetooth w tle, operacja jest widoczna dla urządzeń zewnętrznych jako pochodzących z randomizowanego adresu MAC.
Powiadomienia
W tej wersji usunięto metodę Notification.setLatestEventInfo()
. Użyj
Notification.Builder
do tworzenia powiadomień. Aby zaktualizować
powiadomienie, użyj ponownie instancji Notification.Builder
. Wywołaj funkcję
Metoda build()
, która pozwala uzyskać
zaktualizował(a) Notification
instancję.
Polecenie adb shell dumpsys notification
nie wyświetla już tekstu powiadomienia.
Zamiast tego użyj polecenia adb shell dumpsys notification --noredact
, aby wydrukować tekst
w obiekcie powiadomienia.
Zmiany w usłudze AudioManager
Ustawianie głośności bezpośrednio lub wyciszanie konkretnych strumieni na urządzeniu AudioManager
klasa nie jest już obsługiwana. Metoda setStreamSolo()
została wycofana i należy wywołać metodę
requestAudioFocus()
. Podobnie
Metoda setStreamMute()
jest
wycofane; Wywołaj metodę adjustStreamVolume()
i przekaż wartość kierunku
ADJUST_MUTE
lub
ADJUST_UNMUTE
Zaznaczenie tekstu
Gdy użytkownicy zaznaczają tekst w Twojej aplikacji, możesz teraz wyświetlać działania związane z zaznaczeniem tekstu, takie jak Wytnij, Kopiuj i Wklej w pływający pasek narzędzi. Implementacja interakcji użytkownika jest podobna dla paska działań kontekstowych, jak opisano w Włączając tryb działań kontekstowych w poszczególnych widokach.
Aby zaimplementować pływający pasek narzędzi do zaznaczania tekstu, wprowadź następujące zmiany w istniejącym Aplikacje:
- W obiekcie
View
lubActivity
zmień:ActionMode
połączeń odstartActionMode(Callback)
dostartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - Przedłuż obecną implementację
ActionMode.Callback
i ją wydłużActionMode.Callback2
. - Zastąp
onGetContentRect()
metoda podawania współrzędnych obiektuRect
treści np. prostokąta zaznaczenia tekstu. - Jeśli pozycja prostokąta jest już nieważna i jest to jedyny element do unieważnienia,
wywoływać metodę
invalidateContentRect()
.
Jeśli korzystasz z
Biblioteka pomocy Androida (wersja 22.2). Pamiętaj, że pływające paski narzędzi nie są
zgodne wstecznie, a kompatybilność aplikacji przejmuje kontrolę nad obiektami ActionMode
przez
wartość domyślną. Zapobiega to wyświetlaniu pływających pasków narzędzi. Aby włączyć
ActionMode
– pomoc w
AppCompatActivity
, zadzwoń
getDelegate()
, a potem zadzwoń
setHandleNativeActionModesEnabled()
po zwróceniu
AppCompatDelegate
obiekt i ustaw dane wejściowe
na false
. To wywołanie zwraca kontrolę obiektów ActionMode
do
do tworzenia zasad Google. Na urządzeniach z Androidem 6.0 (poziom interfejsu API 23) platformy obsługują
ActionBar
lub pływającego paska narzędzi na uruchomionych urządzeniach.
Androida 5.1 (poziom interfejsu API 22) lub starszych wersji, dostępne są tylko tryby ActionBar
.
obsługiwane.
Zmiany zakładek w przeglądarce
W tej wersji wycofaliśmy obsługę zakładek globalnych.
android.provider.Browser.getAllBookmarks()
i android.provider.Browser.saveBookmark()
są teraz usuwane. Podobnie READ_HISTORY_BOOKMARKS
i WRITE_HISTORY_BOOKMARKS
uprawnienia te zostaną usunięte. Jeśli Twoja aplikacja jest kierowana na Androida 6.0 (poziom interfejsu API 23) lub nowszego, nie otwieraj
od dostawcy globalnego lub skorzystać z uprawnień do zakładek. Zamiast tego aplikacja powinna przechowywać
danych zakładek wewnętrznie.
Zmiany w magazynie kluczy Androida
W tej wersji funkcja Dostawca magazynu kluczy Androida nie jest już obsługiwany DSA. Metoda ECDSA jest nadal obsługiwana.
Klucze, które nie wymagają szyfrowania w spoczynku, nie będą już usuwane po włączeniu bezpiecznego ekranu blokady zostało wyłączone lub zresetowane (np. przez użytkownika lub administratora urządzenia). Klucze, które wymagają podczas tych zdarzeń szyfrowanie w spoczynku zostanie usunięte.
Zmiany sieci Wi-Fi i sieci
W tej wersji wprowadziliśmy następujące zmiany w działaniu interfejsów API do obsługi sieci Wi-Fi i sieciowych.
- Twoje aplikacje mogą teraz zmieniać stan tylko obiektów
WifiConfiguration
jeśli te obiekty zostały utworzone przez Ciebie. Nie możesz modyfikować ani usuwaćWifiConfiguration
obiektów utworzonych przez użytkownika lub inne aplikacje. -
Wcześniej, jeśli aplikacja wymuszała na urządzeniu połączenie z określoną siecią Wi-Fi przez
enableNetwork()
zdisableAllOthers=true
, urządzenie zostało odłączone od innych sieci, takich jak komórkowej transmisji danych. W tej wersji urządzenie nie rozłącza się z innymi sieciami. JeślitargetSdkVersion
Twojej aplikacji ma wartość“20”
lub mniej, jest przypięta do wybranych Sieć Wi-Fi. JeślitargetSdkVersion
w Twojej aplikacji ma wartość“21”
lub wyższą, użyj interfejsów API obejmujących wiele sieci (takich jakopenConnection()
,bindSocket()
oraz nowabindProcessToNetwork()
), aby mieć pewność, że ruch z jej sieci będzie wysyłany do wybranej sieci.
Zmiany w usłudze aparatu
W tej wersji zmieniono model dostępu do udostępnionych zasobów w usłudze kamery z poprzedniego modelu dostępu „kto pierwszy, ten lepszy”, do modelu dostępu, w którym te procesy są faworyzowane. Zmiany w działaniu usługi obejmują:
- Dostęp do zasobów podsystemu kamery, w tym do otwierania i konfigurowania kamery przyznanych na podstawie „priorytetu” procesu aplikacji klienta. Proces aplikacji za pomocą aktywnościom widocznym dla użytkownika lub aktywności na pierwszym planie zazwyczaj nadają się wyższy priorytet, dzięki czemu zasób kamery pozyskiwania klientów i bardziej niezawodne.
- Aktywne klienty aparatu dla aplikacji o niższym priorytecie mogą zostać „usunięte”, jeśli mają wyższy priorytet
aplikacja próbuje użyć kamery. W wycofanym interfejsie API
Camera
: daje toonError()
jako nawołując do usunięcia klienta. W interfejsie APICamera2
skutkuje to wynikiemonDisconnected()
w sprawie wykluczonego klienta. - W urządzeniach z odpowiednim sprzętem do obsługi aplikacji oddzielne procesy aplikacji niezależnie od siebie, a potem używać w tym samym czasie osobnych aparatów. Stosowanie wielu procesów przypadków, w których równoczesny dostęp powoduje znaczne pogorszenie wydajności lub możliwości wszystkie otwarte urządzenia z aparatem są teraz wykrywane i blokowane przez usługę kamery. Ta zmiana może prowadzić do „usunięć” w przypadku klientów o niższym priorytecie, nawet jeśli żadna inna aplikacja nie jest bezpośrednio próbując uzyskać dostęp do tego samego aparatu.
- Zmiana bieżącego użytkownika powoduje, że aktywne klienty aparatu w aplikacjach należących do poprzedniego konta użytkownika do usunięcia. Dostęp do aparatu jest ograniczony do profili, które należą do obecnego użytkownika urządzenia. W praktyce oznacza to, że na przykład konto „Gość” nie może pozostać uruchomione. procesów korzystających z podsystemu aparatu, gdy użytkownik przełączy się na inne konto.
Czas trwania
Środowisko wykonawcze ART prawidłowo implementuje reguły dostępu dla
Metoda newInstance()
. Ten
rozwiązano problem, który powodował, że Dalvik nieprawidłowo sprawdzał reguły dostępu w poprzednich wersjach.
Jeśli Twoja aplikacja używa
Metoda newInstance()
a Ty
chcesz zastąpić kontrolę dostępu, wywołaj metodę
Metoda setAccessible()
z danymi wejściowymi
ustawiono na true
. Jeśli Twoja aplikacja używa
biblioteki appcompat w wersji 7 lub
biblioteka Recyclerview w wersji 7,
musisz zaktualizować aplikację, aby
używała tych bibliotek do najnowszych wersji. W przeciwnym razie upewnij się,
wszystkie klasy niestandardowe, do których odwołuje się plik XML, są aktualizowane tak, aby ich konstruktory klas były dostępne.
W tej wersji poprawiliśmy działanie dynamicznego tagu łączącego. Dynamiczny tag linków rozpoznaje teraz
różnica między elementem soname
biblioteki a jego ścieżką
(
błąd publiczny 6670), a wyszukiwanie według soname
jest teraz
. Działające wcześniej aplikacje z błędnymi wpisami w języku: DT_NEEDED
(zwykle ścieżki bezwzględne w systemie plików maszyny kompilacji) mogą powodować błąd podczas wczytywania.
Flaga dlopen(3) RTLD_LOCAL
jest teraz prawidłowo zaimplementowana. Pamiętaj, że
Domyślna wartość to RTLD_LOCAL
, więc połączenia z numerem dlopen(3)
, które nie zostały użyte bezpośrednio
Ta zmiana będzie miała wpływ na usługę RTLD_LOCAL
(chyba że Twoja aplikacja wyraźnie używała RTLD_GLOBAL
). Na
RTLD_LOCAL
, symbole nie będą dostępne w bibliotekach wczytywanych przez późniejsze wywołania
dlopen(3)
(w przeciwieństwie do wpisów DT_NEEDED
).
w poprzednich wersjach Androida, jeśli aplikacja zażądała wczytania biblioteki udostępnionej
relokacje tekstu, system wyświetlił ostrzeżenie, ale wciąż zezwalał na wczytanie biblioteki.
Od tej wersji system będzie odrzucać tę bibliotekę, jeśli docelowy pakiet SDK Twojej aplikacji to 23
lub wyższą. Aby ułatwić wykrywanie, czy nie udało się wczytać biblioteki, aplikacja powinna rejestrować
dlopen(3)
– podaj opis problemu podany w dlerror(3)
. Więcej informacji o obsłudze relokacji tekstu znajdziesz tutaj
.
Weryfikacja plików APK
Platforma przeprowadza teraz bardziej rygorystyczną weryfikację plików APK. Plik APK jest uznawany za uszkodzony, jeśli zadeklarowane w pliku manifestu, ale nie ma go w samym pliku APK. Plik APK musi zostać ponownie podpisany, jeśli któryś z zostaną usunięte.
Połączenie USB
Połączenia urządzenia przez port USB są teraz domyślnie ustawione w trybie tylko do ładowania. Aby uzyskać dostęp z urządzenia i jego zawartości za pośrednictwem połączenia USB, użytkownicy muszą wyraźnie udzielić zgody na takie interakcje. Jeśli Twoja aplikacja obsługuje interakcje użytkowników z urządzeniem przez port USB, weź pod uwagę że interakcja musi być wyraźnie włączona.
Zmiany w Android for Work
W tej wersji wprowadziliśmy te zmiany w działaniu Android for Work:
- Kontakty służbowe w kontekście osobistym. Telefon Google
Rejestr połączeń wyświetla teraz kontakty służbowe, gdy użytkownik przegląda wcześniejsze połączenia.
Ustawienie
setCrossProfileCallerIdDisabled()
natrue
ukrywa kontakty z profilu służbowego w rejestrze połączeń Telefonu Google. Kontaktami służbowymi mogą być wyświetlane wraz z kontaktami osobistymi na urządzeniach przez Bluetooth tylko wtedy, ustawsetBluetoothContactSharingDisabled()
nafalse
. Domyślnie ustawiona jest wartośćtrue
. - Usunięcie konfiguracji Wi-Fi: konfiguracje Wi-Fi dodane przez właściciela profilu
(na przykład przez wywołania funkcji
addNetwork()
) są teraz usuwane po usunięciu tego profilu służbowego. - blokada konfiguracji Wi-Fi: każda konfiguracja Wi-Fi utworzona przez
Użytkownik nie może już zmienić ani usunąć aktywnego właściciela urządzenia, jeśli:
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
ma wartość różną od zera. Użytkownik nadal może tworzyć i modyfikować własne konfiguracje Wi-Fi. Aktywne urządzenie Właściciele mogą edytować lub usuwać dowolne konfiguracje Wi-Fi, w tym które nie zostały utworzone przez nich. - Pobierz kontroler zasad urządzeń przez dodanie konta Google: gdy konto, które wymaga zarządzania za pomocą aplikacji kontrolera zasad urządzeń (DPC), zostało dodane do urządzenia poza kontekstem zarządzanym, proces dodawania konta zachęca teraz użytkownika do zainstalowania odpowiednim WPC. To zachowanie dotyczy również kont dodanych za pośrednictwem Ustawienia > kont oraz w kreatorze wstępnej konfiguracji urządzenia.
- Zmiany w konkretnych sposobach działania interfejsu API
DevicePolicyManager
:- .
- Wywołuję metodę
setCameraDisabled()
ma wpływ na kamerę tylko u dzwoniącego użytkownika; nie powoduje połączenia z nim z profilu zarządzanego wpływają na aplikacje aparatu uruchomione przez głównego użytkownika. - Dodatkowo
setKeyguardDisabledFeatures()
jest teraz dostępna zarówno dla właścicieli profili, jak i dla właścicieli urządzeń. - Właściciel profilu może ustawić następujące ograniczenia blokady klucza:
KEYGUARD_DISABLE_TRUST_AGENTS
iKEYGUARD_DISABLE_FINGERPRINT
, które mają wpływ na ustawienia blokady klawiatury dla rodzica użytkownika profilu.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
, która ma wpływ tylko na powiadomienia generowane przez aplikacje w profilu zarządzanym.
- Metody
DevicePolicyManager.createAndInitializeUser()
iDevicePolicyManager.createUser()
zostały wycofane. setScreenCaptureDisabled()
teraz blokuje też strukturę wspomagającą, gdy aplikacja danego użytkownika działa na pierwszym planie.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
domyślnie SHA-256. Funkcja SHA-1 jest nadal obsługiwana w celu zapewnienia zgodności wstecznej, ale zostanie usunięta w przyszłości.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
obecnie akceptuje tylko SHA-256.- Interfejsy API inicjatora urządzeń, które istniały w Androidzie 6.0 (poziom API 23), zostaną usunięte.
- Karta
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
została usunięta, więc NFC musi zostać zamknięte obsługa administracyjna nie może automatycznie odblokować urządzenia chronionego z przywróconymi ustawieniami fabrycznymi. - Teraz możesz używać aplikacji
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
umożliwiają przekazywanie danych do aplikacji właściciela urządzenia podczas obsługi administracyjnej urządzenia zarządzanego za pomocą NFC. - Interfejsy API Android for Work są zoptymalizowane pod kątem uprawnień środowiska wykonawczego M, w tym profili służbowych
warstwa wspomagania i inne. Nowe interfejsy API uprawnień
DevicePolicyManager
nie na aplikacje starsze. - Gdy użytkownicy wycofują się z synchronicznej części procesu konfiguracji zainicjowanej przez
ACTION_PROVISION_MANAGED_PROFILE
lub intencjaACTION_PROVISION_MANAGED_DEVICE
, system zwraca teraz kod wynikuRESULT_CANCELED
.
- Wywołuję metodę
- Zmiany w innych interfejsach API:
- Użycie danych: nazwa klasy
android.app.usage.NetworkUsageStats
została zmienionaNetworkStats
- Użycie danych: nazwa klasy
- Zmiany ustawień globalnych:
- Tych ustawień nie można już skonfigurować w
setGlobalSettings()
:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- Te ustawienia globalne można teraz skonfigurować w
setGlobalSettings()
:
- Tych ustawień nie można już skonfigurować w