App Bundle – jak Google rewolucjonizuje Androida?

Paweł Dedio Programowanie 2019-01-12

Witajcie w kolejnym odcinku — tym razem przychodzę do Was z tematem, który powinien zainteresować nie tylko osoby związane z programowaniem. App Bundle zmienia bowiem nie tylko proces budowania, ale również cały system instalacji oraz dystrybucji aplikacji. Rozsiądźcie się wygodnie i zapraszam do czytania!

Dlaczego aktualne rozwiązanie jest złe?

programista android

Pamiętacie odcinek o rozmiarze aplikacji? Pokazywałem tam, jak dużo miejsca jest marnowane przez to, że musimy dostarczać różne wersje plików interfejsu użytkownika w zależności od ekranu. Problematyczne jest również dostarczanie różnych funkcjonalności dla różnych grup użytkowników, ponieważ nawet jeśli wyłączymy jakąś funkcjonalność to kod, który za nią odpowiada i tak będzie zajmował miejsce na urządzeniu. Kolejną sprawą są biblioteki natywne — ich specyfika jest taka, że musimy mieć je w kilku wersjach, w zależności od architektury procesora. Przeważnie ich rozmiar jest dość duży, stąd nie możemy sobie pozwolić na takie marnotrawstwo. Możemy to rozwiązać, tworząc kilka wersji naszej aplikacji — każda dedykowana pod konkretny procesor i zawierająca tylko jedną wersję danej biblioteki. Niestety jest to dość upierdliwe rozwiązanie i wymaga od nas nieco pracy.

Jak wygląda App Bundle w teorii?

Zasada budowania aplikacji tak naprawdę się nie zmienia. Zmienia się jedynie miejsce budowania. App Bundle w praktyce jest nowym formatem dodawania aplikacji do Google Play. Przerzucamy część naszej pracy na Google — zamiast ręcznie budować i generować pliki, wrzucamy zasoby (pliki interfejsu, kod aplikacji, biblioteki natywne) wymagane dla wszystkich typów urządzeń w formie specjalnej paczki. Następnie to Google tworzy z takich danych różne wersje plików APK. Dzięki takiemu podejściu mamy pewność, że utworzone przez Google pliki będą zawierały tylko niezbędne rzeczy dla każdego z telefonów. Pewnie teraz zastanawiacie się, jak to wygląda w przypadku budowania aplikacji lokalnie i uruchamiania jej na urządzeniu podłączonym do komputera. Tutaj mamy dwie opcje: możemy zbudować aplikację starą metodą lub możemy wygenerować App Bundle i następnie używając narzędzia Bundletool wygenerować plik APK z naszej paczki. Dzięki drugiemu podejściu możemy sprawdzić, czy z naszym App Bundle jest wszystko w porządku, zanim wrzucimy go do Google Play. Tak więc widzimy, że App Bundle jest tylko dodatkiem. Jeśli chcemy, możemy nadal korzystać ze starej metody. Mimo wszystko warto zastanowić się nad nowym sposobem dystrybucji, ponieważ przemawia za nim sporo argumentów.

Jak wygląda podpisywanie aplikacji?

W poprzednim odcinku pisałem o tym, jak wygląda podpisywanie plików APK i jakie to niesie ze sobą korzyści. Jak więc wygląda to w przypadku App Bundle? Jakiś czas temu Google udostępniło narzędzie zwane App Signing by Google Play. Już po nazwie możemy domyśleć się, o co chodzi. Podobnie jak w przypadku App Bundle — przerzucamy część pracy na Google, a to oni zajmują się podpisywaniem naszej aplikacji. W praktyce wygląda to tak, że mamy dwie pary kluczy: klucze do podpisywania aplikacji (prywatny i publiczny) oraz klucze do dodawania aplikacji do Google Play (również prywatny i publiczny).

Troszkę zagmatwałem, ale już wyjaśniam, o co chodzi. Klucz do podpisywania aplikacji jest bardzo wrażliwy. Jeśli ktoś go nam wykradnie, może wypuścić nieautoryzowaną wersję naszej aplikacji. Dlatego Google stworzył wspomniany wcześniej serwis. To do niego wrzucamy nasz klucz do podpisywania aplikacji — od teraz jest on zabezpieczony na serwerach Google i nie musimy się nim martwić. Następnie generujemy drugą parę kluczy, które posłużą nam do wrzucania aplikacji. Na powyższym diagramie możecie zobaczyć, jak to wygląda w praktyce. Wysyłamy naszą aplikację lub App Bundle podpisaną kluczem uploadowym, następnie Google weryfikuje czy klucz jest poprawny, a na końcu Google podpisuje naszą aplikację kluczem aplikacji, który jest przechowywany na ich serwerze.

Dynamiczna dystrybucja — co to takiego?

Na początku artykułu pisałem o problemach z udostępnianiem różnych funkcjonalności różnym użytkownikom. Większość problemów można wyeliminować przy pomocy App Bundle. Mamy bowiem dostępne narzędzie do dynamicznego pobierania kodu odpowiedzialnego za daną funkcjonalność. Najlepiej będzie to opisać na przykładzie. Wyobraźmy sobie, że mamy aplikację do tworzenia listy zakupów. W przypadku zakupu konta premium użytkownicy zyskują możliwość skanowania kodów kreskowych produktów i dodawania ich do listy. Kod odpowiedzialny za obsługę aparatu, rozpoznawania i rozkodowywania kodów oraz wyszukiwania produktów jest dość obszerny. Nie ma potrzeby, aby musieli go pobierać również użytkownicy nieposiadający konta premium. Dlatego musimy podzielić aplikację na dwie części — w głównej będziemy mieli funkcjonalności dostępne dla wszystkich użytkowników. Natomiast kod odpowiedzialny za rozpoznawanie produktów będzie wydzielony do osobnego modułu. W przypadku App Bundle w momencie instalacji aplikacji zostanie pobrana tylko podstawowa wersja aplikacji, a funkcjonalność konta premium zostanie pobrana w przypadku wystąpienia takiego zapotrzebowania.

Uzupełnienie wiedzy

W artykule o obsłudze kilku języków pisałem, że aplikacja trzyma wszystkie pliki tłumaczeniowe w pamięci urządzenia i nie trzeba nic pobierać w celu zmiany języka. Pisałem też, że Google pracuje nad tym, aby to zmienić. Pewnie już wiecie, do czego zmierzam. To właśnie App Bundle wprowadza tę zmianę. Zmiana języka jest bardzo rzadkim przypadkiem, więc nie ma potrzeby, aby użytkownicy pobierali wszystkie języki wspierane przez aplikację. Dlatego używając App Bundle w momencie pobierania aplikacji, dostajemy tylko wersję w języku aktualnie ustawionym na urządzeniu. Po zmianie języka w systemie aplikacja pobierze dodatkowe pliki w celu dostosowania interfejsu do nowej konfiguracji. Wydaje się, że to niewielka korzyść, lecz musimy pamiętać, że pliki językowe to nie tylko tekst, czasami aplikacje posiadają różne grafiki w zależności od języka, dlatego gra jest warta świeczki i pozwala oszczędzić sporo miejsca.

Zagrożenia

Ten akapit zakrawa trochę na teorię spiskową, więc to jest dobry moment na założenie foliowych czapeczek. Chodzi o to, że po wprowadzeniu tego rozwiązania nie będziemy już samodzielnie generować produkcyjnych plików APK, a będziemy polegać na Google. Jeśli narzędzie to zostanie zaadaptowane przez większość twórców, Google może zdecydować o zmianie sposobu generowania pliku APK w taki sposób, że tylko ich system będzie w stanie dostosować się do zmian. W ten sposób możemy stracić możliwość dystrybucji aplikacji przez zewnętrzne serwisy takie jak przykładowo APK Mirror. Najprawdopodobniej do takiej sytuacji nigdy nie dojdzie, lecz warto być świadomym zagrożeń. Tym bardziej że nie jest to wyłącznie moja opinia, bo kilkukrotnie spotkałem się z podobnymi głosami.

Korzyści dla użytkowników

Wypada podsumować, co tak właściwie App Bundle zmienia z perspektywy użytkownika. Głównie chodzi o oszczędność pamięci użytkownika oraz transferu danych podczas pobierania aplikacji. Być może dla nas nie ma to jakiegoś szczególnego znaczenia, lecz musimy pamiętać, że Android jest niesamowicie popularny również w krajach znacznie gorzej rozwiniętych pod względem dostępu do internetu niż Polska. Rozwiązanie to na pewno będzie wykorzystywane w aplikacjach dostosowanych do Androida Go.

