Google Repo Aracı
Bu konu AOKP rom için hazırlanmıştır. Diğer romlardada mantık aynıdır sadece dosya adları biraz değişebilir.
Repository : Basit anlamıyla kodların tutulduğu bulut ağlarıdır (Mega, Dropbox veya Google Drive gibi düşünebilirsiniz). Repository üzerinden başkasının hazırladığı kodları düzenleyip kendi bulutunuza aktarabilir(Siyah kutudaki gibi) ve ya kendinize güveniyorsanız kendi kodlarınızı yazabilirsiniz(Sarı kutudaki gibi). Başka kullanıcıdan aktarılan kaynakların altında "forked from link" şeklinde kopyalanan bulutun linki yer alır (Siyah kutudaki gibi).
Ayrıca kopyalanan kaynakların yanındaki simgeden de kopyalandığı anlaşılabilir.

Bu anlatımda Github.com kullanılmıştır. BitBucket.org gibi başka repository siteleride vardır.
Repo aracı : repo init, repo sync gibi komutları rom derleme sırasında kullanıyoruz. Peki bu repo komutu nerden geliyor? Aşağıdaki komutu rom derleme konusundan hatırlarsınız.
Kod:
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
Kod:
repo sync -j4
Repo aracı kaynak indirmelerinde Default.xml veya Manifest.xml dosyasını referans alır. Manifest dosyası repo aracına hangi başlık(branch) altında hangi dosyaların indirilmesi gerektiğini anlatır. Kısaca manifest dosyası büyük bir indirilecek dosyası listesidir.
Manifest Dosyası ve Dosya Konumu
repo init komutunu kullandığınızda aşağıdakine benzer bir çıktı alırsınız.
Kod:
akshat@vaio:~$ mkdir -p kang akshat@vaio:~$ cd kang akshat@vaio:~/kang$ repo init -u https://github.com/AOKP/platform_manifest.git -b jb-mr1 Get https://gerrit.googlesource.com/git-repo remote: Counting objects: 101, done remote: Finding sources: 100% (101/101) Receiving objects: 100% (2526/2526), 1.69 MiB | 67 KiB/s, done. remote: Total 2526 (delta 1442), reused 2526 (delta 1442) Resolving deltas: 100% (1442/1442), done. From https://gerrit.googlesource.com/git-repo * [new branch] maint -> origin/maint * [new branch] master -> origin/master * [new branch] stable -> origin/stable * [new tag] v1.0 -> v1.0 * [new tag] v1.0.1 -> v1.0.1 * [new tag] v1.0.2 -> v1.0.2 * [new tag] v1.0.3 -> v1.0.3 * [new tag] v1.0.4 -> v1.0.4 * [new tag] v1.0.5 -> v1.0.5 * [new tag] v1.0.6 -> v1.0.6 * [new tag] v1.0.7 -> v1.0.7 * [new tag] v1.0.8 -> v1.0.8 * [new tag] v1.0.9 -> v1.0.9 * [new tag] v1.1 -> v1.1 * [new tag] v1.10.0 -> v1.10.0 * [new tag] v1.10.1 -> v1.10.1 * [new tag] v1.10.2 -> v1.10.2 * [new tag] v1.10.3 -> v1.10.3 * [new tag] v1.10.4 -> v1.10.4 * [new tag] v1.11.0 -> v1.11.0 * [new tag] v1.11.1 -> v1.11.1 * [new tag] v1.12.0 -> v1.12.0 * [new tag] v1.12.1 -> v1.12.1 * [new tag] v1.12.2 -> v1.12.2 * [new tag] v1.2 -> v1.2 * [new tag] v1.3 -> v1.3 * [new tag] v1.3.1 -> v1.3.1 * [new tag] v1.3.2 -> v1.3.2 * [new tag] v1.4 -> v1.4 * [new tag] v1.4.1 -> v1.4.1 * [new tag] v1.4.2 -> v1.4.2 * [new tag] v1.4.3 -> v1.4.3 * [new tag] v1.4.4 -> v1.4.4 * [new tag] v1.5 -> v1.5 * [new tag] v1.5.1 -> v1.5.1 * [new tag] v1.6 -> v1.6 * [new tag] v1.6.1 -> v1.6.1 * [new tag] v1.6.10 -> v1.6.10 * [new tag] v1.6.10.1 -> v1.6.10.1 * [new tag] v1.6.10.2 -> v1.6.10.2 * [new tag] v1.6.2 -> v1.6.2 * [new tag] v1.6.3 -> v1.6.3 * [new tag] v1.6.4 -> v1.6.4 * [new tag] v1.6.5 -> v1.6.5 * [new tag] v1.6.6 -> v1.6.6 * [new tag] v1.6.7 -> v1.6.7 * [new tag] v1.6.7.1 -> v1.6.7.1 * [new tag] v1.6.7.2 -> v1.6.7.2 * [new tag] v1.6.7.3 -> v1.6.7.3 * [new tag] v1.6.7.4 -> v1.6.7.4 * [new tag] v1.6.7.5 -> v1.6.7.5 * [new tag] v1.6.8 -> v1.6.8 * [new tag] v1.6.8.1 -> v1.6.8.1 * [new tag] v1.6.8.10 -> v1.6.8.10 * [new tag] v1.6.8.11 -> v1.6.8.11 * [new tag] v1.6.8.2 -> v1.6.8.2 * [new tag] v1.6.8.3 -> v1.6.8.3 * [new tag] v1.6.8.4 -> v1.6.8.4 * [new tag] v1.6.8.5 -> v1.6.8.5 * [new tag] v1.6.8.6 -> v1.6.8.6 * [new tag] v1.6.8.7 -> v1.6.8.7 * [new tag] v1.6.8.8 -> v1.6.8.8 * [new tag] v1.6.8.9 -> v1.6.8.9 * [new tag] v1.6.9 -> v1.6.9 * [new tag] v1.6.9.1 -> v1.6.9.1 * [new tag] v1.6.9.2 -> v1.6.9.2 * [new tag] v1.6.9.3 -> v1.6.9.3 * [new tag] v1.6.9.4 -> v1.6.9.4 * [new tag] v1.6.9.5 -> v1.6.9.5 * [new tag] v1.6.9.6 -> v1.6.9.6 * [new tag] v1.6.9.7 -> v1.6.9.7 * [new tag] v1.6.9.8 -> v1.6.9.8 * [new tag] v1.7 -> v1.7 * [new tag] v1.7.1 -> v1.7.1 * [new tag] v1.7.2 -> v1.7.2 * [new tag] v1.7.3 -> v1.7.3 * [new tag] v1.7.3.1 -> v1.7.3.1 * [new tag] v1.7.4 -> v1.7.4 * [new tag] v1.7.4.1 -> v1.7.4.1 * [new tag] v1.7.4.2 -> v1.7.4.2 * [new tag] v1.7.4.3 -> v1.7.4.3 * [new tag] v1.7.5 -> v1.7.5 * [new tag] v1.7.6 -> v1.7.6 * [new tag] v1.7.6.1 -> v1.7.6.1 * [new tag] v1.7.7 -> v1.7.7 * [new tag] v1.7.7.1 -> v1.7.7.1 * [new tag] v1.7.7.2 -> v1.7.7.2 * [new tag] v1.7.7.3 -> v1.7.7.3 * [new tag] v1.7.7.4 -> v1.7.7.4 * [new tag] v1.7.7.5 -> v1.7.7.5 * [new tag] v1.7.7.6 -> v1.7.7.6 * [new tag] v1.7.8 -> v1.7.8 * [new tag] v1.7.8.1 -> v1.7.8.1 * [new tag] v1.7.8.2 -> v1.7.8.2 * [new tag] v1.8.0 -> v1.8.0 * [new tag] v1.8.1 -> v1.8.1 * [new tag] v1.8.2 -> v1.8.2 * [new tag] v1.9.0 -> v1.9.0 * [new tag] v1.9.1 -> v1.9.1 * [new tag] v1.9.2 -> v1.9.2 * [new tag] v1.9.3 -> v1.9.3 * [new tag] v1.9.4 -> v1.9.4 * [new tag] v1.9.5 -> v1.9.5 * [new tag] v1.9.6 -> v1.9.6 Get https://github.com/AOKP/platform_manifest.git % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 curl: (22) The requested URL returned error: 404 Not Found Server does not provide clone.bundle; ignoring. remote: Counting objects: 1722, done. remote: Compressing objects: 100% (1012/1012), done. remote: Total 1722 (delta 839), reused 1552 (delta 709) Receiving objects: 100% (1722/1722), 249.52 KiB | 50 KiB/s, done. Resolving deltas: 100% (839/839), done. From https://github.com/AOKP/platform_manifest * [new branch] ics -> origin/ics * [new branch] jb -> origin/jb * [new branch] jb-mr1 -> origin/jb-mr1 * [new tag] Build-2 -> Build-2 * [new tag] Build-3 -> Build-3 * [new tag] Build-4 -> Build-4 * [new tag] Build-5 -> Build-5 * [new tag] Milestone-1 -> Milestone-1 * [new tag] jb-mr1_build-1 -> jb-mr1_build-1 * [new tag] jb-mr1_build-4 -> jb-mr1_build-4 * [new tag] jb-mr1_build-6 -> jb-mr1_build-6 * [new tag] jb-mr1_milestone-1 -> jb-mr1_milestone-1 Your identity is: akshatshenoy <akshat.shenoy@gmail.com> If you want to change this, please re-run 'repo init' with --config-name repo has been initialized in /home/akshat/kang

.repo klasöründeki manifest.xml dosyasını açtığımızda indirilecek repoların listesini göreceksiniz.
AOKP JB-MR1 için bu dosya şu şekildedir: https://raw.githubusercontent.com/AOKP/platform_manifest/jb-mr1/default.xml
Rom derleme sırasında kullandığımız şu kodu anımsarsak:
Kod:
repo init -u https://github.com/AOKP/platform_manifest.git -b jb-mr1
repo sync komutuyla resimde görüldüğü gibi kaynak kod indirilmeye başlar.

İşaretlenmiş satıra bakarsanız manifest.xml dosyasında indirilecek 415 repo olduğunu görürsünüz. İndirme işlemi tamamlandığında inin dosyaları rom klasörünüzde görüntüleyebilirsiniz.
manifest Dosyasını Anlamak

1) remote(uzak sunucu) etiketi :
Kod:
<remote name=" herhangi bir isim " fetch="uzak websitesi/hosting/sunucu url'si " review="kod inceleme reposu url'si :isteğe bağlı: " />
Örnekler
Kod:
<remote name="github" fetch="https://github.com/" /> <remote name="bitbucket" fetch="https://bitbucket.org"/> <remote name="aokp" fetch="https://github.com/" review="gerrit.aokp.co" />
2) default(varsayılan) etiketi :
Kutu içinde gördüğünüz gibi bir varsayılan(default) sunucu ekleyerek project etiketlerinde her defasında remote(uzak sunucu) ve revision(bölüm) tanımlaması yapmaktan kurtulabilirsiniz. Resimde (2) ve (3) numaralı satırlarda görüldüğü gibi.
Kod:
<remote name=" herhangi bir isim " fetch="uzak websitesi/hosting/sunucu url'si " review="kod inceleme reposu url'si :isteğe bağlı: " /> <default revision="bölüm" remote="önceden tanımlanmış uzak sunucu adı" sync-j="x" />
Varsayılan sunucu örneği
Kod:
<remote name="aosp" fetch="https://android.googlesource.com/" review="https://android-review.googlesource.com/" /> <default revision="refs/tags/android-4.2.2_r1.2" remote="aosp" sync-j="4" />
project etiket satırında remote ve revision etiketleri tanımlanmamışsa varsayılan uzak sunucu üzerinden indirme işlemi yapar. Fakat bu etiketler tanımlıysa o zaman etiketlerin belirttiği sunuculara bağlanır ve istenen paketleri çeker. Aralarındaaki farkı resimdeki (2) ve (3) numaralı satırlarda görebilirsiniz.
Kod:
<project path=" /reponun indirileceği dosya dizini" name="/varsayılan sunucudaki repo adı" />
Kod:
<project path="abi/cpp" name="platform/abi/cpp" /> <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" />
Varsayılan sunucu dışında indirilmesi gereken repolar için kullanılır. Uzak sunucu(remote) ve bölüm(revision) etiketlerinin tanımlanması gerekir.
Kod:
<project path="/reponun indirileceği dosya dizini" name="/sunucudaki repo adı" remote="önceden tanımlanmış sunucu adı" revision="bölüm" />
Kod:
<project path="bootable/recovery" name="CyanogenMod/android_bootable_recovery" remote="cm" revision="cm-10.1" />
İpucları
Bir repo linki iki kısımdan oluşur. Bunlar; uzak sunucu url'si + repo adı.
Mesela
Kod:
https://github.com/ + CyanogenMod/android_bootable_recovery #repo linki https://github.com/CyanogenMod/android_bootable_recovery


