Zmiany w Androidzie 6.0

Oprócz nowych funkcji i możliwości Android 6.0 (poziom interfejsu API 23) zawiera wiele zmian w systemie i zachowaniu interfejsu API. W tym dokumencie omawiamy niektóre z najważniejszych zmian, które należy wziąć pod uwagę w przypadku aplikacji.

Jeśli masz już opublikowaną aplikację na Androida, pamiętaj, że te zmiany na platformie mają wpływ na Twoją aplikację.

Uprawnienia czasu działania

Ta wersja wprowadza nowy model uprawnień, dzięki któremu użytkownicy mogą bezpośrednio zarządzać uprawnieniami aplikacji w czasie działania. Ten model daje użytkownikom większą kontrolę nad uprawnieniami, a deweloperom ułatwia proces instalacji i automatycznych aktualizacji. Użytkownicy mogą przyznawać i odbierać uprawnienia pojedynczo zainstalowanym aplikacjom.

W przypadku aplikacji kierowanych na Androida 6.0 (poziom interfejsu API 23) lub nowszego sprawdź i poproś o uprawnienia w czasie działania. Aby sprawdzić, czy Twoja aplikacja ma przyznane uprawnienie, wywołaj nową metodę checkSelfPermission(). Aby poprosić o uprawnienia, wywołaj nową metodę requestPermissions(). Nawet jeśli Twoja aplikacja nie jest kierowana na Androida 6.0 (poziom interfejsu API 23), przetestuj ją pod kątem nowego modelu uprawnień.

Szczegółowe informacje na temat obsługi nowego modelu uprawnień w aplikacji znajdziesz w sekcji Praca z uprawnieniami systemu. Wskazówki dotyczące oceny wpływu na aplikację znajdziesz w uwagach na temat korzystania z uprawnień.

Uśpienie i tryb czuwania aplikacji

W tej wersji wprowadzamy nowe optymalizacje oszczędzania energii na nieaktywnych urządzeniach i w nieaktywnych aplikacjach. Te funkcje mają wpływ na wszystkie aplikacje, więc pamiętaj o przetestowaniu aplikacji w nowych trybach.

  • Uśpienie: jeśli użytkownik odłączy urządzenie i zosta na nim przez jakiś czas wyłączony ekran, urządzenie przejdzie w tryb drzemki, w którym próbuje utrzymać system w stanie uśpienia. W tym trybie urządzenia okresowo wznawiają normalne działanie na krótki czas, aby umożliwić synchronizację aplikacji i wykonywanie oczekujących operacji.
  • Tryb czuwania aplikacji: tryb czuwania aplikacji pozwala systemowi określić, że aplikacja jest nieaktywna, gdy użytkownik z niej nie korzysta. System określa to, gdy użytkownik nie dotyka aplikacji przez określony czas. Jeśli urządzenie jest odłączone, system wyłącza dostęp do sieci i zawiesi synchronizacje oraz zadania w aplikacjach, które uzna za nieaktywne.

Więcej informacji o tych zmianach oszczędzających energię znajdziesz w artykule Optymalizowanie pod kątem funkcji uśpienia i czuwania aplikacji.

Usunięcie klienta HTTP Apache

W wersji 6.0 Androida usunięto obsługę klienta HTTP Apache. Jeśli Twoja aplikacja korzysta z tego klienta i jest kierowana na Androida 2.3 (poziom interfejsu API 9) lub nowszego, użyj zamiast tego klasy HttpURLConnection. Ten interfejs API jest wydajniejszy, ponieważ zmniejsza wykorzystanie sieci dzięki przejrzystemu kompresowaniu i przechowywaniu w pamięci podręcznej odpowiedzi, a także minimalizuje zużycie energii. Aby nadal korzystać z interfejsów HTTP Apache, musisz najpierw zadeklarować w pliku build.gradle tę zależność kompilacji:

android {
    useLibrary 'org.apache.http.legacy'
}

BoringSSL

