Tworzenie wielu pakietów APK na urządzenia o różnych rozmiarach ekranu

Jeśli publikujesz aplikację w Google Play, musisz utworzyć i przesłać pakiet aplikacji na Androida. Gdy to zrobisz, Google Play automatycznie wygeneruje i prześle zoptymalizowane pliki APK dla każdej konfiguracji urządzenia użytkownika, aby pobrać tylko kod i zasoby potrzebne do uruchomienia aplikacji. Publikowanie wielu plików APK jest przydatne, jeśli nie publikujesz w Google Play, ale musisz samodzielnie tworzyć, podpisywać i zarządzać poszczególnymi plikami APK.

Podczas tworzenia aplikacji na Androida, która ma korzystać z wielu plików APK w Google Play, ważne jest, aby od razu zastosować dobre praktyki, aby uniknąć niepotrzebnych problemów na dalszych etapach procesu tworzenia. Z tej lekcji dowiesz się, jak utworzyć kilka plików APK aplikacji, z których każdy będzie przeznaczony do innego rozmiaru ekranu. Otrzymasz też narzędzia niezbędne do jak najprostszego zarządzania kodem źródłowym wielu APK-ów.

Potwierdź, że potrzebujesz kilku plików APK

Jeśli chcesz tworzyć aplikacje, które będą działać na urządzeniach z Androidem o różnych rozmiarach, naturalnie chcesz, aby aplikacja wykorzystywała całą dostępną przestrzeń na większych urządzeniach, bez poświęcania zgodności lub użyteczności na mniejszych ekranach. Na pierwszy rzut oka może się wydawać, że obsługa wielu plików APK jest najlepszym rozwiązaniem, ale często tak nie jest. W sekcji Używanie pojedynczego pliku APK w przewodniku dla deweloperów dotyczącym wielu plików APK znajdziesz przydatne informacje o tym, jak to zrobić za pomocą pojedynczego pliku APK, w tym o użyciu naszej biblioteki pomocniczej. Przeczytaj też przewodnik dotyczący obsługi wielu ekranów. Dostępna jest nawet biblioteka obsługi, którą możesz pobrać za pomocą pakietu Android SDK. Umożliwia ona używanie fragmentów na urządzeniach z Androidem w wersji wcześniejszej niż Honeycomb (co znacznie ułatwia obsługę wielu ekranów w pojedynczym pliku APK).

Jeśli możesz to zrobić, ograniczenie aplikacji do jednego pliku APK ma kilka zalet, w tym:

  • Łatwiej publikować i testować
  • Trzeba utrzymywać tylko jedną bazę kodu.
  • Aplikacja może dostosowywać się do zmian w konfiguracji urządzenia
  • Przywracanie aplikacji na różnych urządzeniach działa bez zarzutu.
  • Nie musisz się martwić o preferencje rynkowe, zachowanie po „uaktualnieniu” z jednego pliku APK na inny ani o to, który plik APK pasuje do której klasy urządzeń.

W pozostałej części tej lekcji zakładamy, że zapoznałeś/zapoznałaś się z tematem, dokładnie przeanalizowałeś/przeanalizowałaś materiały z powiązanych zasobów i uznałeś/uznano, że w przypadku Twojej aplikacji odpowiednim rozwiązaniem jest użycie wielu plików APK.

Wymagania w postaci wykresu

Najpierw utwórz prosty wykres, aby szybko określić, ile plików APK potrzebujesz i jakie rozmiary ekranów obsługuje każdy z nich. Na szczęście można szybko i łatwo sporządzić schemat wymagań, aby mieć go na później. Zacznij od wiersza komórek reprezentujących różne rozmiary ekranów dostępnych na platformie Android.

mały normalna duży bardzo duża

Teraz pokoloruj wykres tak, aby każdy kolor odpowiadał jednemu plikowi APK. Oto przykład zastosowania poszczególnych plików APK do określonego zakresu rozmiarów ekranu.

mały normalna duży bardzo duża

W zależności od potrzeb możesz też mieć 2 pliki APK: „mały i wszystko inne” lub „duży i wszystko inne”. Kolory na wykresie ułatwiają też komunikację w zespole – możesz teraz po prostu odwoływać się do każdego pliku APK jako „niebieski”, „zielony” lub „czerwony”, bez względu na to, ile różnych typów ekranów obsługuje.

umieszczanie całego wspólnego kodu i zasobów w projekcie biblioteki,

Niezależnie od tego, czy modyfikujesz już istniejącą aplikację na Androida, czy tworzysz ją od podstaw, jest to pierwsza i najważniejsza rzecz, którą powinieneś zrobić z bazą kodu. Wszystko, co wchodzi w skład projektu biblioteki, musi zostać zaktualizowane tylko raz (np. łańcuchy znaków zlokalizowane na potrzeby różnych języków, motywy kolorów, błędy poprawione w kodzie współdzielonym), co skraca czas rozwoju i zmniejsza prawdopodobieństwo popełnienia błędów, których można było łatwo uniknąć.