Sizde kendi manifest dosyanızı oluşturup kullanabilirsiniz. Örneğin
Kod:
<?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name="red-devil" fetch="https://github.com/red-devil" /> <project path="Cherrypicking/frameworks/base" name="AeonROM/android_frameworks_base" remote="red-devil" revision="master" /> <project path="Cherrypicking/frameworks/native" name="AeonROM/android_frameworks_native" remote="red-devil" revision="master" /> <project path="Cherrypicking/frameworks/av" name="AeonROM/android_frameworks_av" remote="red-devil" revision="master" /> </manifest>
local manifests Dosyasını Anlamak
local_manifest.xml : manifest dosyasının özel bir hali gibidir. Bu dosya manifest dosyasındaki proje(project) repolarının üzerine yazmaya, silmeye, düzenlemeye ve eklemeye yarar. Her repo sync komutunuzda bu dosya içindeki repolarda kendini günceller.
Dosya konumuna ulaşmak için
- .repo klasörünü açın ( klasör gizliyse CTRL + H yapın ).
- local_manifests adlı bir klasör oluşturun.
- local_manifest.txt linkteki sayfayı indirin. local_manifest.xml olarak adlandırın ve /.repo/local_manifests/ dizinine atın.


local manifests Dosyasının İşlevleri
local_manifest dosyası normal manifest dosyasıyla benzerdir. Farkı ise projelerde ekleme çıkarma yapabilmemizdir.
> remove-project(proje kaldırma) etiketi :
HTC Explorer için AOKP JB-MR1 derleniyorsa diğer cihazların cihaz kaynak kodları kaldırılabilir. Alttaki resimde gereksiz repoları görebilirsiniz.

