Build Sistemi

Android build sistemi, açık kaynak dünyasında kendisinden önceki projelerden önemli farklılıklar içermektedir. İyi ve kötü yanlarını bir kenara bırakıp bu sistemin genel olarak öğrenilmesinde fayda vardır.

Build süreci geleneksel make uygulaması ile çalışır. Bu yönüyle bir benzerlik taşıdığı düşünülebilirse de, esasen tek benzerlik bundan ibaret olup, make sistematiği alışılagelmişin dışında kullanılır.

Açık kaynak dünyasında bu denli büyük projelerde genellikle en üst dizinde bir ana Makefile bulunur. Build sürecinin bileşenlerinin seçimi ve diğer özelleştirmeler, ana dizinde yer alan bir konfigürasyon dosyasında tutulur (.config). Konfigürasyon dosyasının üretimi görece uzun ve detaylı bir işlem olduğundan, bu süreci kolaylaştıracak çeşitli araçlar sunulur (menuconfig, xconfig, sistem içi yardım vb.). Ana dizindeki Makefile, .config dosyasını işler, alt dizinleri recursive olarak dolaşır ve yapılan seçimler doğrultusunda alt dizinlerde yer alan Makefile dosyalarını da make ile işler.

Android build sisteminde ise ana dizinde genel bir Makefile ve konfigürasyon dosyası bulunmaz. Alt dizinler dolaşılıp her birindeki Makefile dosyaları üzerinden make de işletilmeye çalışılmaz. Bunun yerine, dizin ve alt dizinlerde, Android.mk dosyası aranır. Bu make uygulaması için hazırlanmış bir Makefile dosyasıdır. Eğer bir dizinde Android.mk bulunur ise make ile işlenir ve bu noktadan sonra, dosyanın bulunduğu dizinin alt dizinlerinde arama işlemi devam etmez. Yani Android.mk bulunduğunda, daha derinlerdeki dizinlere inilmez. Bir üst seviyedeki dizinlerin aranmasına ve oralarda bulunan Android.mk dosyalarının aynı şekilde işlenmesine devam edilir.

Konfigürasyon

Build işlemine başlarken öncelikle envsetup.sh betiği çalışılan kabuk içerisinde işletilir:

$ source build/envsetup.sh

Daha sonra lunch komutuyla üretilecek hedef imaja ait parametreler belirtilir. Girilecek parametrenin formatı BUILD-BUILDTYPE şeklinde olup aşağıdaki tabloya göre belirlenebilir:

Build İsmi Cihaz Açıklama
aosp_arm ARM emülator Tüm uygulamalar, diller ve giriş yöntemleri aktif bir imaj
aosp_maguro maguro Galaxy Nexus GSM/HSPA+ ("maguro") imajı
aosp_panda panda PandaBoard üzerinde çalışacak imaj

Build tipleri ise aşağıdakilerden biri olabilir:

Build Tipi Kullanım Amacı
user Nihai ürün kullanımına uygun, kısıtlı erişim
userdebug Root erişimin ve debug imkanın eklendiği "user" tipi
eng Ek debug araçlarıyla zenginleştirilmiş geliştiricilere yönelik

Şimdi geliştiricilere yönelik ARM emülatorü üzerinde çalışacak imajımızı üretmeye başlayalım:

$ lunch aosp_arm-eng

Yukarıdaki komutun çalışması bittiğinde, ayarlanan değişkenlerle ilgili aşağıdaki gibi bir çıktı verilecektir:

PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.0.50.50.50.50
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.16.0-4-amd64-x86_64-with-debian-jessie-sid
HOST_BUILD_TYPE=release
BUILD_ID=AOSP
OUT_DIR=out

Not: Herhangi bir parametre verilmediğinde lunch uygulaması seçim yapabilmemiz için bizi yönlendirecektir.

Derleme

Derleme süreci oldukça fazla zaman alacaktır. Bu nedenle ccache gibi bir compiler cache sistemi kullanılmasında fayda vardır.

Bunun için USE_CCACHE ortam değişkeninin değerini 1 olarak atamalıyız:

$ export USE_CCACHE=1

Bu işlemin kalıcı olması için ~/.bashrc dosyasının sonuna yazabilirsiniz.

Not: ccache öntanımlı olarak ~/.ccache dizinini kullanacaktır. Farklı bir dizin kullanmak istiyorsanız (ortak bir dizin de olabilir) CCACHE_DIR ortam değişkenini de benzer şekilde tanımlamanız yeterlidir.

Sonrasında bir defaya mahsus, ccache için kullanılacak maksimum disk alanını limitleyebiliriz:

$ prebuilts/misc/linux-x86/ccache/ccache -M 50G
  Set cache size limit to 50.0 Gbytes

Derleme sürecinde GNU make'in -j parametresiyle paralel derleme yeteneklerinden mutlaka faydalanılmalıdır. Genel bir kural olarak CPU core sayısının 2 katı olacak şekilde bir değer verilmesi önerilir. Örneğin 4 core'lu bir sistemde, -j 8 parametresinin kullanılması uygun olacaktır.

Derleme işlemi, standart make komutuyla aşağıdaki gibi başlatılır:

$ make -j8

results matching ""

    No results matching ""