Migracja do Androida 8.0

Android 8.0 (poziom interfejsu API 26) wprowadza zmiany w działaniu oraz nowe funkcje i interfejsy API, z których możesz korzystać w swoich aplikacjach. Ten dokument zawiera przegląd czynności związanych z przeniesieniem aplikacji na Androida 8.0 w 2 kluczowych fazach:

  1. Zapewnienie zgodności z Androidem 8.0

    Sprawdź, czy aplikacja działa w pełni w nowej wersji platformy. Na tym etapie nie używasz nowych interfejsów API ani nie zmieniasz targetSdkVersion aplikacji, ale mogą być wymagane drobne zmiany.

  2. Zaktualizuj wersję docelową i użyj funkcji Androida 8.0

    Gdy będziesz gotowy do korzystania z nowych funkcji platformy, zaktualizuj wartość targetSdkVersion na 26, sprawdź, czy aplikacja nadal działa prawidłowo, a potem zacznij używać nowych interfejsów API.

Zapewnienie zgodności z Androidem 8.0

Chodzi o to, aby Twoja aplikacja działała w niezmienionej formie na Androidzie 8.0 (poziom API 26). Niektóre zmiany w platformie mogą wpływać na działanie aplikacji, dlatego konieczne może być wprowadzenie pewnych poprawek, ale nie musisz używać nowych interfejsów API ani zmieniać targetSdkVersion.

Jak zapewnić zgodność z Androidem 8.0

Przygotuj urządzenie z Androidem 8.0

Przeprowadź testy zgodności

W większości przypadków testowanie zgodności z Androidem 8.0 (poziom interfejsu API 26) obejmuje ten sam typ testów, który wykonujesz podczas przygotowywania aplikacji do wydania. Warto teraz zapoznać się ze wskazówkami dotyczącymi jakości aplikacjisprawdzonymi metodami testowania.

Testowanie ma jednak jeszcze inny aspekt: Android 8.0 wprowadza zmiany w platformie Androida, które mogą wpływać na działanie aplikacji lub całkowicie ją zepsuć, nawet jeśli nie zmienisz targetSdkVersion. Dlatego ważne jest, aby przejrzeć najważniejsze zmiany podane w tabeli 1 i przetestować wszystkie wprowadzone poprawki, aby dostosować je do nich.

Tabela 1. Kluczowe zmiany, które mają wpływ na wszystkie aplikacje działające na urządzeniach z Androidem 8.0.

Zmień Podsumowanie Więcej informacji
rzadsze aktualizacje lokalizacji w tle, Jeśli aplikacja otrzymuje aktualizacje lokalizacji z usługi działającej w tle, w Androidzie 8.0 (poziom interfejsu API 26) będzie otrzymywać je rzadziej niż w starszych wersjach Androida. Oznacza to, że usługa działająca w tle nie może otrzymywać więcej niż kilka aktualizacji lokalizacji na godzinę. Jednak gdy aplikacja jest na pierwszym planie, częstotliwość aktualizacji lokalizacji pozostaje niezmieniona. Ograniczenia dotyczące lokalizacji w tle
Już nieobsługiwane: net.hostname. Zapytanie o właściwość systemową net.hostname daje wynik o wartości null. Brak
Nowy wyjątek z send(DatagramPacket) Metoda send(DatagramPacket) zwraca błąd SocketException, jeśli wcześniej wykonana metoda connect(InetAddress, int) zakończyła się niepowodzeniem. Zmiany w zachowaniu: połączenia sieciowe i HTTP(S)
Prawidłowe NullPointerException z AbstractCollection Funkcje AbstractCollection.removeAll(null)AbstractCollection.retainAll(null) zawsze zwracają wartość NullPointerException. Wcześniej funkcja NullPointerException nie była wywoływana, gdy kolekcja była pusta. Ta zmiana sprawia, że działanie jest zgodne z dokumentacją. Zmiany w zachowaniu: obsługa kolekcji
Prawidłowe NullPointerException z Currency.getDisplayName(null) Wywołanie funkcji Currency.getDisplayName(null) powoduje wyjątek NullPointerException. Zmiany w zachowaniu: język i internacjonalizacja

Bardziej szczegółową listę zmian w działaniu Androida 8.0 (poziom interfejsu API 26) znajdziesz też w sekcji Zmiany w działaniu Androida 8.0.

Aktualizowanie wersji docelowej i korzystanie z funkcji Androida 8.0

Z tej sekcji dowiesz się, jak włączyć pełną obsługę Androida 8.0 (poziom interfejsu API 26), aktualizując targetSdkVersion do poziomu 26 oraz dodając nowe funkcje dostępne w Androidzie 8.0.

Oprócz nowych interfejsów API Android 8.0 wprowadza też zmiany w zachowaniu, gdy aktualizujesz targetSdkVersion do poziomu 26. Ponieważ niektóre zmiany zachowania mogą wymagać wprowadzenia zmian w kodzie, aby uniknąć problemów, najpierw sprawdź, jak zmiana targetSdkVersion może wpłynąć na Twoją aplikację. Aby to zrobić, zapoznaj się ze wszystkimi zmianami zachowania w przypadku aplikacji kierowanych na Androida 8.0.

Uwaga: aby ustawić kierowanie aplikacji na Androida 8.0, musisz najpierw wykonać opisane powyżej czynności, aby zapewnić zgodność platformy.

Jak zaktualizować wersję docelową i korzystać z funkcji Androida 8.0

Pobierz pakiet SDK Androida 8.0

Możesz pobrać pakiety SDK, aby utworzyć aplikację w Androidzie 8.0 (poziom interfejsu API 26) w najnowszej wersji Android Studio (zalecamy Androida Studio w wersji 3.0 lub nowszej). Android Studio 3.0 lub nowsza wersja zawiera narzędzia do obsługi funkcji Androida 8.0, takich jak ikony adaptacyjnefonty do pobrania. Jeśli nie potrzebujesz jeszcze tych funkcji, możesz użyć stabilnej wersji Android Studio 2.3.3, aby skompilować aplikację na Androida 8.0 i użyć nowych interfejsów API.

Aby skonfigurować dowolną wersję Android Studio, wykonaj te czynności:

  1. Uruchom Android Studio i otwórz Menedżera pakietu SDK, klikając Narzędzia > Menedżer pakietu SDK.
  2. Na karcie Platformy pakietu SDK zaznacz pole Pokaż szczegóły pakietu. W sekcji Podgląd na Androidzie 8.0 sprawdź te kwestie:
    • Android SDK Platform 26
    • Obraz systemu Intel x86 Atom Google APIs (wymagany tylko w przypadku emulatora)
  3. Przejdź na kartę Narzędzia pakietu SDK i odznacz wszystkie elementy, dla których dostępne są aktualizacje (kliknij pole wyboru , aby zaznaczyć kreskę). Powinny to być najnowsze wersje tych wymaganych elementów:
    • Android SDK Build-Tools 26.0.0
    • Android SDK Platform-Narzędzia w wersji 26.0.0
    • Emulator Androida 26.0.0
  4. Aby zainstalować wszystkie wybrane pakiety SDK, kliknij OK.

Teraz możesz zacząć tworzyć aplikacje na Androida 8.0.

Aktualizowanie konfiguracji kompilacji

Zaktualizuj compileSdkVersion, targetSdkVersion i wersję biblioteki pomocy do najnowszych dostępnych wersji, na przykład:

android {
  compileSdkVersion 26

  defaultConfig {
    targetSdkVersion 26
  }
  ...
}

dependencies {
  compile 'com.android.support:appcompat-v7:26.0.0'
}

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    google()

    // If you're using a version of Gradle lower than 4.1, you must instead use:
    // maven {
    //     url 'https://maven.google.com'
    // }
}