Tüm bunları indirmek için internet kotası ve zaman harcamaktansa bunları kaldırmak daha mantıklıdır. peki neden direk manifest.xml dosyasını düzenlemiyoruz diye düşünebilirsiniz. Eğer direk manifest dosyasını düzenlerseniz o zaman repo sync komutunda sizdeki ve buluttaki manifest dosyaları uyuşmadığı için hata alırsınız.
Bu yüzden uzak sünücüdaki manifest dosyasını düzenlemeniz gerekir ki buna yetkiniz olması için repository hesabinin size ait olması gerekir. sunucu hesabı sizin olsa bile sizin sunucunuzu kullanan diğer geliştiricilerin işini zorlaştırmış olursunuz. Bu yüzden en iyi çözüm local_manifest dosyası kullanmaktır.
Kod:
<remove-project name="kaldırılacak proje adı" />
<remove-project name="AOKP/device_samsung_d2att" />
<remove-project name="AOKP/device_samsung_d2tmo" />
Böylece üstteki resimde gösterilen ilk iki cihazı kaldırmış olduk. Eğer diğer tüm cihazlar içinde kaldırma komutu eklersek sonuçta indirilecek paket sayısının 415 den 362 ye düştüğünü görebiliriz.

Böylece daha az paketin inmesini sağlamış olduk ve repo sync işlemini daha hızlı gerçekleştirebiliriz.
>proje(projects) ekleme :
Proje ekleme işlemi manifest dosyasıyla aynı şekilde yapılır.
Kod:
<remote name=" herhangi bir isim " fetch="uzak websitesi/hosting/sunucu url'si " review="kod inceleme reposu url'si :isteğe bağlı: " /> <project path="/reponun indirileceği dosya dizini" name="/sunucudaki repo adı" remote="önceden tanımlanmış sunucu adı" revision="bölüm" />
Kod:
<project path="device/htc/pico" name="android_device_htc_pico_aokp" remote="red-devil" revision="master"/> <project path="kernel/htc/pico" name="android_kernel_htc_pico" remote="red-devil" revision="cm-10.1" />
Kod:
<?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name="red-devil" fetch="https://github.com/red-devil/" /> <project path="device/htc/pico" name="android_device_htc_pico_aokp" remote="red-devil" revision="master"/> <project path="kernel/htc/pico" name="android_kernel_htc_pico" remote="red-devil" revision="cm-10.1" /> <remove-project name="AOKP/device_acer_a510" /> <remove-project name="AOKP/device_asus_tilapia" /> <remove-project name="AOKP/device_htc_evita" /> <remove-project name="AOKP/device_htc_s4-common" /> <remove-project name="AOKP/device_lge_iprj-common" /> <remove-project name="AOKP/device_lge_mako" /> <remove-project name="AOKP/device_lge_p930" /> <remove-project name="AOKP/device_lge_su640" /> <remove-project name="AOKP/device_lge_vs920" /> <remove-project name="AOKP/device_motorola_maserati" /> <remove-project name="AOKP/device_motorola_omap4-common" /> <remove-project name="AOKP/device_motorola_solana" /> <remove-project name="AOKP/device_motorola_spyder" /> <remove-project name="AOKP/device_motorola_targa" /> <remove-project name="AOKP/device_motorola_umts_spyder" /> <remove-project name="AOKP/device_samsung_aries-common" /> <remove-project name="AOKP/device_samsung_d2-common" /> <remove-project name="AOKP/device_samsung_celox-common" /> <remove-project name="AOKP/device_samsung_d2att" /> <remove-project name="AOKP/device_samsung_d2tmo" /> <remove-project name="AOKP/device_samsung_d2usc" /> <remove-project name="AOKP/device_samsung_d2vzw" /> <remove-project name="AOKP/device_samsung_galaxys2-common" /> <remove-project name="AOKP/device_samsung_hercules" /> <remove-project name="AOKP/device_samsung_i605" /> <remove-project name="AOKP/device_samsung_i9100" /> <remove-project name="AOKP/device_samsung_i9100g" /> <remove-project name="AOKP/device_samsung_i9300" /> <remove-project name="AOKP/device_samsung_l900" /> <remove-project name="AOKP/device_samsung_maguro" /> <remove-project name="AOKP/device_samsung_manta" /> <remove-project name="AOKP/device_samsung_msm8660-common" /> <remove-project name="AOKP/device_samsung_msm8960-common" /> <remove-project name="CyanogenMod/android_device_samsung_omap4-common" /> <remove-project name="AOKP/device_samsung_smdk4412-common" /> <remove-project name="CyanogenMod/android_device_samsung_smdk4412-qcom-common" /> <remove-project name="AOKP/device_samsung_t0lte" /> <remove-project name="AOKP/device_samsung_t0lteatt" /> <remove-project name="AOKP/device_samsung_t0ltetmo" /> <remove-project name="AOKP/device_samsung_toro" /> <remove-project name="AOKP/device_samsung_toroplus" /> <remove-project name="AOKP/device_samsung_tuna" /> <remove-project name="AOKP/device_samsung_vibrantmtd" /> <remove-project name="AOKP/device_sony_hayabusa" /> <remove-project name="AOKP/device_sony_mint" /> <remove-project name="AOKP/device_sony_odin" /> <remove-project name="AOKP/device_sony_tsubasa" /> <remove-project name="AOKP/device_sony_yuga" /> <remove-project name="AOKP/device_sony_blue-common" /> <remove-project name="AOKP/device_sony_fusion3-common" /> <remove-project name="CyanogenMod/android_device_sony_qcom-common" /> <remove-project name="AOKP/device_sony_common" /> <remove-project name="AOKP/packages_apps_Torch" /> </manifest>

