HakanSeven12
Üye
[MAGP] Repo Aracı, manifest, local_manifest ve Diğer Kavramlar
Artık konularıma kendi bloğumdan devam edeceğim. Bloğa alttaki resime tıklayarak ulaşabilirsiniz.
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
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.
Bu komut ile repo aracını indiriyoruz. Repo aracının işlevi ise bir buluttan(repository) istenilen başlık(branch) altındaki kodların alttaki kod ile çekilmesidir.
Komut sonundaki -j4 sayısı indirmenin kaç kanaldan yapılacağını belirler internet hızınız düşükse bunu azaltabilir(-j1 veya -j2), internet hızınız yüksekse bunu arttırabilirsiniz(-j16 veya -j32).
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.
repo init komutunu kullandığınızda aşağıdakine benzer bir çıktı alırsınız.
Yukarıdaki çıktıda son satırda reponun /kang klasörü içinde başlatıldığını söylüyor. Bilgisayarın ana dizinindeki kang klasörü açılıp CTRL+H ile görünmez dosyaları görünür yapı CTRL+L ilede sadece gizli dosyaları listelersek alttaki ekranı görürüz.
.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:
Rom derleme sırasında kullandığımız şu kodu anımsarsak:
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.
1) remote(uzak sunucu) etiketi :
Bilgisayarın indirmeyi yapacağı uzak sunucunun takma adı, adresi ve repoları incelemek isterseniz kod inceleme reposu url'sini içerir.
Örnekler
Bu şekilde farklı repo sunucuları ekleyip kullanılabilir.
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.
x repo sync komutunda -j ile işlemin kaç kanaldan yapılacağı belirtilmezse kullanılacak varsayılan değerdir. Çoğu rom geliştiricisi varsayılan olarak AOSP sunucusunu kullanır. Böylece kendi repolarını boyutunu daha küçük tutarlar. Sadece kendi düzenlemelerini yaptıkları dosyalar için ayrı bir sunucu tanımlamaları gerekir.
Varsayılan sunucu örneği
3) project(proje) etiketi :
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.
Örnekler
4) diğer project(proje) etiketi :
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.
Bir repo linki iki kısımdan oluşur. Bunlar; uzak sunucu url'si + repo adı.
Mesela
Çoğu rom geliştirici repolarını dosya dizini adlarıyla kaydederek diğer geliştiricilere kolaylık sağlarlar. Örnek olarak vendor/aokp dizinine inecek dosyalar uzak sunucuda github.com/AOKP/vendor_aokp reposunda tutulur. Resimlerdede görebilirsiniz.
Sizde kendi manifest dosyanızı oluşturup kullanabilirsiniz. Örneğin
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
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.
Örneğin
<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.
Örneğin
Sonuç olarak elinizde alttakine benzer bir local_manifest dosyası olacaktır.
repo sync dediğinizde ise toplam proje sayısının 364 olduğunu görebilirsiniz.
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.
Eğer HTC cihazınız yoksa HTC cihaz kaynak kodu repolarına da ihtiyacınız yoktur. Aynı şekilde diğer cihaz üreticileride buna dahil... android_device_common gibi genel repoları ve sahip olduğunuz cihazın (mesela Sony için device/sony/common) genel repolarını silmeyin.Ayrıca cihazınızın cihaz(device) kaynak kodları yoksa cihazınıza donanımsal olarak benzer özellikteki repoları silmezseniz kendi cihazınızın kodlarını hazırlarken bunlardan faydalanabilirsiniz.
2) Kullanmayacağınız kernel kaynak kodlarını kaldırabilirsiniz.
Bu repoların çoğu boyut olarak büyük dosyalardır. Kullanmadıklarınızı kaldırmanız işinizi hızlandırır.
3) Kullanmayacağınız üretici kaynak kodlarını kaldırabilirsiniz.
Nexus cihazlar TheMuppets üretici adını kullanır.
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.
5) Macintosh üzerinde derleme yapmayacaksanız darwin derleyicilerini kaldırın.
Yukardaki satırlar dışındaki darwin araçlarını kaldırmayın.
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.
Diyelim ki Cyanogenmod kaynak kodunu alttaki kodla indiridiniz ve kullandınız.
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.
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;
ICS ve daha eski sürümler için;
Bu işlemi yaptıktan sonra ucbirimden(terminal) kaynak kodun tutulduğu dizine girip alttaki kodu yazın.
ICS ve daha düşük versiyonlar CCACHE'yi buna göre ayarlarlar.
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.
ROM veya kernel derlerken linaro gibi özel toolchain(derleyici) kullanarak %20-30 daha fazla performans elde edebilirsiniz.
Bu linkten linaro derleyicisini indirebilirsiniz.
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.
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 :
Github üzerinde örnek kod paketi(commit) :
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 ;
Diyelimki bu linkteki resimde mavi kutuyla gösterilen kod paketini çekmek istiyoruz.
İlk olarak github adresine bağlanmamız lazım bunun için alttaki gibi bir kod oluşturmalıyız.
isim- repoya verebileceğiniz herhangi bir isim. Bu ismi fetch komutunda kullanıcaz.
url- reponun bağlantı adresi
Ş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.
İşlem bitince kod paketini roma eklemiş oldunuz. Eğer aşağıdaki gibi bir hata kodu gelirse;
Kod paketi romunuzla uyumlu değil demektir. Eksik satır veya kod çakışması olmuş olabilir. Hatanın nerden kaynaklandığını bulmak için alttaki kodu kullanın.
Yeşil dosyalarda sorun olmadan kod eklenmiş/çıkartılmıştır. Kırmızılar ise sorunludur. Kırmızı dosyaları açıp tek tek elle düzeltmek gerekir. İlk olarak alttaki kodla bozuk kodun bulunduğu dosyayı açın.(Dosya dizinindende açabilirsiniz.)
Hatalı yer alttaki şekilde görünecektir.
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.
Bütün satırlar yeşilse işlemi bitiriyoruz.
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
device.mk içine alttaki kodu ekleyin.
Eklediğiniz APK başka dosyalarında ROM içinde bulunmasını gerektiriyorsa alttaki kodla kaynak koddaki bir dosyayı ROMa taşıtabilirsiniz.
Örnek (libjackpal-androidterm3.so ve libjackpal-androidterm4.so dosyalarının ikisinide taşıtmak için)
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.
device içinde cihazınızın kodlarının bulunduğu dizine girin. Örneğin device/motorola/falcon. device.mk dosyasını açıp alttaki satırları yapıştırın.
Linkleri görüntülemek için kayıt olmalısınız
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.
Ekli resimleri görüntülemek için kayıt olmalısınız
Bu anlatımda
Linkleri görüntülemek için kayıt olmalısınız
kullanılmıştır.
Linkleri görüntülemek için kayıt olmalısınız
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
Bu komut ile repo aracını indiriyoruz. Repo aracının işlevi ise bir buluttan(repository) istenilen başlık(branch) altındaki kodların alttaki kod ile çekilmesidir.
Kod:
repo sync -j4
Komut sonundaki -j4 sayısı indirmenin kaç kanaldan yapılacağını belirler internet hızınız düşükse bunu azaltabilir(-j1 veya -j2), internet hızınız yüksekse bunu arttırabilirsiniz(-j16 veya -j32).
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 <[email protected]>
If you want to change this, please re-run 'repo init' with --config-name
repo has been initialized in /home/akshat/kang
Yukarıdaki çıktıda son satırda reponun /kang klasörü içinde başlatıldığını söylüyor. Bilgisayarın ana dizinindeki kang klasörü açılıp CTRL+H ile görünmez dosyaları görünür yapı CTRL+L ilede sadece gizli dosyaları listelersek alttaki ekranı görürüz.
Ekli resimleri görüntülemek için kayıt olmalısınız
Ekli resimleri görüntülemek için kayıt olmalısınız
.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:
Linkleri görüntülemek için kayıt olmalısınız
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
Linkleri görüntülemek için kayıt olmalısınız
linkindeki default.xml dosyasına bakarsanız bilgisayarınızdaki .repo klasöründeki manifest.xml dosyasıyla aynı içeriğe sahip olduğunu görebilirsiniz.repo sync komutuyla resimde görüldüğü gibi kaynak kod indirilmeye başlar.
Ekli resimleri görüntülemek için kayıt olmalısınız
İş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
Ekli resimleri görüntülemek için kayıt olmalısınız
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ı: " />
Bilgisayarın indirmeyi yapacağı uzak sunucunun takma adı, adresi ve repoları incelemek isterseniz kod inceleme reposu url'sini içerir.
Ö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" />
Bu şekilde farklı repo sunucuları ekleyip kullanılabilir.
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" />
x repo sync komutunda -j ile işlemin kaç kanaldan yapılacağı belirtilmezse kullanılacak varsayılan değerdir. Çoğu rom geliştiricisi varsayılan olarak AOSP sunucusunu kullanır. Böylece kendi repolarını boyutunu daha küçük tutarlar. Sadece kendi düzenlemelerini yaptıkları dosyalar için ayrı bir sunucu tanımlamaları gerekir.
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" />
3) project(proje) etiketi :
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ı" />
Örnekler
Kod:
<project path="abi/cpp" name="platform/abi/cpp" />
<project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" />
4) diğer project(proje) etiketi :
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
Çoğu rom geliştirici repolarını dosya dizini adlarıyla kaydederek diğer geliştiricilere kolaylık sağlarlar. Örnek olarak vendor/aokp dizinine inecek dosyalar uzak sunucuda github.com/AOKP/vendor_aokp reposunda tutulur. Resimlerdede görebilirsiniz.
Ekli resimleri görüntülemek için kayıt olmalısınız
Ekli resimleri görüntülemek için kayıt olmalısınız
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.
-
Linkleri görüntülemek için kayıt olmalısınızlinkteki sayfayı indirin. local_manifest.xml olarak adlandırın ve /.repo/local_manifests/ dizinine atın.
Ekli resimleri görüntülemek için kayıt olmalısınız
Ekli resimleri görüntülemek için kayıt olmalısınız
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.
Ekli resimleri görüntülemek için kayıt olmalısınız
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ı" />
Örneğin
<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.
Ekli resimleri görüntülemek için kayıt olmalısınız
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" />
Örneğin
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" />
Sonuç olarak elinizde alttakine benzer bir local_manifest dosyası olacaktır.
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>
repo sync dediğinizde ise toplam proje sayısının 364 olduğunu görebilirsiniz.
Ekli resimleri görüntülemek için kayıt olmalısınız
İ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ı
Eğer HTC cihazınız yoksa HTC cihaz kaynak kodu repolarına da ihtiyacınız yoktur. Aynı şekilde diğer cihaz üreticileride buna dahil... android_device_common gibi genel repoları ve sahip olduğunuz cihazın (mesela Sony için device/sony/common) genel repolarını silmeyin.Ayrıca cihazınızın cihaz(device) kaynak kodları yoksa cihazınıza donanımsal olarak benzer özellikteki repoları silmezseniz kendi cihazınızın kodlarını hazırlarken bunlardan faydalanabilirsiniz.
2) Kullanmayacağınız kernel kaynak kodlarını kaldırabilirsiniz.
Kod:
kernel/asus/grouper
kernel/lge/mako
kernel/oneplus/msm8974
Bu repoların çoğu boyut olarak büyük dosyalardır. Kullanmadıklarınızı kaldırmanız işinizi hızlandırır.
3) Kullanmayacağınız üretici kaynak kodlarını kaldırabilirsiniz.
Kod:
vendor_htc
vendor_lge
vendor_samsung
vendor_motorola
Nexus cihazlar TheMuppets üretici adını kullanır.
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ı
5) Macintosh üzerinde derleme yapmayacaksanız darwin derleyicilerini kaldırın.
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" />
Yukardaki satırlar dışındaki darwin araçlarını kaldırmayın.
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
Diyelim ki Cyanogenmod kaynak kodunu alttaki kodla indiridiniz ve kullandınız.
Kod:
repo init -u git//www.github.com/CyanogenMod/android.git -b cm-10.1
repo sync -j4
Ekli resimleri görüntülemek için kayıt olmalısınız
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.
Ekli resimleri görüntülemek için kayıt olmalısınız
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
ICS ve daha eski sürümler için;
Kod:
USE_CCACHE=1
export CCACHE_DIR=/source-directory/prebuilt/linux-x86/ccache/ccache
Bu işlemi yaptıktan sonra ucbirimden(terminal) kaynak kodun tutulduğu dizine girip alttaki kodu yazın.
Kod:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
ICS ve daha düşük versiyonlar CCACHE'yi buna göre ayarlarlar.
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.
Linkleri görüntülemek için kayıt olmalısınız
ROM için;
İndirdiğiniz dosyayı resimde gösterilen dizine çıkarın.
Ekli resimleri görüntülemek için kayıt olmalısınız
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.
Ekli resimleri görüntülemek için kayıt olmalısınız
Kernel için;
İndirdiğiniz dosyayı /prebuilt/linux-x86/toolchains/ dizinine çıkarın.
Ekli resimleri görüntülemek için kayıt olmalısınız
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.
Ekli resimleri görüntülemek için kayıt olmalısınız
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 :
Linkleri görüntülemek için kayıt olmalısınız
Github üzerinde örnek kod paketi(commit) :
Linkleri görüntülemek için kayıt olmalısınız
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
Diyelimki bu linkteki resimde mavi kutuyla gösterilen kod paketini çekmek istiyoruz.
Linkleri görüntülemek için kayıt olmalısınız
İ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
isim- repoya verebileceğiniz herhangi bir isim. Bu ismi fetch komutunda kullanıcaz.
url- reponun bağlantı adresi
Kod:
git fetch isim
Kod:
git fetch pico
Ekli resimleri görüntülemek için kayıt olmalısınız
Ş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
Ekli resimleri görüntülemek için kayıt olmalısınız
İş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 paketi romunuzla uyumlu değil demektir. Eksik satır veya kod çakışması olmuş olabilir. Hatanın nerden kaynaklandığını bulmak için alttaki kodu kullanın.
Kod:
git status
Yeşil dosyalarda sorun olmadan kod eklenmiş/çıkartılmıştır. Kırmızılar ise sorunludur. Kırmızı dosyaları açıp tek tek elle düzeltmek gerekir. İlk olarak alttaki kodla bozuk kodun bulunduğu dosyayı açın.(Dosya dizinindende açabilirsiniz.)
Kod:
gedit kırmızıyla-yazan-dosya-dizini
Hatalı yer alttaki şekilde görünecektir.
Kod:
<<<<<HEAD
<Orjinal Kod>
=======
<Cherry-pick kodu>
>>>>>Cherry Pick Kodunun Adı
Ekli resimleri görüntülemek için kayıt olmalısınız
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.
Ekli resimleri görüntülemek için kayıt olmalısınız
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
Bütün satırlar yeşilse işlemi bitiriyoruz.
#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)
device.mk içine alttaki kodu ekleyin.
Kod:
PRODUCT_PACKAGES += \
İsim
Eklediğiniz APK başka dosyalarında ROM içinde bulunmasını gerektiriyorsa alttaki kodla kaynak koddaki bir dosyayı ROMa taşıtabilirsiniz.
Kod:
PRODUCT_COPY_FILES += \
dosyanın-kaynak-kod-klasörü-içindeki-yeri:ROM.zip-içindeki-yeri
Örnek (libjackpal-androidterm3.so ve libjackpal-androidterm4.so dosyalarının ikisinide taşıtmak için)
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
device içinde cihazınızın kodlarının bulunduğu dizine girin. Örneğin device/motorola/falcon. device.mk dosyasını açıp alttaki satırları yapıştırın.
Kod:
PRODUCT_PACKAGES += \
Gallery2
Ekli dosyalar
Eklentileri görebilmek için Giriş yap veya üye ol.
Son düzenleme: