12 Ağustos 2015 Çarşamba

Kernele Açılış Ekranı Ekleme



Bu konuya başlamadan önce Kaynak Koddan Rom Derleme konusundaki adımları yapmış olmalısınız. Ardından kernel kaynak kodunuzun drivers/video/logo dizinine gidin. Alttakine benzer bir ekran göreceksiniz.


“logo_linux_clut224.ppm” isimli dosyayı bulun ve adını değiştirin. Ekran çözünürlüğünüze uygun olan bir resmi GIMP ile açın. Bu örnekteki cihaz Galaxy Young(240x320) olduğu için resimde ona uygun olarak alınmıştır.


Gimp menüsünde image > mode > indexed seçeneğini seçin. maximum numbers of color(renk skalası) bölümünü 224 yapın.


Şimdi ayarladığınız görseli kaydederken *.pnm uzantısını seçin fakat görsel ismini “logo_linux_clut224.ppm” olarak değiştirin ve kaydedileceği dizini drivers/video/logo olarak ayarlayın.


Select File Type kısmına tıklayıp ASCII formatını seçip, kaydedin. Görselimiz artık hazır.

Bir ucbirim(terminal) açın ve kernel kaynak kodunuzun bulunduğu dizine gidin. İlk defa kernel derleyecekseniz :


Kod:
make defconfig
make menuconfig

Eğer daha önce derleme yaptıysanız : 

Kod:
make menuconfig

menuconfig aşağıdaki gibi görünecektir.



device drivers > graphics support  menüsünde bootup logo[*] menüsünün yanındaki kutuya boşluk tuşuyla işaretleyin ve enterlayın. Menü alttaki gibi görünecektir.


Resimdede görüldüğü gibi Standart 224-color Linux logo seçeneğini işaretleyip, çıkın. Kerneliniz derlemeye hazır.
Devamını Oku »

GitHub Kullanımı (Ucbirim ve Web)


Git Nedir?

Proje geliştirirken, kodlarımızı bir klasörde yedekliyoruz. Ancak yedekler çoğaldıkça hem yedekler karışmaya başlıyor hem de alanımız azalıyor. Bu problemleri çözmeye yarayan yardımcı programlar var. Bunlar bizim çalışmalarımızın yedeğini bizim yerimize alarak hem yerden, zamandan hem de kargaşadan tasarruf etmemizi sağlıyor. Bu araçlara sürüm kontrol sistemleri ya da versiyon kontrol sistemleri deniyor.

Projemiz ya da herhangi bir klasör üzerinde yapılan değişiklikleri zamanları, kullanıcı bilgisi, versiyon numarası gibi bilgilerle birlikte tutuyorlar.

Projenin yayına çıkacak kısmının beklemesini istiyorsak ve üzerinde de bir şeyler denemek istiyorsak o zaman çalışan kopyamız belli bir bölümlemeyle (branching) ayrılarak diğer kopyalar üzerinde rahatça çalışmamız sağlanıyor.İstersek bu kopyayı çalışabilir durumdaki kopya ile birleştirebiliyoruz.

Grup halinde çalışmalarda herkesin yaptığı değişiklikleri görebiliyoruz.

Git dağıtık bir yapı kullanıyor.Diğer versiyon kontrol sistemleri merkezi bir yapı kullanırken ve bu yapıya sürekli bağlı olmak gerekirken git’te her kullanıcıda bütün bir kopya mevcuttur ve internet olmayan ortamlarda dahi proje geliştirilmeye devam edilebiliyor.

Git gerçekten çok hızlı

Git kaynak depoları disk üzerinde çok az yer kaplıyor.

Git ile bölümleme(branching) ve birleştirme(merging) işlemleri kolay ve hızlı

Git çevrimdışı(offline) olarak kullanılabiliyor.

Git dağıtık (distributed) olduğu için her bir geliştiricinin makinesinde proje bütün geçmişi ile birlikte tutulabiliyor. İlk başta bunun işlemleri yavaşlattığı ve disk israfı olduğu düşünülebilir. Fakat git'in oldukça etkin algoritmalar kullanması sayesinde bu sorunlar hiç yaşanmıyor.

Git Kurulumu
Git kurulum paketi Ubuntu depolarında mevcut.Alttaki kodla bu depolardan paketi kuruyoruz.

Kod:
sudo apt-get install git-core
Paketi kurduktan sonra git yapılandırmasına geçiyoruz.

GitHub · Build software better, together. sitesinde bir hesap açıyoruz. Aşağıdaki bölümleri hesabınıza göre doldurun.

Kod:
git config --global user.name “Kullanıcı-adı”
git config --global user.email “email-adresi”
Bilgisayarımız ve Github arasında güvenli bir bağlantı sağlayabilmek için ssh-key kullanmalıyız. ssh-key Github'a bağlanırken herseferinde parola girmemek için kullanılır. Bunun için bilgisayarımızda ssh-key oluşturmamız gerek.Önce var olan bir key var mı diye bakalım.

Kod:
cd ~/.ssh
ls # config id_rsa id_rsa.pub known_hosts
Daha önce oluşturulmuş bir key'imiz varsa onu silip yeni oluşturabiliriz.

Kod:
mkdir key_backup
cp id_rsa*
rm id_rsa*
Yeni bir ssh key oluşturmak için :

Kod:
ssh-key gen

Karşımıza yukarıdaki kısım geliyor ve onu enter ile geçiyoruz...

Kod:
Enter passphrase (empty for no passphrase): Parola-yazın
Enter same passphrase again: Parolayı-tekrar-yazın
Burada ise bizden, ssh-key oluşturmak için(belli bir algoritma ile oluşturulur) anahtar bir kelime yazmamız isteniyor. İstediğiniz bir kelimeyi yazın ama unutmayın yazdığınız şeyi.

Buna benzer bir ekran çıktısı aldıysak işlemi doğru tamamlamışız demektir.
  • Şimdi ~/.ssh/id_rsa.pub ' da oluşmuş olan ssh-key 'imizi github'a eklememiz gerekli.
  • Önce Home/.ssh dizinindeki id_rsa.pub dosyasını açıp içindeki tüm satırları kopyalıyoruz. Github'ta settings'te sol taraftaki SSH key bölümüne girip oraya add SSH key butonuna tıklıyoruz. SSH keyimixe bir isim verip kopyaladığımız koduda alt kutucuğa ekliyoruz. Add key butonuna basarak keyimizi ekliyoruz.


Bilgisayar ile Github arasında bağlantıyı kurmak için alttaki kodu giriyoruz.

Kod:
ssh -T git@github.com

Yukardaki soruya "yes" diyip geçiyoruz. Önünüze gelen parola ekranına anahtar oluştururken kullandığınız parolayı yazıp onaylayın.

Böylece bağlantıyı kurmuş olduk.


Git Kullanımı

Fork(Ayırma) İşlemi

https://github.com/CyanogenMod/android_packages_apps_Settings

Yukardaki linki tıklayın ve açılan sayfada Fork butonuna basın.


Böylece zahmetsizce paketi kendi hesabımıza kopyalamış olduk.

Dosya Çekme
Git üç ağaç kolu şeklinde çalışıyor diyebiliriz.İlk kısım çalıştığımız dizin,ikinci kısım yereldeki depomuz,diğer kısım ise uzak depodur.Şimdi clone komutu ile uzaktaki projeyi çekeceğiz. Kod alttaki gibi olacak.

Kod:
git clone uzak_sunucu_adresi -b bölüm

Örnek:
Mesela kendi hesabınıza forkladığınız dosyayı bilgisayara çekin. Bağlantının sonundaki -b kodu branch'ın kısaltmasıdır. Branch bölüm manasına gelir her deponun birden fazla bölümü olabilir. Bu bölümlerden hangisini indirmek istediğimizi -b komutuyla belirliyoruz.


Kod:
git clone git://github.com/eagleeyetom/android_packages_apps_Settings.git -b gingerbread

Proje tüm değişiklikleri ile artık bilgisayarımızda.




Bölümler (Branches)

Git'te default olarak master bölümü gelir.İstersek başka bölümler oluşturabiliriz ve silebiliriz.



Kod:
#Bölüm listesi
git branch

# Yeni bölüm oluşturmamızı sağlar.
git branch yeni_bölüm_ismi

# İstediğimiz bölüme geçmemizi sağlar.
git checkout bölüm_ismi

# Bölüm siler.
git branch -D bölüm_adı

Örnek olarak bilgisayara indirdiğimiz paket üzerinde işlem yapalım. Önce paketin içinde dosya silip ekleyelim. 
Paketin olduğu dosya dizinine gidip alttaki kodlarla yeni bölüm açıp o bölüme geçelim.


Kod:
git branch deneme
git checkout deneme

Alttaki kodla neler olduğuna bakalım.


Kod:
git status


Gördüğünüz gibi bilgisayardaki ve githubdaki paketler karşılaştırılıp yapılan değişiklikler gösteriliyor.