Android odchodzi od OpenSSL na rzecz biblioteki BoringSSL. Jeśli w swojej aplikacji używasz pakietu Android NDK na Androida, nie twórz połączeń z bibliotekami kryptograficznymi, które nie są częścią interfejsu NDK API, takimi jak libcrypto.so i libssl.so. Te biblioteki nie są interfejsami API publicznymi i mogą się zmieniać lub przestać działać bez powiadomienia w różnych wersjach i na różnych urządzeniach. Dodatkowo możesz narazić się na luki w zabezpieczeniach. Zamiast tego zmodyfikuj kod natywny tak, aby wywoływał interfejsy API kryptografii Java przez JNI lub statycznie łączył się z wybraną biblioteką kryptograficzną.

Dostęp do identyfikatora sprzętu

Aby zapewnić użytkownikom lepszą ochronę danych, od tej wersji Android usuwa programowy dostęp do lokalnego identyfikatora sprzętowego urządzenia w przypadku aplikacji, które korzystają z interfejsów API Wi-Fi i Bluetooth. Metody WifiInfo.getMacAddress() i BluetoothAdapter.getAddress() 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 za pomocą skanowania Bluetooth i Wi-Fi, aplikacja musi mieć uprawnienia ACCESS_FINE_LOCATION lub ACCESS_COARSE_LOCATION:

Uwaga: gdy urządzenie z Androidem 6.0 (poziom interfejsu API 23) rozpocznie skanowanie Wi-Fi lub Bluetooth w tle, operacja będzie widoczna dla urządzeń zewnętrznych jako pochodząca z losowego adresu MAC.

Powiadomienia

Ta wersja usuwa metodę Notification.setLatestEventInfo(). Do tworzenia powiadomień użyj klasy Notification.Builder. Aby wielokrotnie aktualizować powiadomienie, ponownie użyj instancji Notification.Builder. Aby uzyskać zaktualizowane instancje Notification, wywołaj metodę build().

Polecenie adb shell dumpsys notification nie drukuje już tekstu powiadomienia. Aby wydrukować tekst w obiekcie powiadomienia, użyj polecenia adb shell dumpsys notification --noredact.

Zmiany w AudioManager

Nie można już ustawiać głośności bezpośrednio ani wyciszać określonych strumieni za pomocą klasy AudioManager. Metoda setStreamSolo() została wycofana. Zamiast niej wywołuj metodę requestAudioFocus(). Podobnie metoda setStreamMute() została wycofana. Zamiast niej wywołaj metodę adjustStreamVolume() i podaj wartość kierunku ADJUST_MUTE lub ADJUST_UNMUTE.

Zaznaczanie tekstu

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

Gdy użytkownicy zaznaczą tekst w aplikacji, możesz wyświetlić w pływającym pasku narzędzi opcje zaznaczania tekstu, takie jak Wytnij, KopiujWklej. Interakcje użytkownika są podobne do tych w przypadku paska działań kontekstowych, jak opisano w artykule Włączanie trybu działań kontekstowych w poszczególnych widokach.

Aby wdrożyć pływający pasek narzędzi do zaznaczania tekstu, w dotychczasowych aplikacjach wprowadź te zmiany:

  1. W obiekcie View lub Activity zmień wywołania ActionMode z startActionMode(Callback) na startActionMode(Callback, ActionMode.TYPE_FLOATING).
  2. Weź istniejące wdrożenie ActionMode.Callback i rozszerz je o ActionMode.Callback2.
  3. Zastąp metodę onGetContentRect(), aby podać współrzędne obiektu treści Rect (np. prostokąt zaznaczonego tekstu) w widoku.
  4. Jeśli pozycjonowanie prostokąta nie jest już prawidłowe i jest to jedyny element, który należy unieważnić, wywołaj metodę invalidateContentRect().

Jeśli używasz biblioteki Android Support Library w wersji 22.2, pamiętaj, że pływające paski narzędzi nie są zgodne wstecznie, a biblioteka Android Support Library domyślnie przejmuje kontrolę nad obiektami ActionMode. Zapobiega to wyświetlaniu pływających pasków narzędzi. Aby włączyć obsługę ActionModeAppCompatActivity, wywołaj metodę getDelegate(), a następnie wywołaj metodę setHandleNativeActionModesEnabled() zwracanego obiektu AppCompatDelegate i ustaw parametr wejściowy na wartość false. To wywołanie zwraca do platformy kontrolę nad obiektami ActionMode. Na urządzeniach z Androidem 6.0 (poziom interfejsu API 23) framework obsługuje tryby ActionBar lub pływającego paska narzędzi, a na urządzeniach z Androidem 5.1 (poziom interfejsu API 22) lub starszym obsługiwane są tylko tryby ActionBar.