Usuwanie odbiorników transmisji z pliku manifestu

W Androidzie 8.0 (poziom interfejsu API 26) wprowadzono nowe ograniczenia dotyczące odbiorników transmisji danych, dlatego usuń wszystkie odbiorniki transmisji danych zarejestrowane dla domyślnych intencji transmisji danych. Jeśli je skonfigurujesz, nie będą zakłócać działania aplikacji w momencie kompilacji ani w czasie działania, ale nie mają one wpływu na Androida 8.0.

Rozgłaszanie, na które może odpowiadać tylko Twoja aplikacja (czyli wyraźne intencje rozgłaszania i rozgłaszanie wysyłane do nazwy pakietu Twojej aplikacji) działa tak samo w Androidzie 8.0.

Od tej nowej zasady są wyjątki. Listę domyślnych transmisji, które nadal działają w aplikacjach kierowanych na Androida 8.0, znajdziesz w artykule Wyjątki dotyczące domyślnych transmisji.

Testowanie aplikacji na Androida 8.0

Po wykonaniu powyższych czynności możesz skompilować aplikację, a następnie przetestować ją, aby mieć pewność, że działa prawidłowo w przypadku kierowania na Androida 8.0 (poziom interfejsu API 26). To dobry moment na zapoznanie się ze podstawowymi wskazówkami dotyczącymi jakości aplikacji i sprawdzonymi metodami testowania.

Podczas tworzenia aplikacji z wartością targetSdkVersion równą 26 należy pamiętać o określonych zmianach na platformie. Niektóre z tych zmian mogą znacząco wpłynąć na działanie aplikacji lub nawet spowodować jej całkowite zablokowanie, nawet jeśli nie wdrożysz nowych funkcji w Androidzie 8.0.

W tabeli 2. znajdziesz listę tych zmian wraz z linkami do dodatkowych informacji.

Tabela 2. Najważniejsze zmiany, które mają wpływ na aplikacje, gdy wartość targetSdkVersion to 26.

Zmień Podsumowanie Dodatkowe informacje
Prywatność Android 8.0 (poziom interfejsu API 26) nie obsługuje właściwości systemowych net.dns1, net.dns2, net.dns3 ani net.dns4. Zmiany w zachowaniu: prywatność
Egzekwowane segmenty z możliwością zapisu i wykonywania W przypadku bibliotek natywnych Android 8.0 (poziom interfejsu API 26) wymusza regułę, że dane nie mogą być uruchamiane, a kod nie może być zapisywany. Zmiany w działaniu: biblioteki natywne
Weryfikacja nagłówka i sekcji ELF Linker dynamiczny sprawdza więcej wartości w nagłówku ELF i w nagłówkach sekcji, a jeśli są nieprawidłowe, operacja kończy się niepowodzeniem. Zmiany w działaniu: biblioteki natywne
Powiadomienia Aplikacje kierowane na wersję SDK na Androida 8.0 (poziom interfejsu API 26) muszą mieć zaimplementowany co najmniej jeden kanał powiadomień, aby móc publikować powiadomienia dla użytkowników. Omówienie interfejsu API: Notifications
Metoda List.sort() Implementacje tej metody mogą nie wywoływać już funkcji Collections.sort(), albo aplikacja wyrzuci wyjątek z powodu przepełnienia stosu. Zmiany w działaniu: obsługa kolekcji
Metoda Collections.sort() W implementacjach list Collections.sort() wywołuje teraz błąd ConcurrentModificationException. Zachowanie: zmiany dotyczące obsługi kolekcji

Szerszą listę zmian w działaniu Androida 8.0 (poziom interfejsu API 26) znajdziesz w artykule Zmiany w działaniu Androida 8.0.

Aby poznać nowe funkcje i interfejsy API dostępne w Androidzie 8.0 (poziom interfejsu API 26), przeczytaj artykuł Funkcje i interfejsy API Androida 8.0.