İpucları
#1) local_manifest ile Neler Kaldırılabilir?
Altta belirtilen paketlerin hepsini local_manifest dosyasından remove-project etiketiyle kaldırabilirsiniz. Aşağıda örnek olarak verilen kodların manifest dosyasında name(ad) etiketinde belirtilen adını kullanmalısınız.
1) Kullanmayacağınız cihaz kaynak kodlarını kaldırabilirsiniz.
Kod:
android_device_htc_cihazkodadı android_device_sony_cihazkodadı android_device_samsung_cihazkodadı
2) Kullanmayacağınız kernel kaynak kodlarını kaldırabilirsiniz.
Kod:
kernel/asus/grouper kernel/lge/mako kernel/oneplus/msm8974
3) Kullanmayacağınız üretici kaynak kodlarını kaldırabilirsiniz.
Kod:
vendor_htc vendor_lge vendor_samsung vendor_motorola
4) Kullanmayacağınız paket programları kaldırabilirsiniz.
Mesela telefonunuzda flaş yoksa ozaman torch.apk(el feneri) uygulamasınada ihtiyacınız yoktur. Ayrıca gereksiz canlı duvar kağıtları ve diğer istemediğiniz programlarıda kaldırabilirsiniz.
Kod:
packages_apps_uygulamaadı android_packages_wallpapers_duvarkağıdıadı
Kod:
<project path="prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6" name="platform/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6" groups="pdk,darwin,arm" /> <project path="prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.6" name="platform/prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.6" groups="pdk,darwin,arm" /> <project path="prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.6" name="platform/prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.6" groups="pdk,darwin,mips" /> <project path="prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.6" name="platform/prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.6" groups="pdk,darwin,x86" />
6) Diğer gereksiz repoları kaldırın.
Örneğin Qualcomm(manifest dosyasında qcom diye yazar) cihaz kullanıyorsanız Exynos repolarına ihtiyacınız yoktur.
Not: Ne işe yaradığını bilmediğiniz paketleri kesinlikle kadırtmayın.
#2) Yeni Kaynak Kod İndirmeden Önce Referans Noktası Kullanın!
Kod:
repo init --reference=/daha/önce/indirilen/romun/dizini -u kaynak_kod_baglanti_adresi -b bolum
Kod:
repo init -u git//www.github.com/CyanogenMod/android.git -b cm-10.1 repo sync -j4