Birden fazla bölümümüz varken iki bölümdeki değişiklikleri birleştirmek için merge komutunu kullanıyoruz.



Kod:
git merge bölüm_adı

Bu komut ile bulunduğumuz branch, burada ismini verdiğimiz branch ile birleşmiş oluyor. Merge işlemi iki farklı geliştirici ortak değişiklikleri düzenlemiş ise çakışmalara yol açabilir.Buna dikkat etmek gerekir. Değişiklikleri birleştirmeden önce, önizleme yapmak için;

Kod:
git diff kaynak_bölüm hedef_bölüm
Dosya Oluşturma ve Depoya Dosya Ekleme

Yeni dosya oluşturmak için;

Kod:
vim dosya-adı


Projemize ilk düzenlemeyi yapalım:

Öncelikle depoya eklemek istediğimiz veya daha önce eklenmiş,değişiklik yapılmış dosyayı index(hazırlık alanı) denilen git geçici alanına eklemeliyiz.

Kod:
#Hazırlık alanına dosya ekle
git add dosya_ismi

# Bütün değişen ve yeni dosyaları hazırlık alanına ekle
git add .

# değişiklik olmuş veya silinmiş dosyaları hazırlık alanına ekle
git add -u
Şimdi bu dosyanın geçici alandan alınıp uzak sunucuya gönderilebilmesi için alttaki kodun yazılması gerekli.

Kod:
git commit -m"commitin içeriğini anlatan mesajımız"