Zmiany zakładek w przeglądarce

W tej wersji usunięto obsługę globalnych zakładek. Metody android.provider.Browser.getAllBookmarks() i android.provider.Browser.saveBookmark() zostały usunięte. Zostaną też usunięte uprawnienia READ_HISTORY_BOOKMARKSWRITE_HISTORY_BOOKMARKS. Jeśli Twoja aplikacja jest kierowana na Androida 6.0 (poziom interfejsu API 23) lub nowszego, nie uzyskuj dostępu do zakładek od globalnego dostawcy ani nie używaj uprawnień do zakładek. Zamiast tego aplikacja powinna przechowywać dane zakładek wewnętrznie.

Zmiany w magazynie kluczy Androida

W tej wersji usługa Android Keystore provider nie obsługuje już DSA. ECDSA jest nadal obsługiwana.

Klucze, które nie wymagają szyfrowania w spoczynku, nie będą już usuwane po wyłączeniu lub zresetowaniu bezpiecznego ekranu blokady (np. przez użytkownika lub administratora urządzenia). Klucze, które wymagają szyfrowania w spoczynku, zostaną usunięte podczas tych zdarzeń.

Zmiany dotyczące Wi-Fi i sieci

W tej wersji wprowadziliśmy w interfejsach API Wi-Fi i sieci te zmiany zachowania:

  • Aplikacje mogą teraz zmieniać stan obiektów WifiConfiguration tylko wtedy, gdy zostały one utworzone przez Ciebie. Nie możesz modyfikować ani usuwać obiektów WifiConfiguration utworzonych przez użytkownika lub inne aplikacje.
  • Wcześniej, jeśli aplikacja zmuszała urządzenie do połączenia z konkretną siecią Wi-Fi za pomocą enableNetwork() z ustawieniem disableAllOthers=true, urządzenie rozłączało się z innymi sieciami, takimi jak dane komórkowe. W tej wersji urządzenie nie rozłącza się z takich sieci. Jeśli targetSdkVersion ma wartość “20” lub niższą, aplikacja jest przypięta do wybranej sieci Wi-Fi. Jeśli wartość targetSdkVersion Twojej aplikacji wynosi “21” lub wyższa, używaj interfejsów API dla wielu sieci (takich jak openConnection(), bindSocket() i nowa metoda bindProcessToNetwork()), aby ruch sieciowy był wysyłany przez wybraną sieć.

Zmiany w usługach aparatu

W tej wersji model dostępu do współdzielonych zasobów w usłudze kamery został zmieniony z poprzedniego, „kto pierwszy, ten lepszy” na model dostępu, w którym faworyzowane są procesy o wysokim priorytecie. Zmiany w zachowaniu usługi:

  • Dostęp do zasobów podsystemu kamery, w tym do otwierania i konfigurowania kamery, jest przyznawany na podstawie „priorytetu” procesu aplikacji klienckiej. Procesy aplikacji z widocznymi dla użytkownika działaniami lub działaniami na pierwszym planie mają zazwyczaj wyższy priorytet, co sprawia, że pozyskiwanie i używanie zasobów aparatu jest bardziej niezawodne.
  • Aktywni klienci aparatu w przypadku aplikacji o niższym priorytecie mogą zostać „wyrzuceni”, gdy aplikacja o wyższym priorytecie spróbuje użyć aparatu. W starym interfejsie API Camera wywoływany jest interfejs onError() dla wyrzuconego klienta. W interfejsie API Camera2 wywoływane jest polecenie onDisconnected() dla wykluczonego klienta.
  • Na urządzeniach z odpowiednim sprzętem do obsługi aparatu poszczególne procesy aplikacji mogą niezależnie otwierać i jednocześnie korzystać z oddzielnych urządzeń do obsługi aparatu. Jednak przypadki użycia wieloprocesowego, w których jednoczesny dostęp powoduje znaczne pogorszenie wydajności lub możliwości dowolnego z otwartych urządzeń z aparatem, są teraz wykrywane i zabronione przez usługę aparatu. Ta zmiana może spowodować „wyrzucanie” klientów o niższym priorytecie, nawet jeśli żadna inna aplikacja nie próbuje bezpośrednio uzyskać dostępu do tego samego urządzenia z kamerą.
  • Zmiana bieżącego użytkownika powoduje usunięcie aktywnych klientów aparatu w aplikacjach należących do poprzedniego konta użytkownika. Dostęp do aparatu jest ograniczony do profili użytkowników należących do bieżącego użytkownika urządzenia. W praktyce oznacza to, że konto „Gość” nie będzie mogło pozostawić uruchomionych procesów, które korzystają z podsystemu kamery, gdy użytkownik przełączy się na inne konto.