Fakat bir süre sonra bundan sıkıldınız ve başka bir ROM denemeye karar verdiniz. Mesela AOKP... Tekrar bir 15GB daha indirme yapacağınızı düşünebilirsiniz ama buna gerek yok. Önceki indirdiğiniz ROM'un kodlarını referans nokta alarak kullanıp indireceğiniz veri miktarını düşürebilirsiniz. Resimde kodun kullanımını görebilirsiniz.

Bu kod referans olarak gösterilen konumdaki dosyalar ile buluttakileri karşılaştırıp eksik veya farklı dosyaları indirir. Böylece veri ve zaman tasarrufu sağlamış olursunuz.
#3) Derleme Yaparken CCACHE Kullanın
CCACHE : Türkçesi önbellektir. Derleyici önbelleği(compiler cache) olarakda söylenir. Kullanılma amacı ise derleme işleminin süresini kısaltmaktır.
CCACHE kullanmak için;
1) Ucbirim(terminal) açın. (CTRL+ALT+T)
2) gedit.bashrc yazıp enterlayın.
3) Alttaki kodu ekleyin.
Jellybean için;
Kod:
export USE_CCACHE=1 export CCACHE_DIR=/source-directory/prebuilts/misc/linux-x86/ccache
Kod:
USE_CCACHE=1 export CCACHE_DIR=/source-directory/prebuilt/linux-x86/ccache/ccache
Kod:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
50 G ---> 50 GB CCACHE demektir. İdeali 50-100 arasıdır. İsterseniz 40 civarıda ayarlayabilirsiniz.
CCACHE derleme esnasında çalışan C ve C++ programlarının çıktılarını önbelleğe alır. İlk derlemeden sonra yapılan derlemelerde aynı programın tekrar çalıştığını algılarsa kaydettiği çıktı verilerini yollayarak programın tekrar çalışmamasını sağlar. Bu sayede derleme zamanından tasarruf sağlar.
#4) Özel Toolchain(Derleyici) Kullanın
ROM veya kernel derlerken linaro gibi özel toolchain(derleyici) kullanarak %20-30 daha fazla performans elde edebilirsiniz.
Bu linkten linaro derleyicisini indirebilirsiniz. Cycles/1504/Release - Linaro Wiki
ROM için;
İndirdiğiniz dosyayı resimde gösterilen dizine çıkarın.