Uwaga: szczegóły implementacji dotyczące tworzenia i uwzględniania projektów biblioteki wykraczają poza zakres tego samouczka, ale możesz się z nimi zapoznać w artykule Tworzenie biblioteki na Androida.

Jeśli konwertujesz istniejącą aplikację na wersję obsługującą wiele plików APK, przeszukaj kod pod kątem każdego zlokalizowanego pliku z wierszami, listy wartości, kolorów motywu, ikon menu i układów, które nie będą się zmieniać w różnych plikach APK, i umieścić je w projekcie biblioteki. Kod, który nie ulegnie znacznym zmianom, powinien również znaleźć się w projekcie biblioteki. Prawdopodobnie będziesz musiał rozszerzyć te klasy, aby dodać jedną lub dwie metody z pliku APK do innego pliku APK.

Jeśli natomiast tworzysz aplikację od podstaw, staraj się najpierw pisać kod w projekcie biblioteki, a potem w razie potrzeby przenoś go do osobnego pliku APK. Długofalowo jest to znacznie łatwiejsze niż dodawanie do jednej, potem do drugiej, potem do kolejnej, a potem po kilku miesiącach próbowanie ustalić, czy ten blob można przenieść do sekcji biblioteki bez niszczenia czegokolwiek.

Tworzenie nowych projektów APK

Dla każdego pliku APK, który chcesz opublikować, powinien istnieć osobny projekt na Androida. Aby ułatwić sobie organizację, umieść projekt biblioteki i wszystkie powiązane projekty plików APK w tym samym folderze nadrzędnym. Pamiętaj też, że każdy plik APK musi mieć tę samą nazwę pakietu, ale nie musi być ona taka sama jak nazwa biblioteki. Jeśli masz 3 pliki APK zgodne ze schematem opisanym wcześniej, katalog główny może wyglądać tak:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

Po utworzeniu projektów dodaj projekt biblioteki jako odwołanie do każdego projektu APK. Jeśli to możliwe, zdefiniuj początkową aktywność w projekcie biblioteki, a potem rozszerz tę aktywność w projekcie APK. Zdefiniowanie w projekcie biblioteki aktywności początkowej umożliwia umieszczenie wszystkich zadań inicjujących aplikację w jednym miejscu, dzięki czemu nie trzeba będzie ponownie implementować „uniwersalnych” zadań, takich jak inicjowanie Analytics, sprawdzanie licencji i inne procedury inicjowania, które nie zmieniają się znacząco w poszczególnych plikach APK.

Dostosowywanie plików manifestu

Gdy użytkownik pobiera aplikację, która korzysta z kilku plików APK, Google Play wybiera odpowiedni plik APK na podstawie 2 prostych reguł:

  • Plik manifestu musi wskazywać, że dany plik APK spełnia wymagania.
  • Wśród kwalifikujących się plików APK wygrywa plik z najwyższym numerem wersji.

Weźmy na przykład zestaw kilku opisanych wcześniej plików APK i zakładamy, że każdy z nich obsługuje wszystkie rozmiary ekranu większe niż jego „docelowy” rozmiar. W przypadku każdego pakietu APK zakres możliwych wartości wyglądałby tak:

mały normalna duży bardzo duża
mały normalna duży bardzo duża
mały normalna duży bardzo duża

Jednak zgodnie z zasadą „wygrywa najwyższa wersja” po ustawieniu atrybutu versionCode w każdym pliku APK tak, aby czerwony ≥ zielony ≥ niebieski, wykres sprowadza się do tego:

mały normalna duży bardzo duża

Załóżmy teraz, że plik APK o nazwie Red APK ma pewne wymagania, których nie mają 2 inne pliki. Na stronie Filtry w Google Play w przewodniku dla deweloperów Androida znajdziesz całą listę możliwych przyczyn. Dla przykładu załóżmy, że czerwony wymaga przedniego aparatu. Celem czerwonego pliku APK jest wykorzystanie dodatkowej przestrzeni na ekranie do zabawy z przednim aparatem. Okazuje się jednak, że nie wszystkie urządzenia o dużej przekątnej mają aparaty przednie. O, obrzydlistwo!

Na szczęście, jeśli użytkownik przegląda Google Play na takim urządzeniu, Google Play sprawdzi manifest, zauważy, że aplikacja Red wymaga przedniej kamery, i po cichu go zignoruje, ponieważ uzna, że Red i to urządzenie nie są stworzone dla siebie. W tym przypadku zobaczysz, że kolor zielony jest zgodny nie tylko z urządzeniami xlarge, ale też nie ma znaczenia, czy mają one przednią kamerę. Użytkownik może nadal pobrać aplikację z Google Play, ponieważ pomimo całego zamieszania z przednim aparatem nadal istniał plik APK obsługujący dany rozmiar ekranu.

Aby zachować wszystkie pliki APK na osobnych „ścieżkach”, musisz mieć dobry kod wersji. Zalecane ustawienia znajdziesz w sekcji Kody wersji w poradniku dla deweloperów. Ponieważ przykładowy zestaw plików APK dotyczy tylko 1 z 3 możliwych wymiarów, wystarczy rozdzielić każdy plik APK o 1000 i zwiększyć go o 1000. Może to wyglądać tak:

