APK APK
D A L V I K (maszyna wirtualna)
Prog & lib ||| android Progs
L I N U X
H A R D W A R E
etapy kompilacji C/C++
Prekompilacja - Tworzenie ostatecznego kodu źródłowego programu przez włączenie plików wskazanych dyrektywą #include. Wykonywnanie makroinstrukcji #define i usuwa komentarze.
Kompilacja do poziomu assemblera - Przeszukuje kod stworzony przez prekompilację i wyszukuje tokeny czyli słowa kluczowe, operatory i przekształce ja na wewnętrzną reprezentację która jest przekształcana na kod assemblera.
Optymalizacja kodu assemblera - zmiana kodu w celu zwiększenia jego wydajności. Modyfikacja polega na zmianie obliczania adresów względnych, elminowaniu nieużywanych fragmentów kodu, optymalizacja przydziału rejestrów oraz zmiana lokalnych odwołań by używany był wskaźnik do stosu.
Assemblacja - przetworzenie kodu na kod w języku maszynowym. Instrukcję w tym kodzie nie odnoszą się jeszcze do konkretnych adresów pamięci.
Konsolidacja - ma na celu stworzenie bliku binarnego z kodem wykonywalnym. Przeszukuje i dołącza do programu wskazane biblioteki. Przypisuje kod maszynowy do ustalonych adresów. (Przydział
zmiennym globalnym adresów tak by można było się odwołać do ich wartości). Utworzony plik wykonywalny jest w formacie Executable and Linking Format.
cross kompilacja
kompilacja pod inna architekture niz procesor na ktorym pracujesz. np kompilacja curl pod arm v6
wykonuje sie poprzez ./configure --target= architektura
co w sdk i ndk?
SDK (Source Development Kit) to zestaw bibliotek oraz kompilatorów umożliwiających kompilację i budowanie pakietów Apk – aplikacji uruchamianych na urządzeniu przez użytkownika. Pakiet dostarcza też narzędzie adb, dzięki któremu jest możliwość wgrywania pakietów do urządzenia oraz zarządzania nim. Wraz z SDK dołączony jest emulator systemu Android, za pomocą którego można przetestować napisane aplikacje bez ryzyka uszkodzenia urządzenia.
NDK (Native Development Kit) pozwala tworzyć aplikacje w językach C/C++, które można uruchomić jako proces systemu Linux, bez konieczności uruchamiania ich wewnątrz Dalvik'a. Rozwój takich aplikacji daje dostęp do składników systemu, jednak może okazać się dużo bardziej niebezpieczny niż standardowe aplikacje pisane jako paczki APK.
przygotowanie srodowiska do pisania na androida:
dodanie do .bashrc zmiennych
PATH=$PATH:[katalog
instalacji]/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin PATH=$PATH:[katalog instalacji]/android-sdk-linux/tools
Pierwszym krokiem, który należy wykonać w celu skonfigurowania NDK jest
ustawienie odpowiednich zmiennych środowiskowych:
export SYSROOT=home/android/android-ndk-
<wersja>
/platforms/android-8/arch-arm/
export PATH=$PATH:/home/android/android-ndk-
<wersja>
/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-
x86/bin/
Zmienna środowiskowa
SYSROOT
będzie wskazywać kompilatorowi GCC gdzie ma szukać
katalogów z bibliotekami oraz plikami nagłówkowymi dla kompilowanych i linkowanych
programów. W ćwiczeniu wykonywana będzie tzw. skrośna kompilacja (cross compilation), czyli kompilacja programu pod inną architekturę niż ta na której wykonywany jest cały proces. W związku z tym należy wskazać kompilatorowi gdzie ma szukać powyższych
plików. Dodatkowo należy dodać do zmiennej
PATH
ścieżkę do katalogu z kompilatorem z
pakietu NDK.
proces uruchamiania systemu linux
podstawowe potrzebne rzeczy: bootloader i plik z obrazem jądra. bootloader jest ładowany przez BIOS(oczywiście dopiero po wykonaniu POST i wszystkich swoich operacji(procedur startowych).
standardowo powinien on byc w pierwszym sektorze dysku. bootloader ładuje obraz jądra systemu do pamięci RAM, który zawiera podstawowe funkcje niezbędne do działania systemu operacyjnego. po jego uruchomieniu rozpoczyna się proces włączania systemu operacyjnego. aby można było uruchomić system na dowolny sprzecie, potrzebne sa sterowniki, ktore nie trzyma sie jednak w jadrze, tylko w osobnym pliku initrd, aby nie rozszerzac niepotrzebnie wielkosci pliku jadra.
initrd - przygotowanie wlasnego obrazu:
kopiujemy jakis istniejacy initrd, rozpakowujemy go. dodajemy do niego biblioteki curl i sam program curl, po czym ponownie spakowac i skompresowac wszystkie pliki. tak dostaniemy plik initrd dla uruchomienia dla androida.