Böylece dosyamız uzak sunucuya atıldı.Ancak henüz değişiklik uygulanmadı.Değişikliklerin uygulanabilmesi için alttaki kod ile değişikliğin hangi bölümde yapılacağını göstermemiz lazım:

    Kod:
    git push

    Hata alırsanız:

    Kod:
    git push uzak_sunucu_adresi bölüm-adı


    Örnek:
    Kod:
    git push git@github.com:eagleeyetom/android_packages_apps_Settings.git xda


    Bu komut ile beraber yaptığımız değişiklikler uzak depoya gönderilmiş oldu.
    Bu şekilde proje arkadaşlarımızın yaptığı değişiklikleri kendi yerel depomuza çekmek için ise:


    Kod:
    git pull

    Düzenleme geçmişini görmek için alttaki kodu kullanabilirisiniz.

    Kod:
    git log
    Dosya Silme
    Düzenlediğimiz bir dosyayı silmek için :

    Kod:
    git rm dosya_adı git push origin bölüm-adı
    Bu komut ile dosya silinir. Ancak dosyayı geri döndürmek mümkündür ve dosya silindikten sonra düzenleme mesajları tutulmaya devam eder. Dosyayı geri döndürme ise dosyanın loglarının tutuluyor olması ile mümkündür.

    Kod:
    git revert silinen_dosya_log_id
    Son Kayıt İşlemini Değiştirmek
    Eğer kaydı çok erken yapmışsanız, bazı dosyaları eklemeyi unutmuşsanız ya da kayıt mesajında hata yapmışsanız, sık rastlanan düzeltme işlemlerinden birini kullanabilirsiniz. Kaydı değiştirmek isterseniz, commit komutunu --amend seçeneğiyle çalıştırabilirsiniz:

    Kod:
    git commit --amend
    Bu komut, hazırlık alanındaki değişiklikleri alıp bunları kaydı değiştirmek için kullanır. Eğer son kaydınızdan beri hiçbir değişiklik yapmamışsanız o zaman kaydınızın bellek kopyası aynı kalacak ve değiştireceğiniz tek şey kayıt mesajı olacaktır.

    Hazırlanmış Bir Dosyayı Hazırlık Alanından Kaldırma
    benchmarks.rb dosyasını bu öneriye uygun olarak hazırlık alanından(index) kaldıralım:

    Kod:
    $ git reset HEAD benchmarks.rb
    benchmarks.rb: locally modified
    $ git status
    # On branch master
    # Changes to be committed:
    # (use "git reset HEAD <file>..." to unstage)
    # modified: README.txt
    # Changed but not updated:
    # (use "git add <file>..." to update what will be committed)
    # (use "git checkout -- <file>..." to discard changes in working directory)
    # modified: benchmarks.rb
    "benchmarks.rb" dosyası hazırlık alanından kaldırıldı ama hâlâ değişmiş olarak görünüyor.

    Dosya Düzenlemesini(commit) Geri Alma
    Yanlış birşey yapmanız durumunda lokal değişiklikleri geri almak için;

    Kod:
    $ git checkout -- benchmarks.rb
    $ git status
    # On branch master
    # Changes to be committed:
    # (use "git reset HEAD <file>..." to unstage)
    # modified: README.txt
    Gördüğünüz gibi değişiklikler çöpe atıldı. Bunun tehlikeli bir komut olduğunu aklınızdan çıkarmayın. Dosyaya yaptığınız bütün değişiklikler şimdi yok oldu.

    Tüm Kayıttan Bir Dosyayı Kaldırma

    Kod:
    $ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
    Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21)
    Ref 'refs/heads/master' was rewritten
    "passwords.txt" adlı dosyayı tüm geçmişten kaldırmak için filter-branch seçeneği olan "--tree-filter" kullanılabilir.

    Git'de Eski Sürüme Geri Dönme

    Kod:
    $git log
    commit a867b4af366350be2e7c21b8de9cc6504678a61b`
    Author: Me
    Date: Thu Nov 4 18:59: 41 2010 -0400
    
    commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
    Author: Me
    Date: Thu Nov 4 05:13: 39 2010 -0400
    
    commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
    Author: Me
    Date: Thu Nov 4 00:55:06 2010 -0400
    
    commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
    Author: Me
    Date: Wed Nov 3 23:56:08 2010 -0400
    Bu çıktıları gördükten sonra biz "Nov 3" deki eski sürüme dönmek isteyelim. Yapmamız gereken adımlar şunlardır:

    Kod:
    git checkout 0d1d7fc32
    ya da eğer geri döndüğümüzde düzenleme yapmak istiyorsak, oraya gidip yeni bir bölüm oluşturmamız gerekir ki bunun için gereken komut:

    Kod:
    git checkout -b old-state 0d1d7fc32
    Öte yandan, eğer o zamana kadar yaptığımız her şeyden kurtulmak istiyorsak iki olasılık vardır. Birincisi; eğer henüz düzenleme yayınlamadıysak, sıfırlamak basitçe:

    Kod:
    #Bu yerel değişiklikleri yok eder
    #Saklamak isteyip düzenleme yapmadığımız iş varsa yapmayınız
    $ git reset --hard 0d1d7fc32
    #Alternatif olarak işi saklı tutmak için
    $ git stash
    $ git reset --hard 0d1d7fc32
    $ git stash pop
    #Bu değişiklikleri kaydeder, o halde sıfırlandıktan sonraki parçayı yeniden uygular
    #Eğer bir şeyler değiştiyse çakışmaları birleştirebilirsin.
    Öte yandan, eğer çalışma yayımlandıysa, dalın sıfırlanmasını istemezsin. Bu durumda gerçekte de düzenlemeyi eski haline döndürebilirsin. Git ile, geri dönme işleminin(revert) çok özel bir anlamı vardır: bu durumu dengelemek için ters bir düzeltmeyle yeni bir commit oluşturun. Bu şekilde yeniden bir tarih yazmamış oluruz.

    Kod:
    #3 tane geri dönüş düzenlemesini oluştururuz
    $ git revert 0766c053 25eee4ca a867b4af
    
    # geri dönüş düzenlemelerinden birine geçiş yapmamızı sağlar
    $ git checkout 0d1d7fc32
    
    #en sonda da ne yaptığınızı en iyi şekilde açıklayan bir mesaj yazınız
    $ git commit
    Devamını Oku »

    9 Ağustos 2015 Pazar

    Android Kaynak Kodunu Anlamak




    Android Kaynak Kod Dosyalarını Tanıma



    Bu CM11 için oluşturulmuş bir dosyadır.
    Alfabetik sırayla tanıtmak gerekirse;

    1. abi - Bu klasörün içinde cpp adında birçok yerle bağlantılı pek çok C ++ dosyaları içeren bir alt klasör bulunur.

    2. android - Alttaki kodu hatırladınız mı?
    Kod:
    repo init -u git://github.com/CyanogenMod/android.git
    Bu kodla indirdiğiniz şey aslında bu dosyadır.

    3. art - Belki ART runtime motorunu duymuşsunuzdur :) Google artık Android işletim sisteminde Dalvik runtime yerine bu uygulama motorunu kullanıyor. Eski android sürümlerinde bu dosya yok.

    4. bionic - biyonic başlıca aşağıdaki eklemeler / değişiklikler ile Linux için BSD C kütüphanelerinin portudur :
    - Yerel ayar desteği yok.
    - Geniş karakter desteği yok (ş, ğ, ü, ö vb.).
    - Linux tabanlı küçük uygulamaları.
    - x86, ARM ve ARM mimarisi CPU komut setleri ve çekirdek arabirimleri için destek.

    5. bootable - Önyükleyici (boot) ve başlatma ile ilgili kodlar bulunur.

    6. build - Alttaki kodu hatırlarsak;

    Kod:
    . build/envsetup.sh
    Sistem derleme işleminin ana girdileri bu klasörün içindeki envsetup.sh dosyasında bulunuyor. Yukarıdaki kod Derleme işleminden önce gerekli olan şeylerin kullanılabilirliğini kontrol eder. Ayrıca cihaz kaynak kodlarınında kurulumunu gerçekleştirir. yani lunch komutu verdiğinizde önünüze gelen listeyide hazırlar.

    7. cts - Derlemenin Android şartnamesiyle uyumluluğunu kontrol eder.

    8. Dalvik - Dalvik runtime motorudur. Android uygulamaları bu motor üzerinde çalışır.

    art ve dalvik dosyalarının içeriklerine bakın. Aralarındaki fark ise Dalvik hızlı kurulum yapar fakat dosyaları derlemediği için her uygulama açılışında uygulamanın derlenmesini beklersiniz. ART ise kurulumda derleme yaptığı için kurulumu daha uzun sürer fakat uygulama açılışları daha hızlıdır.

    ART


    Dalvik


    9. Development - Bu klasörde derlemeden sonra roma eklenmeyecek uygulamalar bulunur.

    10. Device - Bu dosya pek çok cihazın yapılandırma dosyalarını içerir.

    Bu klasör içindeki dosyalara gelecek olursak;

    common - Bu klasörde gps bilgileri ve cihazınınzdaan cihazınızın yapılandırma kodlarını çıkaracak bir dosya bulunur. (Cihaz kaynak kodlarına ve xm.mk dosyasına bakarak aralarındaki ilişkiyi görebilirsiniz. Şöyle bir şey göreceksiniz.)

    Kod:
    # GSM bileşenlerini içerir
    $(call inherit-product, vendor/cm/config/gsm.mk)
    -and-
    # GPS bileşenlerini içerir
    $(call inherit-product, device/common/gps/gps_eu_supl.mk)
    generic - Bu dizin "goldfish" olarak adlandırılan genel aygıt yapılandırmasını içerir. Bu emülatör oluştururken kullanılan cihaz sınıflandırmasıdır.

    Google - Bu klasör Android Accessories Kit kodlarını içerir.

    sample - Bu klasör Android fremework değiştirmeden kendi Android platformu paylaşılan kütüphanelerinizi yazmanız için örnek içerir.Bu örnek içinde de görüldüğü gibi özel kütüphanelere ihtiyaç duyan cihazlar için açık kaynak kodlar üzerinde çalışanlar içindir.

    11. docs - source.android.com alt klasörünü içerir. Android Açık Kaynak Projesi(AOSP) ile ilgili anlatımlar, referanslar ve çeşitli bilgiler içerir.

    12. external - Bu dizin tüm harici açık kaynak projeleri için kaynak kod içerir. (SQLite, Freetype, webkit ve webview gibi.)

    13. frameworks - Framework kodlarını içerir. Burada sistemin ana uygulamaları bulunur ve java uygulama API'leri ve yerli kütüphaneler arasındaki eşleme yapılır.

    14. hardware - Android hardware abstraction layer (Android donanım soyutlama katmanı) ile ilgili kaynak kodları içerir. Bu klasör ayrıca Radio Interface Layer [RIL-modem ile iletişim kurmak için] (Radyo Arayüz Katmanı) içerir.

    15. kernel - Kernel kaynak kodlarını içerir.

    16. libcore - İçindeki önemli dosyalar;

    • dalvik - DalvikVM runtime
    • dom - DOM için Java kütüphane testleri
    • expectations - Test bilgilerini içerir.
    • include - Bazı izi ve dize işleme için kullanılan C/C++ dosyaları içerir
    • json - JSON tabanlı Java uygulamaları
    • luni - *.jar ve *.dex dosyalarının yüklenmesi için kaynak kod testleri içerir.
    • support - Dalvik testleri için desteklenen kütüphane dosyalarını içerir.
    • xml - XML alma ve koyma uygulaması
    17. libnativehelper

    18. ndk - Derleme dosyaları ve NDK derlemesi için yardımcı dosyalar.

    19. out - Derlenen romun oluştuğu dizin.

    20. packages - Android uygulamalarının bulunduğu dizin. (SMS, kamera, kişiler vb.)

    21. pdk - Açılımı Platform Development Kit. PDK Google'ın donanım üreticilerine(OEM) gönderdiği ve bunun üzerinde kendi düzenlemelerini yapabildikleri bir araçtır.

    22. prebuilt - Kolaylık sağlamak için dijital formda dağıtılan dosyaları içerir. Örnek olarak farklı geliştirme makineleri için çapraz derleme araçlarını içerir.

    23. sdk - Roma dahil edilmeyen pek çok uygulama içerir bunlar geliştiriciler için çeşitli analiz programaları ve daha farklı programlar olabilir.

    24. system - Android sistem çekirdeği için kaynak kodlar içerir. Bu Androidin linuz çekirdeğidir. yani Dalvik Virtual Machine(Dalvik Sanal Makinesi) ve Java tabanki hizmetlerin altında çalışan bölüm. Sitemi başlatan bölüm ve platformunun dinamik konfigürasyonunu sağlayan init.rc komut dosyası bunun içindedir.

    25. tools - Derlemeye yardımcı oran yan araçlar bulunur.

    26. vendor - Bu dizin cihaz üreticilerinin özel kütüphanelerini içerir. Derleme sırasında kullanılan kapalı kaynak kodları bulunur.

    .repo - Bu dosya gizlidir.(Ctrl+H ile görebilirsiniz.) içinde repo aracı ve kaynak kodunuzun indirme bağlantıları bulunur. Ayrıca içine sizin eklediğiniz cihaz kaynak kodlarını da içerir.

    Android Yapılandırma Dosyası [Makefile] (Android.mk)

    Eğer Android kaynak kodlarını incelediyseniz Android.mk dosyasını görmüşsünüzdür. Bu dosya kaynak kodun nasıl derleneceğini belirler. Bu dosya içinde yapılacak derlemeye isim verilebilir(LOCAL_MODULE :=), yerel değişkenler temizlenebilir(include $(CLEAR_VARS)), derlenecek dosyaları ekleyebilir(LOCAL_SRC_FILES := main.c), derleme için etiket tanımlayabilir(LOCAL_MODULE_TAGS := eng development), eklenecek kütüphaneler varsa bunlar tanımlanabilir(LOCAL_SHARED_LIBRARIES := cutils) ve daha pek çok işlem yaptırabilirsiniz.

    Örnek olarak aşağıda bir APK dosyası derlemek için hazırlanmış android.mk içeriği göreceksiniz. # bu işaretle yazılanlar altındaki kodun açıklamasıdır.

    Kod:
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    # java alt klasöründeki java dosyalarını derler
    LOCAL_SRC_FILES := $(call all-subdir-java-files)
    # derlenecek APK dosyasının adı
    LOCAL_PACKAGE_NAME := LocalPackage
    # APK derleme komutu
    include $(BUILD_PACKAGE)
    Not: my-dir ve all-subdir-java-files gibi dosya yollarının tanımlamaları build/core/definitions.mk içinde bulunmaktadır.

    Cihaz Kaynak Kodlarını(Device Tree) Anlama

    Android.mk - Bir önceki başlıktada bahsettiğim gibi bu dosya kaynak kodun cihazınıza göre nasıl derleneceğini açıklar.( Kurtarma modu(recovery), sensör, ışıklar, kamera vb.)

    Kod:
    LOCAL_PATH := $(my-dir)
    
    ifeq ($(TARGET_DEVICE),pico)
    include $(call all-makefiles-under,$(LOCAL_PATH))
    endif
    AndroidBoard.mk - Bu dosya kernel imaj dosyası oluşturur. Kernel derleme sırasında üretici kaynak kodlarındaAndroidBoardVendor.mk dosyasını kullanır.

    Kod:
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET)
    
    # açık kaynak olmayan dosyaları belirtir
    -include vendor/uretici/cihazkodadi/AndroidBoardVendor.mk
    AndroidProducts.mk - Derleme için kullanılacak, uygun cihaz yapılandırma dosyalarını(makefile) belirtir. Bu aynı zamanda cihaz özeldir. Mesela Moto G(Cihaz kod adı "falcon") için;

    Kod:
    PRODUCT_MAKEFILES := \
        #derlenecek rom yapılandırma dosyası
        $(LOCAL_DIR)/cm.mk \
        #derlenecek cihaz yapılandırma dosyası
        $(LOCAL_DIR)/falcon.mk
    cihazkodadi.mk - Her android cihaz bir kod ada ve bu kod adlı bir yapılandırma dosyasına sahiptir(Moto G için falcon.mk). Bu dosya cihaz özelliklerini ve çıktı dosyalarının yerini belirler.

    BoardConfig.mk - Bu dosya kernel derleme işlemlerinde kullanılır. Ayrıca derleme sırasında kullanılacak derleme platformunuda belirler(*TARGET_BOARD_PLATFORM*/*TARGET_CPU_ABI*). Bölüm düzenleri, önyükleme adresleri, ramdisk boyutunu ayarlamak gibi işlemleri yapar.

    Kod:
    LOCAL_PATH:= $(call my-dir)
    
    TARGET_NO_BOOTLOADER := true
    TARGET_PREBUILT_KERNEL := device/lg/gt540/kernel
    TARGET_PREBUILT_RECOVERY_KERNEL := device/lg/gt540/recovery_kernel
    
    # Cihaza göre değişir!
    TARGET_BOARD_PLATFORM := msm7k
    TARGET_ARCH_VARIANT := armv6-vfp
    TARGET_CPU_ABI := armeabi
    TARGET_CPU_ABI := armeabi-v6l
    TARGET_CPU_ABI2 := armeabi
    
    # OpenGL sürücüsü düzenleme dosyası
    BOARD_EGL_CFG := device/lg/gt540/egl.cfg
    
    BOARD_GLOBAL_CFLAGS += -DHAVE_FM_RADIO
    
    BOARD_KERNEL_BASE := 0x02600000
    
    # Bu bölüm cihaza özeldir. Çeşitlli bölümlerin boyutları hex kodu olarak yazılmıştır.
    BOARD_BOOTIMAGE_PARTITION_SIZE     := 0x00480000
    BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00480000
    BOARD_SYSTEMIMAGE_PARTITION_SIZE   := 0x0cf80000
    BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x0d020000
    BOARD_FLASH_BLOCK_SIZE := 131072
    Bazı Boardconfig.mk parametreleri ve açıklamaları;
    • TARGET_ARCH: Android cihazlar için ARM mimarisini belirtir.
    • BOARD_KERNEL_CMDLINE: Cihazınız açılırken boot parametrelerini aşıyorsa bu komutu kullanmalısınız.
    • BOARD_KERNEL_PAGESIZE: Kernel dosya boyutunu belirler. Bu değerler orjinal kernelden çıkarılabilir.
    • BOARD_BOOTIMAGE_PARTITION_SIZE: Kernel imajı için belirlenen byte değeri.
    • BOARD_RECOVERYIMAGE_PARTITION_SIZE: Kurtarma modu(recovery) imajı için belirlenen byte değeri.
    • BOARD_SYSTEMIMAGE_PARTITION_SIZE: Sistem imajı için belirlenen byte değeri.
    • BOARD_USERDATAIMAGE_PARTITION_SIZE: Data imajı için belirlenen byte değeri.
    • BOARD_HAS_NO_SELECT_BUTTON: (isteğe bağlı), Kurtarma modunda(recovery) güç tuşuyla seçim yapıyorsanız kullanmalısınız.
    Kernel Kaynak Kodunu Anlamak

    Linux.org
    The Linux Kernel Archives

    Bildiğiniz gibi Android Linux kernelini kullanan bir sistem. Bu yüzden bu bölümde size Linux Kernelinin kaynak kodunu anlatmış olacağım.



    1. arch - Bu klasör içinde Kconfig dosyası bulunur. Bu dosya içinde derleme ayarlarını bulunur. Ayrıca desteklenen her işlemci mimariside bu klasörde bulunur. Alfa işlemciler için kaynak kodlarıda alpha klasörü içindedir. Bu klasör içine yeni çekirdek mimarileri için destek eklenebilir veya silinebilir.

    2. block - Bu klasör blok cihaz kodları içerir. Blok cihazlar bir paket halinde bulunan sürücülerden oluşur.

    3. crypto - İçinde pek çok şifreleme algoritması için kaynak kodları bulunur. Mesela sha1_generic.c dosyası sha1 şifreleme algoritmalarını içerir.

    4. Documentation - Bu klasör pek çok klasör için düz metin bilgileri içerir.



    5. drivers - Sürücüler için kodlar içerir. Sürücüler donanımın bir kısmını kontrol eden yazılımlardır. Bu klasörün içinde pek çok klasör bulunur. Her dosya bir donanımın adıyla adlandırılmıştır. mesela bluetooth klasörü bluetooth kodlarını içerir. scsi, usb ve firewire klasörleride adlarını taşıdıkları donanım sürücülerini içerir. Bazı sürücüler farklı alt klasörlerde olabilir. Mesela joystick, klavye ve fare sürücüleri drivers/input/ klasörü altındadır. Macintosh klasörü Apple donanımlarının sürücülerini içerir. Xen klasörü Xen hypervisor kodlarını içerir. Hypervisor aynı donanım üzerinde birden fazla işletim sistemi çalıştırmaya yarayan sanallaştırıcılardır.

    6. firmware - Bu klasör cihazın donanımlardan gelen sinyalleri okumasını ve anlamasını sağlayan kodlar içerir. firmware kodları olmasaydı Linux sistemi donanımlardan gelen bilgileri nasıl yarumlayacağını bilemezdi. Ayrıca firmware Linuxun donanımlara mesaj göndermesinide sağlar.

    7. fs - "fs" File System(dosya sistemi)'in kısaltmasıdır. İçindeki kodlar cihazın dosya sistemlerini tanımasını sağlar (NTFS,EXT4,EXT3 gibi). Her dosya sisteminin kendi adını taşıyan bir klasörü vardır. Hiç bir alt klasörün içinde bulunmayan maunt.c gibi dosyalar ise her dosya sistemiyle çalışabilen kodlardır. Dosya sistemler verileri depolar, düzenler ve yönetir. Her birinin kendine göre artı ve eksileri vardır.

    8. include - Kernelin kullandığı çeşitli başlık dosyaları(header files) içerir. Adın C dilinde başlık(header) ekleme komutu olan "include" komutundan alır.

    9. init - [INITiation(başlatma)] Kerneli başlatan kodları içerir. main.c dosyası diğer tüm dosyalarla başlantı kuran kernelin ana kaynak kod dosyasıdır.

    10. ipc - IPC(Inter-Process Communication) işlemler arası iletişim anlamına gelmektedir. Bu klasördeki kodlar kernel ve işlemler arasındaki iletişimi sağlayan ara katmanı oluşturur. Mesela bir program kamerayı açmak istediği zaman IPC katmanına bir sinyal yollar. Bu katman kernele bu isteği bildirir. Kernel kameraya bir sinyal göndererek kameranın açılmasını sağlar.

    11. kernel - Kernelin kendisini kontrol eden kodları içerir. Kernelin gerçekleştirdiği işlemleri zamanıyla beraber kaydeder. Böylece bir debugger uygulaması bu kayıtlara ulaşarak yazılımdaki herhangi bir hatayı bulabilir. Ayrıca içerisinde bulunan power klasörü cihazı kapatma yeniden başlatma ve askıya alma gibi güç seçeneklerini yönetir.

    12. lib - Kernel kütüphanelerini içeren klasördür.

    13. mm - Memory Management(bellek yönetimi) kelimelerinin kısaltmasıdır. Veriler RAM içine rasgele yerleştirilmez. Veriler kernel tarafından RAM üzerine yazılır. Asla kullanılan veri üzerine veya önemli veriler üzerine yazma yapılmaz.

    14. net - İnternet bağlantı bilgilerinin bulunduğu klasördür. IPv6 ve Appletalk kodlarını ve internet, wifi, bluetooth vb. protokollerini içerir. Ayrıca DNS ayarlarınıda barındırır.

    15. samples - Programlama örnekleri ve başlangıç modüllerini içerir. İstenilen bir özelliği barındıran bir modül gerekiyorsa ve fakat böyle bir modül geliştirilmemişse yeni geliştirilen modül bu dizine atılır. Bu yeni geliştiricilere modül üzerinde çalışma ve modülü geliştirme imkanı verir.

    16. scripts - Kernel derlemede kullanılan protokolleri içerir.

    17. security - Kernel güvenlik sistemi kodlarını içerir. Kerneli virüs ve hackerlardan korumak için önemlidir.

    18. sound - Ses kartı sürücülerini içerir.

    19. tools - Kernelle birlikte çalışan araçları içerir.

    20. usr - Kernel derlemeden sonra vmlinuz ve benzeri dosyaları oluşturur.

    21. virt - Virtualization(Sanallaştırma). Çoklu işletim sistemi kullanmaya imkan tanır. Xen'den farklıdır. virt ikinci işletim sistemini ana işletim sisteminin üzerinde bir programmış gibi çalıştırırken, Xen iki işletim sistemini aynı donanım üzerinde ayrı ayrı fakat aynı anda çalıştırır.
    Devamını Oku »