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 Android App Bundle. 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, warto od razu zastosować sprawdzone metody, 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. Zyskasz też dostęp do narzędzi, dzięki którym baza kodu z wieloma plikami APK będzie jak najbardziej bezproblemowa.

Potwierdź, że potrzebujesz wielu plików APK

Tworząc aplikację, która działa na urządzeniach z Androidem w różnych rozmiarach, zależy Ci przede wszystkim na tym, by wykorzystała całą dostępną przestrzeń dostępną na większych urządzeniach, zachowując zgodność i łatwość obsługi na mniejszych ekranach. Na początku może się wydawać, że chociaż obsługa wielu plików APK to najlepsze rozwiązanie, ale w rzeczywistości tak nie jest. W sekcji Używanie pojedynczego pliku APK w przewodniku dla programistów obejmujących wiele plików APK znajdziesz przydatne informacje o tym, jak to zrobić, korzystając z jednego pliku APK. Znajdziesz tam m.in. naszą bibliotekę pomocy. Zapoznaj się też z przewodnikiem na temat obsługi wielu ekranów. Dostępna jest nawet biblioteka pomocy, którą możesz pobrać za pomocą pakietu Android SDK. Pozwala ona używać fragmentów na urządzeniach sprzed Honeycomb (co znacznie ułatwia obsługę wielu ekranów w jednym 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 po prostu działa
  • Nie musisz się martwić preferencjami rynkowymi, zachowaniem po „uaktualnieniu” z jednego pliku APK na inny ani tym, który plik APK pasuje do której klasy urządzeń.

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

Przedstaw swoje wymagania

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żesz łatwo i szybko określić wymagania, a także skorzystać z pomocy w przyszłości. 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”, niezależnie od tego, ile różnych typów ekranów obsługuje.

Umieść cały wspólny kod i zasoby w projekcie biblioteki

Niezależnie od tego, czy modyfikujesz już istniejącą aplikację na Androida, czy tworzysz ją od podstaw, to właśnie to powinno być pierwszą i najważniejszą rzeczą, którą należy zrobić z bazą kodu. Wszystko, co wchodzi w skład projektu biblioteki, musi być aktualizowane tylko raz (np. łańcuchy znaków zlokalizowane na potrzeby różnych języków, motywy kolorów, błędy poprawione w kodeksie 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 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ę, aby korzystała z wielu plików APK, przeszukaj bazę kodu pod kątem każdego pliku ze zlokalizowanymi ciągami znaków, listy wartości, kolorów motywów, ikon menu i układu, które nie ulegną zmianie w różnych plikach APK, a potem umieść to wszystko 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.

Jeśli natomiast tworzysz aplikację od podstaw, najpierw staraj się 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 plikó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 mieć tej samej nazwy co biblioteka. Jeśli masz 3 pliki APK zgodnie 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 aktywność początkową w projekcie biblioteki i rozszerzaj ją w projekcie APK. Jeśli masz określone działanie początkowe w projekcie biblioteki, możesz umieścić wszystkie inicjalizacje aplikacji w jednym miejscu, dzięki czemu nie trzeba będzie ponownie wdrażać „uniwersalnych” zadań, takich jak inicjowanie Analytics, sprawdzanie licencji czy inne procedury inicjowania, które nie ulegną zmianie w znaczących stopniu w poszczególnych pakietach APK.

Dostosowywanie plików manifestu

Gdy użytkownik pobiera z Google Play aplikację, która korzysta z wielu plików APK, właściwy plik APK do wyboru jest wybierany na podstawie 2 prostych reguł:

  • Plik manifestu musi pokazywać, ż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. Rozpatrywany osobno możliwy zakres każdego pakietu APK 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 pozostałe pliki. Pełną listę potencjalnych problemów znajdziesz na stronie Filtry w Google Play w przewodniku dla programistów aplikacji na Androida. 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. Horror!

Na szczęście, jeśli użytkownik przegląda Google Play na takim urządzeniu, Google Play sprawdzi manifest, zauważy, że Red wymaga przedniej kamery, i po cichu zignoruje tę aplikację, ponieważ uzna, że Red i to urządzenie nie są stworzone dla siebie. Następnie stwierdzi, że zielony jest nie tylko kompatybilny z dużymi urządzeniami, ale też nie ma znaczenia, czy jest wyposażony w przedni aparat. 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 wszystkie pliki APK mieć oddzielne „ścieżki”, ważne jest stosowanie dobrego schematu kodu wersji. Zalecany kod znajdziesz w sekcji Kody wersji w naszym przewodniku dla programistów. Ponieważ przykładowy zestaw plików APK obejmuje tylko 1 z 3 możliwych wymiarów, wystarczy oddzielić każdy plik APK o 1000 i potem zwiększać jego liczbę. 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 plików manifestu Androida pliki manifestu będą wyglądały 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. Ogólnie zalecamy użycie ekranów z obsługą ekranów. Ogólnie lepiej jest użyć obu tagów w tym samym pliku manifestu. 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 (wartość mała i normalna ma zawsze wartość „prawda”), pliki manifestu jawnie określają wartość dla każdego rozmiaru ekranu. Pozwoli Ci to uniknąć problemów. Na przykład w przypadku pliku manifestu z docelowym pakietem SDK < 9 parametr xlarge automatycznie ma wartość false, ponieważ taki rozmiar jeszcze nie istniał. Więc bądź wyraźny.

Przejrzyj listę kontrolną przed opublikowaniem

Zanim prześlesz aplikację do Google Play, sprawdź te kwestie. Pamiętaj, że dotyczą one wielu plików APK i 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ć plik APK, ustaw w manifeście na wartość Prawda. Dla każdego rozmiaru ekranu, w którym chcesz go unikać, ustaw wartość Fałsz
  • Dokładnie sprawdź filtry manifestu pod kątem sprzecznych informacji (plik APK, który obsługuje tylko babeczki na ekranach XLARGE, nie będzie dla nikogo widoczny).
  • Każdy plik manifestu musi być unikalny w obrębie co najmniej 1 obsługiwanego ekranu, tekstury openGL lub wersji platformy
  • Spróbuj przetestować każdy pakiet 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 dość proste, jeśli użyjesz narzędzia „aapt”. Aapt (narzędzie Android Asset Packaging) jest częścią procesu kompilacji, który służy 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'

Analizując dane wyjściowe narzędzia aapt, upewnij się, że nie masz sprzecznych wartości opcji „supports-screen” i „zgodne ekrany” oraz czy nie masz niezamierzonych wartości „uses-feature” dodanych w wyniku uprawnień ustawionych w pliku manifestu. W powyższym przykładzie pakiet APK będzie niewidoczny dla większości urządzeń, a nawet wszystkich.

Dlaczego? Dodając wymagane uprawnienia SEND_SMS, domyślnie dodaliśmy wymagania dotyczące funkcji android.hardware.telephony. Większość (jeśli nie wszystkie) bardzo duże urządzenia to tablety bez dodatkowego sprzętu telefonicznego, dlatego Google Play będzie odfiltrowywać ten plik APK w takich przypadkach, dopóki nie pojawią się nowe urządzenia, które będą na tyle duże, by można je było wyświetlać jako bardzo duże ekrany, i będą wyposażone w sprzęt telefoniczny.

Na szczęście ten problem można łatwo rozwiązać, dodając do pliku manifestu ten problem:

<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, dodaj do pliku manifestu:

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

Po wykonaniu czynności z listy kontrolnej przed opublikowaniem prześlij pliki APK do Google Play. Może minąć trochę czasu, zanim aplikacja pojawi się w Google Play, ale gdy już się pojawi, trzeba przeprowadzić ostatnie sprawdzenie. Pobierz aplikację na urządzenia testowe, by upewnić się, że pliki APK są kierowane na odpowiednie urządzenia.

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