Zmiany w Androidzie 6.0

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

Ekran z nowymi funkcjami zaznaczania tekstu na pływającym pasku narzędzi

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:

  1. W obiekcie View lub Activity zmień: ActionMode połączeń od startActionMode(Callback) do startActionMode(Callback, ActionMode.TYPE_FLOATING).
  2. Przedłuż obecną implementację ActionMode.Callback i ją wydłuż ActionMode.Callback2.
  3. Zastąp onGetContentRect() metoda podawania współrzędnych obiektu Rect treści np. prostokąta zaznaczenia tekstu.
  4. 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() z disableAllOthers=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śli targetSdkVersion Twojej aplikacji ma wartość “20” lub mniej, jest przypięta do wybranych Sieć Wi-Fi. Jeśli targetSdkVersion w Twojej aplikacji ma wartość “21” lub wyższą, użyj interfejsów API obejmujących wiele sieci (takich jak openConnection(), bindSocket() oraz nowa bindProcessToNetwork()), 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 to onError() jako nawołując do usunięcia klienta. W interfejsie API Camera2 skutkuje to wynikiem onDisconnected() 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() na true 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, ustaw setBluetoothContactSharingDisabled() na false. 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:
    • Metody DevicePolicyManager.createAndInitializeUser() i DevicePolicyManager.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 intencja ACTION_PROVISION_MANAGED_DEVICE, system zwraca teraz kod wyniku RESULT_CANCELED.
  • Zmiany w innych interfejsach API:
    • Użycie danych: nazwa klasy android.app.usage.NetworkUsageStats została zmieniona NetworkStats
  • Zmiany ustawień globalnych: