Co się dzieje podczas kompilacji aplikacji na Androida?

Paweł Dedio Programowanie 2019-01-05

Witajcie w kolejnym odcinku. Dzisiaj będzie nieco bardziej technicznie, chociaż postaram się, aby było ciekawie. Opowiemy sobie o całym procesie kompilacji aplikacji na Androida. Wbrew pozorom nie jest to taki oczywisty temat i wielu, nawet profesjonalnych programistów nie wie do końca, co tam się dzieje. Tak więc rozsiądźcie się wygodnie i lecimy z tematem!

Kompilacja — dlaczego to złe słowo?

Pewnie nieraz spotkałeś się ze słowem kompilacja. Jest to proces, w którym kompilator (taki specjalny program) tłumaczy kod napisany w jednym języku (w przypadku Androida Java lub Kotlin) na kod w zupełnie innym języku (w naszym przypadku kod bajtowy). Jednak to nie jest jedyna czynność, którą należy wykonać, aby z naszego kodu powstał gotowy plik apk. Dlatego lepszym terminem na nazwanie tego procesu jest słowo budowanie — też będziemy używać w tym artykule. Budowanie jest bowiem określeniem opisującym wszystkie czynności, które są wykonywane w celu wygenerowania pliku aplikacji.

 

Gradle — najlepszy przyjaciel każdego programisty na Androida

Do zrozumienia tematu musimy wyjaśnić sobie, czym jest Gradle — termin ten będzie się tu pojawiał bardzo często. Gradle to nic innego jak narzędzie budujące aplikację. W prostych słowach można powiedzieć, że Gradle wykonuje wyznaczone skrypty w odpowiedniej kolejności, uwzględniając podane przez nas parametry. W przypadku Androida, Gradle odpowiada za wszystkie procesy związane z budowaniem: pobiera biblioteki, kompiluje kod, kompiluje zasoby oraz podpisuje aplikację. Jeśli moje wyjaśnienie was nie usatysfakcjonowało do końca, to zachęcam do zajrzenia na oficjalną stronę Gradle. Oczywiście narzędzie to nie jest idealne i często przysparza nam sporo problemów, ale muszę przyznać, że Gradle jest jednym z lepszych produktów w swojej klasie.

 

Jak wygląda proces budowania?

Dla lepszego objaśnienia całego procesu będę posiłkował się diagramem z oficjalnej dokumentacji. Na wstępie musimy sobie powiedzieć, co tak naprawdę wchodzi w skład naszej aplikacji. Na samej górze widzimy dwa duże, szare klocki. Po lewej stronie znajduje się Application Module — są to wszystkie rzeczy napisane przez nas takie, jak kod źródłowy, pliki definiujące interfejs graficzny oraz interfejsy AIDL (za ich pomocą inne aplikacje mogą się odwoływać do naszego kodu). Natomiast Dependencies to nic innego jak wszelakie biblioteki, z jakich korzysta nasz aplikacja.

 

Co się dzieje z naszym kodem?

programista android

Omówiliśmy sobie, co wchodzi w skład naszej aplikacji, a teraz dowiemy się, co się dzieje z naszym kodem. Zarówno nasz kod, jak i biblioteki zewnętrzne trafiają do kompilatora i zostają spakowane do plików z rozszerzeniem dex (mogliście je zobaczyć w odcinku o rozmiarze aplikacji). Jednak nasz projekt to nie tylko kod źródłowy — oprócz niego mamy też sporo innych zasobów, na przykład obrazki, pliki definiujące widoki i ogólnie wszystko, co jest związane z interfejsem użytkownika. Wszystko to również zostaje skompilowane i trafia do różnych plików czytelnych dla systemu Android.

 

Kilka słów o podpisach

Aby przejść dalej, musimy wyjaśnić sobie kilka kwestii dotyczących podpisywanie aplikacji. Oczywiście nie mam tu na myśli słynnych podpisów, takich jak podpis jednego kibica Legii na dowodzie osobistym :). Chodzi tutaj o podpisy cyfrowe. Co to właściwie jest? Aby dobrze to zrozumieć, musielibyśmy sobie wyjaśnić, jak działają algorytmy szyfrowania asymetrycznego, jednak nie chciałbym Was tym zanudzać. Najprościej rzecz ujmując, chodzi o to, że mamy dwa klucze, potocznie jeden z nich nazywamy kluczem prywatnym, a drugi kluczem publicznym. Algorytm działa na tej zasadzie, że jeśli zaszyfrujemy wiadomość jednym z kluczy, to możemy ją odszyfrować, używając tylko i wyłącznie drugiego klucza. Tak, więc jeśli podpiszemy naszą aplikację przy użyciu naszego klucza prywatnego, inni mogą ją bez problemu zweryfikować, korzystając z klucza publicznego. Tym samym mogą sprawdzić też, czy aplikacja została podpisana przez odpowiednią osobę (kogoś, kto posiada klucz prywatny). Klucz prywatny jest bardzo ważny i należy go uważnie pilnować, ponieważ Google Play nie pozwoli nam na wgranie aktualizacji naszej aplikacji, jeśli nie zostanie ona podpisana dokładnie tym samym kluczem, którym została podpisana jej poprzednia wersja.

 