Niebieski: 1001, 1002, 1003, 1004…
Zielony: 2001, 2002, 2003, 2004…
Czerwony:3001, 3002, 3003, 3004…

Po połączeniu wszystkich tych elementów pliki manifestu Androida będą wyglądać mniej więcej tak:

Niebieski:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Zielony:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Czerwony:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

Pamiętaj, że technicznie rzecz biorąc wiele plików APK będzie działać z tagiem supports-screens lub tagiem compatible-screens. Tag supports-screens jest zwykle preferowany, a używanie obu tagów w tym samym pliku manifestu to zwykle bardzo zły pomysł. Sprawia, że wszystko staje się niepotrzebnie skomplikowane i zwiększa prawdopodobieństwo wystąpienia błędów. Pamiętaj też, że zamiast korzystać z wartości domyślnych (small i normal są zawsze domyślnie ustawione na true), manifesty określają wartość dla każdego rozmiaru ekranu. Dzięki temu zaoszczędzisz sobie bólu głowy w przyszłości. Na przykład w pliku manifestu z wartością docelową pakietu SDK < 9 parametr xlarge będzie automatycznie ustawiony na wartość fałsz, ponieważ ten rozmiar nie istniał jeszcze w czasie publikacji. Więc bądź wyraźny.

Sprawdzanie listy kontrolnej przed opublikowaniem

Zanim prześlesz aplikację do Google Play, sprawdź te kwestie. Pamiętaj, że te informacje dotyczą wielu plików APK i w żaden sposób nie stanowią pełnej listy kontrolnej dla wszystkich aplikacji przesyłanych do Google Play.

  • Wszystkie pliki APK muszą mieć tę samą nazwę pakietu.
  • Wszystkie pliki APK muszą być podpisane tym samym certyfikatem.
  • Każdy rozmiar ekranu, który ma obsługiwać APK, ustaw w manifeście na wartość Prawda. Każdy rozmiar ekranu, którego chcesz uniknąć, ustaw na wartość fałsz.
  • Sprawdź, czy filtry pliku manifestu nie zawierają sprzecznych informacji (plik APK, który obsługuje tylko ekrany w formacie XLARGE, nie będzie widoczny dla nikogo).
  • Plik manifestu każdego pakietu APK musi być niepowtarzalny co najmniej w przypadku jednej z obsługiwanych wersji ekranu, tekstury OpenGL lub platformy.
  • Spróbuj przetestować każdy plik APK na co najmniej 1 urządzeniu. W przeciwnym razie masz na swoim komputerze deweloperskim jeden z najbardziej konfigurowalnych emulatorów urządzeń na rynku. Do dzieła!

Przed opublikowaniem aplikacji w Google Play warto też sprawdzić skompilowany plik APK, aby upewnić się, że nie zawiera on żadnych niespodzianek, które mogłyby uniemożliwić wyświetlanie aplikacji w Google Play. To bardzo proste, jeśli użyjesz narzędzia „aapt”. Aapt (Android Asset Packaging Tool) jest częścią procesu kompilacji służącego do tworzenia i pakowania aplikacji na Androida. Jest też bardzo przydatnym narzędziem do ich sprawdzania.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Podczas sprawdzania danych wyjściowych aapt sprawdź, czy nie ma sprzecznych wartości w przypadku elementów supports-screens i compatible-screens, a także czy nie ma niezamierzonych wartości „uses-feature”, które zostały dodane w ramach uprawnień ustawionych w pliku manifestu. W przykładzie powyżej plik APK będzie niewidoczny dla większości, jeśli nie wszystkich, urządzeń.

Dlaczego? Dodanie wymaganego uprawnienia SEND_SMS spowodowało dodanie wymagań dotyczących funkcji android.hardware.telephony. Większość (choć nie wszystkie) urządzeń xlarge to tablety bez funkcji telefonicznych, dlatego w tych przypadkach Google Play będzie odfiltrowywać te pliki APK, dopóki nie pojawią się urządzenia, które będą wystarczająco duże, aby raportować rozmiar ekranu xlarge, i będą miały funkcję telefoniczną.

Na szczęście można to łatwo naprawić, dodając do pliku manifestu:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

Wymaganie android.hardware.touchscreen jest też dodawane domyślnie. Jeśli chcesz, aby plik APK był widoczny na telewizorach, które nie mają ekranu dotykowego, do pliku manifestu dodaj:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Po wypełnieniu listy kontrolnej przed opublikowaniem przesyłaj pliki APK do Google Play. Zanim aplikacja pojawi się w Google Play, może minąć trochę czasu. Gdy to nastąpi, wykonaj jeszcze jedną kontrolę. Pobierz aplikację na dowolne urządzenia testowe, aby mieć pewność, że pliki APK są kierowane na odpowiednie urządzenia.

Więcej informacji o publikowaniu wielu plików APK w Google Play znajdziesz w artykule Obsługa wielu plików APK.