build/envsetup.sh dosyasında altta gösterilen iki satırı linaro derleyici(toolchain) içindeki /bin klasörünü gösterecek şekilde düzenleyin.
Kernel için;
İndirdiğiniz dosyayı /prebuilt/linux-x86/toolchains/ dizinine çıkarın.
Cihaz kaynak kodu dizinindeki(device/üretici/cihazkodadı) BoardConfig.mk dosyasında aşağıda gösterilen satırı düzenleyip derleyici klasörünün adını yazın.

Bunun dışında ek düzenlemeler yapılması gerekebilir. Cihazınız için internette araştırma yaparak bunu bulabilirsiniz.
#5) Cherry-picking(Kiraz toplama)
commits : küçük kod paketleridir. Rom geliştiricilerin bulut hesaplarında gördüğünüz her commits çeşitli dosyalarda düzeltmeler içerir. Tek başlık altında yapılan değişikliklerin tamamı bir commit eder.
Github üzerinde örnek kod paketleri(commits) listesi : Commits · red-devil/android_device_htc_pico_aokp · GitHub
Github üzerinde örnek kod paketi(commit) : Initial commit · red-devil/android_device_htc_pico_aokp@3ffc1e3 · GitHub
Cerry-pickingi romun hatalarını gidermek veya roma yeni özellikler(kilit ekranı veya holo bildirimler gibi) kazandırmak için kullanabilirsiniz. Örnekte sadece tek bir kod paketi eklenmiştir. Fakat genellikle bir özellik eklemek için 2-8 arası kod paketini ROMa entegre etmek gerekebilir.
Mesela ROM derleme işleminden sonra cihazınıza kurdunuz ve bazı hatalar gördünüz. Biraz araştırdınız ve Cyanogenmod geliştiricilerinin sizinkiyle benzer bir cihazda bu sorunu çözdüğünü gördünüz. Bu kod paketlerini(commits) elle bilgisayarımızdaki kaynak koda uygulayabiliriz. Bu sıkıcı ve insan hatasına açık bir iş olur. Adının Türkçesi garip gelsede cherry-picking(kiraz toplama) işlemiyle bu işi otomatikleştirebiliriz.
İlk olarak kod paketini(commits) uygulayacağınız dizine girin. Örnek olarak HTC Explorerın(kodadı pico) cihaz kaynak kodunda düzenleme yapacaksak ;
Kod:
cd device/htc/pico
İlk olarak github adresine bağlanmamız lazım bunun için alttaki gibi bir kod oluşturmalıyız.
Kod:
git remote add isim url
Kod:
git remote add pico git://github.com/TeamPico/android_device_htc_pico.git
url- reponun bağlantı adresi
Kod:
git fetch isim
Kod:
git fetch pico

Şimdi kod paketini(commit) çekebiliriz. Bunu için ya üstte kırmızı kutu içindeki butonu tıklayarak yada kod paketinin içine girip alttaki resimde gösterilen kırmızı kutu içindeki kod paketi numarasını kopyalayıp alttaki kodun sonuna yazmalısınız.
Kod:
git cherry-pick kod-paketi-numarası
Kod:
git cherry-pick 61718c8fe3d11151a4c3b8364cca14b430c23c04