Jak powstaje plik APK?

Po poznaniu nieco informacji o podpisach cyfrowych możemy przejść dalej. Kolejnym krokiem na naszym diagramie jest coś o nazwie APK Packager. Jest to nic innego jak narzędzie, które pakuje nasze pliki dex, skompilowane zasoby oraz biblioteki natywne do gotowego pliku o dobrze znanym nam rozszerzeniu apk. Dodatkowo to narzędzie podpisuje naszą aplikację przy użyciu wybranego przez nas klucza (jeśli uruchamiasz aplikację bezpośrednio na telefonie, AndroidStudio automatycznie wybiera Twój klucz deweloperski). Na końcu przy użyciu narzędzia zwanego zipalign optymalizuje pliki w celu zwiększenia wydajności naszej aplikacji. Jest dość skomplikowany proces, możesz przeczytać o nim więcej w oficjalnej dokumentacji. Po tym procesie mamy już gotowy plik apk, który możemy zainstalować na naszym urządzeniu lub dodać do sklepu play.

 

Dodatkowe zadania

To, co opisałem wyżej, to jest maksymalnie podstawowy proces wymagany do zbudowania naszej aplikacji. Istnieje wiele narzędzi, które wykonują dodatkowe zadania podczas procesu budowania, co usprawnia naszą pracę. Jednym z bardziej znanych jest lint — jest on niesamowicie pomocny przy tworzeniu aplikacji na Androida i nie tylko. Narzędzie to analizuje nasz kod w poszukiwaniu miejsc, w których możemy coś usprawnić lub narażamy się na jakieś błędy w czasie wykonywania programu. Przykładowo lint może powiedzieć nam, że w naszym projekcie posiadamy jakieś nieużywane nigdzie grafiki (niepotrzebne marnowanie miejsca) lub odnosimy się do funkcjonalności wprowadzonych w wersji Androida wyższej, niż obsługiwana przez nas wersja minimalna (potencjalne ryzyko błędów aplikacji). Kolejnym procesem jest uruchamianie testów jednostkowych — to coś w rodzaju specjalnego kodu, który testuje nasz normalny kod. Wiem, że trochę zagmatwałem, ale nic się nie martwcie — rozwinę ten temat już niedługo przy okazji odcinka o testowaniu aplikacji.

 

Gdzie budujemy naszą aplikację?

programowanie

To pytanie z pozoru wydaje się proste. Budujemy naszą aplikację na naszym komputerze za każdym razem, jeśli chcemy ją uruchomić na smartfonie. Oczywiście jest to prawda, lecz nie wyczerpuje do końca tematu. Istnieją bowiem zewnętrzne serwisy umożliwiające zdalne budowanie naszej aplikacji. Dlaczego mielibyśmy ich używać? Już wyjaśniam.

Wyobraź sobie, że pracujesz w firmie, w której każda zmiana musi zostać przetestowana przez testera, a raz na dwa tygodnie aktualna wersja aplikacji musi zostać dostarczona do klienta. Robiąc to ręcznie, każdy z programistów musiałby pamiętać o wysłaniu aplikacji do testera po skończeniu pracy nad daną zmianą, a dodatkowo jedna osoba raz na dwa tygodnie musiałaby budować i wysyłać aplikację do klienta. Nie jest to coś niemożliwego do zrobienia, jednak nie ma sensu tracić na to czasu, skoro oprogramowanie może to zrobić za nas. Dzięki takim zewnętrznym serwisom do budowania, możemy zautomatyzować ten proces i automatycznie budować aplikację, sprawdzać jej poprawność a na końcu wysyłać do testerów bądź klienta. Takie serwisy mają również kolejną zaletę, nie są zależne od naszej lokalnej konfiguracji, więc jeśli aplikacja pomyślnie się zbuduje na zewnętrznym serwisie, to możemy być pewni, że zbuduje się na każdym innym komputerze.

 

Dzięki za przeczytanie mojego kolejnego odcinka. Doświadczeni programiści pewnie sobie pomyśleli, że opisałem tylko starą metodę i zapomniałem o App Bundle, które zmienia nieco rzeczy w tym procesie. Już uspokajam, nie zapomniałem, nie chciałem, żeby ten odcinek był zbyt długi i skomplikowany. Dlatego już teraz zapraszam was na kolejny odcinek, w którym opowiem wam, jak Google rewolucjonizuje proces budowania i instalowania aplikacji. Do zobaczenia w przyszłym tygodniu!

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ę.

Dziel się tym co lubisz – ucz programowania

Coders Lab – Szkoła IT rekrutuje wykładowców – podejmij ich wyzwanie i rozwiń się jako programista. Technologie, których możesz uczyć na kursach to Front-end (m.in. JavaScript, React.js), Back-end (Python, PHP, Java, C# (.NET)), User Experience oraz Testowanie: Manualne i Automatyczne. O tym, jakie korzyści płyną z pracy jako wykładowca w Coders Lab – Szkole IT możesz przeczytać tutaj.

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





Przewiń stronę, by przeczytać kolejny wpis
Przewiń stronę, by przeczytać kolejny wpis
x