Środowisko wykonawcze

Środowisko wykonawcze ART prawidłowo implementuje teraz reguły dostępu dla metody newInstance(). Ta zmiana rozwiązuje problem, który powodował, że Dalvik nieprawidłowo sprawdzał reguły dostępu w poprzednich wersjach. Jeśli Twoja aplikacja używa metody newInstance() i chcesz zastąpić sprawdzanie dostępu, wywołaj metodę setAccessible() z parametrem wejściowym ustawionym na true. Jeśli Twoja aplikacja korzysta z biblioteki appcompat w wersji 7 lub z biblioteki recyclerview w wersji 7, musisz zaktualizować aplikację, aby używała najnowszych wersji tych bibliotek. W przeciwnym razie upewnij się, że wszystkie klasy niestandardowe, do których odwołuje się plik XML, są zaktualizowane, aby ich konstruktory były dostępne.

Ta wersja aktualizuje działanie linkera dynamicznego. Linker dynamiczny rozumie teraz różnicę między soname biblioteki a jej ścieżką ( publiczny błąd 6670), a wyszukiwanie według soname zostało zaimplementowane. Aplikacje, które wcześniej działały, ale mają nieprawidłowe wpisy DT_NEEDED (zwykle ścieżki bezwzględne w systemie plików maszyny do kompilacji) mogą nie załadować się prawidłowo.

Flaga dlopen(3) RTLD_LOCAL jest teraz prawidłowo zaimplementowana. Pamiętaj, że RTLD_LOCAL jest domyślną wartością, więc wywołania funkcji dlopen(3), które nie używają funkcji RTLD_LOCAL, będą miały wpływ na tę funkcję (chyba że Twoja aplikacja używa funkcji RTLD_GLOBAL). W przypadku funkcji RTLD_LOCAL symbole nie będą dostępne dla bibliotek wczytywanych przez późniejsze wywołania funkcji dlopen(3) (w przeciwieństwie do odwołań przez wpisy DT_NEEDED).

W poprzednich wersjach Androida, jeśli aplikacja prosiła system o załadowanie współdzielonej biblioteki z przemieszczeniami tekstu, system wyświetlał ostrzeżenie, ale nadal zezwalał na załadowanie biblioteki. Począwszy od tej wersji system odrzuca tę bibliotekę, jeśli docelowa wersja pakietu SDK Twojej aplikacji to 23 lub wyższa. Aby pomóc Ci wykryć, czy nie udało się załadować biblioteki, aplikacja powinna rejestrować błąd dlopen(3) i zawierać tekst opisu problemu zwracany przez wywołanie dlerror(3). Więcej informacji o przenoszeniu tekstu znajdziesz w tym przewodniku.

Sprawdzanie pliku APK

Platforma przeprowadza teraz bardziej rygorystną weryfikację plików APK. Plik APK jest uznawany za uszkodzony, jeśli plik jest zadeklarowany w manifeście, ale nie jest obecny w pliku APK. Jeśli usuniesz jakikolwiek element, pakiet APK musi zostać ponownie podpisany.

Połączenie USB