W ten sposób dotarliśmy do końca dzisiejszego artykułu, przyznam, że był to dość ciężki temat do opisania w lekki sposób, ponieważ jest ściśle powiązany z technicznymi rzeczami. Za tydzień zajmiemy się nieco lżejszymi rzeczami, porozmawiamy sobie o sposobach testowania aplikacji mobilnych. Do zobaczenia!

Zapraszam również na największe w Polsce forum dla programistów Android. Jeśli macie pytania odnośnie do kariery programisty — zapraszam do działu Kariera programowanie. Zachęcam również do przejrzenia działu Praca oraz zlecenia dla programistów — być może to właśnie tam znajdziesz swoją pierwszą pracę.

Poprzednie odcinki:

  1. Typowy dzień pracy programisty
  2. Wady pracy programisty
  3. Zalety pracy programisty
  4. [FAQ] Wszystko, co powinieneś wiedzieć, jeśli interesuje Cię praca programisty
  5. Co mnie zdziwiło w programowaniu?
  6. Motywacje – w jaki sposób nie stracić zapału do programowania?
  7. Jaką firmę wybrać na początku kariery programisty?
  8. Jak wygląda rozmowa o pracę na stanowisko programisty?
  9. Jak zacząć programować?
  10. Skąd czerpać wiedzę o programowaniu?
  11. Początki programowania — jaką technologię wybrać?
  12. Cykl życia aplikacji na Androida — co to takiego?
  13. Jak tworzymy interfejs użytkownika w aplikacjach na Androida?
  14. Jak system Android oszczędza energię?
  15. Jak działają i czym są powiadomienia push w Androidzie?
  16. W jaki sposób aplikacje pobierają dane z zewnętrznych serwisów i czym jest API?
  17. Jak działają pozwolenia w systemie Android?
  18. Śledzenie użytkowników — co wiedzą o nas aplikacje?
  19. Dlaczego aplikacje na Androida zajmują coraz więcej miejsca?
  20. Frameworki crossplatform – jak stworzyć aplikację na iOS i Androida jednocześnie?
  21. Jak obsłużyć kilka języków w aplikacji na Androida?
  22. Dodatkowe funkcjonalności Androida, których nikt nie wspiera
  23. Co się dzieje podczas kompilacji aplikacji na Androida?


  • Martina Neumayer

    A widziałam to ostatnio w praniu. LocalCast w najnowszej wersji full składa się właśnie z trzech osobnych paczek. Trochę to może być upierdliwe w momencie chęci instalacji ich spoza sklepu guglowego, np. przez sideload. Można to zrobić poprzez adb, ale tu znów jest nieco poleceń do wklepania. Ale zaczynają się już także i całe szczęście, pojawiać specjalne installery do tego typu apek złożonych z kilku plików apk.
    Pomysł w sumie jest dobry, bo faktycznie chwilami waga programiku mocno spada. Minusem faktycznie może być i to dość sporym opisywana kwestia z kluczami. Jeśli guglowi coś odbije i np. twórca straci swoje konto developerskie, w tym momencie jest doopka zbita, bo nawet gdy odzyska je jakimś cudem, to nie odzyska już owych kluczy, które leżą sobie po stronie serwerów guglowych. One pójdą się paść na zieloną łączkę. Czyli.. sytuacja będzie taka, że aplikację trzeba będzie publikować na nowo, co się wiąże z utratą tych wszystkich ocen, rekomendacji oraz całej reszty, jaką się miało w dotychczasowej wersji w guglo sklepie. Innymi słowy taki ludek zaczyna wsio od początku ze swoim programikiem, czy też gierką.

    • Paweł Dedio

      Moim zdaniem najrozsądniejszym wyjściem jest stworzenie swojego klucza lokalnie i dopiero wgranie go na serwery Google. Wtedy w razie utraty konta mamy również jego kopię lokalną.

      • Martina Neumayer

        Tak, tyle że znów w tym momencie kłopot jest po stronie gugla, bo oni będą mieli klucz owszem, ale z poprzednio wygenerowanymi sygnami, a nowe załadowanie zmieni owe sygny tego samego klucza na inne. I tu będzie niezgodność.
        Gugiel musiałby developerowi dać jakąś możliwość powiedzmy dowolnego, ręcznego przypisania danych sygn do danego klucza. Wtedy okay, to by przeszło.
        Ale coś mi się nie widzi, że zrobią coś takiego. Raczej znów będą utyskiwać i tłumaczyć się, że to może zmniejszyć poziom bezpieczeństwa i inne takie. Wiadomo, jak oni ostatnio wszystko ładnie tłumaczą 😉