İşlem bitince kod paketini roma eklemiş oldunuz. Eğer aşağıdaki gibi bir hata kodu gelirse;
Kod:
akshat@vaio:/media/akshat/HD/android/kang/device/htc/pico$ git cherry-pick aa39fd899e321395f3c08c9a7f606ac458bbbd1b error: could not apply aa39fd8... cut out debugging hint: after resolving the conflicts, mark the corrected paths hint: with 'git add <paths>' or 'git rm <paths>' hint: and commit the result with 'git commit'
Kod:
git status
Kod:
gedit kırmızıyla-yazan-dosya-dizini
Kod:
<<<<<HEAD <Orjinal Kod> ======= <Cherry-pick kodu> >>>>>Cherry Pick Kodunun Adı

Bozuk kısmı githubdaki kod paketiyle karşılaştırıp gerekli düzenlemeleri yapın. Githubda kırmızı ile gösterilen satırlar silinen yeşil ile gösterilen satırlarsa eklenen satırlardır. Githubda eklemek istediğiniz kod paketini açıp kırmızı/yeşile dikkat ederek kendi kodlarınızı elle düzenleyebilirsiniz. "<<<<", "=====" ve ">>>>>" satırlarını silin. Sonuç olarak alttaki gibi düzenlememizi yapmış olduk.

Düzenlediğimiz dosyayı cerry-pickinge ekleyip başka hata varmı diye kontrol ediyoruz.
Kod:
git add kırmızıyla-yazan-dosya-dizini
Kod:
git status
#6) Kaynak Koda APK Dosyası Ekleme
Kaynak kodun cihazınıza ait dizinini açın ve APKnızı bu dizine kopyalayın. (Örneğin Moto G için device/motorola/falcon)
Alttaki satırları android.mk dosyasına ekleyin.
include $(CLEAR_VARS)
LOCAL_MODULE := İsim
LOCAL_SRC_FILES := İsim.apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .apk
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
include $(BUILD_PREBUILT)
Örnek Wallpaperz.apk için
Kod:
include $(CLEAR_VARS) LOCAL_MODULE := Wallpaperz LOCAL_SRC_FILES := Wallpaperz.apk LOCAL_MODULE_TAGS := optional LOCAL_MODULE_SUFFIX := .apk LOCAL_MODULE_CLASS := APPS LOCAL_CERTIFICATE := PRESIGNED LOCAL_MODULE_PATH := $(TARGET_OUT)/app include $(BUILD_PREBUILT)
Kod:
PRODUCT_PACKAGES += \ İsim
Kod:
PRODUCT_COPY_FILES += \ dosyanın-kaynak-kod-klasörü-içindeki-yeri:ROM.zip-içindeki-yeri
Kod:
PRODUCT_COPY_FILES += \ device/lge/geeb/libjackpal-androidterm3.so:system/lib/libjackpal-androidterm3.so \ device/lge/geeb/libjackpal-androidterm4.so:system/lib/libjackpal-androidterm4.so
#7) Uygulama Kaynak Kodlarını Ekleme
Altta Gallery2 uygulamasının kaynak kodunun ROMunuzun kaynak koduna eklenmesini göstereceğim.(Bu uygulama zaten ROMunuzda var ben sadece örnek olsun diye gösteriyorum.)
Uygulamanın kaynak kodunu /packages/uygulama-adı dizinine kopyalayın. Örnek /packages/Gallery2. Uygulamanın kaynak kod klasörüne gürün ve android.mk dosyasını açın. LOCAL_PACKAGE_NAME satırında yazan uygulama adını kopyalayın.
Kod:
LOCAL_AAPT_FLAGS := --auto-add-overlay LOCAL_PACKAGE_NAME := Gallery2 LOCAL_OVERRIDES_PACKAGES := Gallery Gallery3D GalleryNew3D
Kod:
PRODUCT_PACKAGES += \ Gallery2
Hiç yorum yok:
Yorum Gönder