Połączenia urządzenia przez port USB są teraz domyślnie ustawione w trybie tylko do ładowania. Aby uzyskać dostęp do urządzenia i jego zawartości przez połączenie USB, użytkownicy muszą wyraźnie zezwolić na takie interakcje. Jeśli Twoja aplikacja umożliwia użytkownikom interakcję z urządzeniem przez port USB, pamiętaj, ż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 poprzednie połączenia. Ustawienie setCrossProfileCallerIdDisabled() na true powoduje ukrycie kontaktów z profilu służbowego w Rejestrze połączeń w aplikacji Dialer Google. Kontakty służbowe mogą być wyświetlane razem z kontaktami osobistymi na urządzeniach przez Bluetooth tylko wtedy, gdy ustawisz setBluetoothContactSharingDisabled() na false. Domyślnie ustawiona wartość to true.
  • Usunięcie konfiguracji Wi-Fi: konfiguracje sieci Wi-Fi dodane przez właściciela profilu (na przykład przez wywołania metody addNetwork()) są teraz usuwane po usunięciu profilu służbowego.
  • Zablokowanie konfiguracji Wi-Fi: użytkownik nie może już modyfikować ani usuwać żadnej konfiguracji Wi-Fi utworzonej przez aktywnego właściciela urządzenia, jeśli wartość WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN jest niezerowa. Użytkownik może nadal tworzyć i modyfikować własne konfiguracje Wi-Fi. Aktywni właściciele urządzeń mogą edytować lub usuwać wszelkie konfiguracje Wi-Fi, również te, które nie zostały przez nich utworzone.
  • Pobieranie kontrolera zasad dotyczących urządzeń za pomocą dodawania konta Google: gdy konto Google, które wymaga zarządzania za pomocą aplikacji kontrolera zasad dotyczących urządzeń, zostanie dodane do urządzenia poza kontekstem zarządzanym, proces dodawania konta poprosi użytkownika o zainstalowanie odpowiedniego WPC. Dotyczy to również kont dodanych w sekcji Ustawienia > Konta oraz w kreatorze konfiguracji urządzenia.
  • Zmiany w działaniu niektórych funkcji interfejsu API DevicePolicyManager:
    • Wywołanie metody setCameraDisabled() ma wpływ tylko na kamerę użytkownika wywołującego metodę. Wywołanie jej z profilu zarządzanego nie ma wpływu na aplikacje aparatu działające na koncie głównego użytkownika.
    • Dodatkowo metodasetKeyguardDisabledFeatures()jest teraz dostępna dla właścicieli profili i właścicieli urządzeń.
    • Właściciel profilu może ustawić następujące ograniczenia blokady kluczy:
    • Metody DevicePolicyManager.createAndInitializeUser() i DevicePolicyManager.createUser() zostały wycofane.
    • Metoda setScreenCaptureDisabled() blokuje teraz strukturę wspomagającą, gdy aplikacja danego użytkownika działa na pierwszym planie.
    • EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUMużywa teraz domyślnie algorytmu SHA-256. SHA-1 jest nadal obsługiwane ze względu na zgodność wsteczną, ale w przyszłości zostanie usunięte. EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM teraz 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 funkcja buforowania NFC nie może automatycznie odblokować urządzenia chronionego resetem do ustawień fabrycznych.
    • Teraz możesz użyć dodatku EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE do przekazywania danych do aplikacji właściciela urządzenia podczas obsługi NFC na urządzeniu zarządzanym.
    • Interfejsy API Androida dla firm są zoptymalizowane pod kątem uprawnień czasu działania w Androidzie M, w tym profili służbowych, warstwy wspomagania itp. Nowe interfejsy API dotyczące uprawnień DevicePolicyManager nie mają wpływu na aplikacje z wersją Androida M.
    • Gdy użytkownicy wycofują się z części synchronicznej procesu konfiguracji zainicjowanego za pomocą inencji ACTION_PROVISION_MANAGED_PROFILE lub ACTION_PROVISION_MANAGED_DEVICE, system zwraca kod wyniku RESULT_CANCELED.
  • Zmiany w innych interfejsach API:
    • Użycie danych: nazwa klasy android.app.usage.NetworkUsageStats została zmieniona na NetworkStats.
  • Zmiany w ustawieniach globalnych: