ROM taşıma için boot.img nasıl paketlenir ve düzenlenir?


14

Bu ROM'u son zamanlarda Allview P5 için indirdim (Allview P5, Gionee GN700W / FLY IQ441 / QMobile Noir A8'in eşdeğeri). Primonex ROM denir ve telefonun Gionee sürümü için yapılır.

  • İlk olarak, olduğu gibi yüklemeye çalıştım ama önyükleme ekranında sıkıştı.
  • Bazı araştırmalardan sonra boot.imgdosya ile ilgili bir sorun olabileceğini öğrendim ve nasıl ayıklanacağını veya düzenleneceğini bilmiyorum ...

Birisi bana nasıl yapılacağını söyleyebilir mi?

Yanıtlar:


12

Araç seçimi

Burada sunduğum yöntem CyanogenMod'un Android kaynak koduna dayanıyor.

Google'ın AOSP sadece aracı sağlarken inşaboot.img dosyayı, CyanogenMod da ekler unpackbootimgsize izin aracı paketten onu. Bu araç CyanogenMod için herhangi bir şekilde özel olarak tasarlanmamış gibi görünmektedir, bu nedenle çoğu olasılık diğer ROM'larda da çalışacaktır.

Bununla birlikte, boot.imgdosyayı açmak için, az ya da çok aynı şekilde çalışan görece çok sayıda alternatif vardır .

Temel olarak, bu tür bir açma aracı boot.imgdosyanın içeriğini çıkarır ve mkbootimgyapılandırması (esas olarak çekirdek parametreleri ve bellek adresleri) orijinaliyle eşleşecek bir dosya oluşturmak için Google'ın aracına geçmeniz gereken bir dizi parametre görüntüler .

İşte birkaç örnek, onları kişisel olarak test etmedim, bu yüzden tavsiye edemem ve sadece referans amaçlı olarak sunuyorum:

  • Bazıları açık kaynak kodlu veya script tabanlı:

    • Android Kitchen'ın görünüşe göre Android geliştiricileri için bir tür İsviçre çakısı olması gerekiyordu. Orijinal yazar resmi olarak projenin bakımını durdurdu, birkaç kullanıcı javilonas veya cmotc gibi çatalladı .
    • szym , komple açma ve yeniden paketleme işlemini daha basit hale getirmek için araç setine kabuk komut dosyası sarmalayıcıları ekleyerek kolaylığı hedefler.
    • osm0sis , projenin açıklamasına göre CyanogenMod'un "çatallı ve güncellenmiş" araçlarından oluşan bir çatal öneriyor . Bu proje gerçekten de bu alanda çok yaygın olmayan hala devam ediyor gibi görünüyor, ancak CyanogenMod'un orijinal araçlarına göre gerçek avantajı benim için belirsiz.
  • Bazıları kapalı kaynak kodlu ücretsiz ikili dosyalardır:

    • Kuisma enunmkbootimg sık yardım forumlarında görünür ve garip vakaların ele alınmasında yardımcı olur, mkbootimgkaynak kodunda bazı değişiklikler gerektiğinde "insan tarafından okunabilir" İngilizce tavsiye verir ve görüntüyü yeniden oluşturmak için kullanılacak komut satırını gösterir.
    • Xiaolu'nunmkbootimg_tools da sık sık bahsedildiği görülüyor boot.imgve cihaz ağacı dosyasını açıp paketlemeye izin veriyor dt.img. O GitHub'dan barındırılan gerçeği ile kanmayın: o olduğunu kapalı bir kaynak tescilli ikili ve tek derlenmiş ikililerinin depo mevcuttur (aslında ben bile saklamak için bir kaynak kod havuzunu kullanarak kesin ilgi merak ediyorum İkili lekeler, ama farklı insanlar, farklı zihinler ...).
    • XDA forumundaki CNexus , çeşitli araçlar içeren bir arşiv sunar.
    • Unix.SE'deki bu cevap , şu anda geçersiz olan Android Seri Port projesinden bazı araçlar önermektedir . Ancak dosya adları, bunların CyanogenMod'un araçlarının önceden oluşturulmuş eski versiyonları olması gerektiğini düşündürüyor (proje kapatılıyor, ne dokümantasyon ne de destek var).

Tüm bu araçlar (ve herhangi bir arama motorunda bulabileceğiniz diğerleri) aynı şekilde çalışmalıdır, ancak bazıları kendi cihazınızla karşılaşabileceğiniz belirli kenar durumlarını ele alırken diğerlerinden daha iyi çalışabilir. Bununla birlikte, çoğu, en azından açık kaynak arenasında düzenli olarak görünmüyor, bu yüzden çalışma, bakım ve belgeleme araçlarına sahip olmak için en iyi bahis CyanogenMod'larla gitmek.

Bazı üreticiler AOSP standardından (normal olmayan adresler, başlıklar, dosya formatı vb.) Az çok uzak ROM'lar üretir. Aşağıdaki standart prosedür işe yaramazsa, bu alternatif yazılımlardan biri hile yapabilir. Aksi takdirde, cihazınıza özgü sorunları kontrol etmeniz gerekir: bazılarının belirli bir prosedüre veya hatta belirli araçlara ihtiyacı vardır ( örneğin, bu soruyu MediaTek cihazlarıyla ilgili olarak verin).

Araçlar kurulumu

boot.imgAmbalajlama ve ambalajdan çıkarma için CyanogenMod araç setinin derlenmesi oldukça basittir.

  • Zaten tam Android kaynak kodu ağacı yüklediyseniz (kontrol edebilirsiniz benim diğer cevabı gitmek, bu konuda daha fazla bilgi almak için) system/core/mkbootimg/(dizine bir hatırlatma olarak, Google'ın AOSP kaynak kodu yalnızca kurmak için aracı sağlamak boot.imgdosyayı, yaptıkları değil herhangi bir açma aracı sağlayın),
  • Buna başka bir amaçla ihtiyacınız yoksa ve ihtiyacınız yoksa, daha kolay ve hızlı bir çözüm yalnızca CyanogenMod'un android_system_core deposunu klonlamaktır :

    git clone https://github.com/CyanogenMod/android_system_core.git
    cd android_system_core/mkbootimg/
    

Doğru dizine girdikten sonra derleyin ve yükleyin:

gcc -o ./mkbootimg -I ../include ../libmincrypt/*.c ./mkbootimg.c
gcc -o ./unpackbootimg -I ../include ../libmincrypt/*.c ./unpackbootimg.c
sudo cp ./mkbootimg ./unpackbootimg /usr/bin/

Google C görevden aldığını Not mkbootimgile bir Python sürümü gelecekteki sürümlerinde hiçbir derleme bu komut için artık gerekli olabilir bu nedenle,.

Telefonunuzla iletişim kurması için bilgisayarınıza Android araçları da yüklemeniz gerekir. Sen gerekecektir adb(Android Debug Bridge, Android'in ayıklama alt sistemi ile iletişim kurmasını sağlayan bir kabuk programı), adbd(ilgili cin) ve fastboot(telefonunuzun bootloader sistemi ile iletişim kurmasını sağlayan bir kabuk programı).

En sevdiğiniz Linux dağıtımınız bunları tek veya ayrı bir pakette sağlayabilir, ancak genellikle her zaman "android araçları" olarak adlandırılır:

  • Debian / Ubuntu: sudo apt-get install android-tools-{adb,adbd,fastboot}
  • Fedora / CentOS: sudo yum install android-tools
  • openSUSE: sudo zypper install android-tools

boot.imgDosyayı getir

Boot.img dosyasını ROM .zip dosyasından veya doğrudan aygıttan çıkarın:

  • Stok ROM .zip dosyasından: SuperSU gibi bazı uygulamalar boot.img'yi doğrudan aygıtta değiştirebilir, stokla değiştirmek, bu tür uygulamaları bozar.
  • Doğrudan cihazdan: bazı kişiler bozulmaya yol açan okuma sorunu bildirir boot.img. IMO, bu sorunlar büyük olasılıkla zayıf USB kablolarının veya USB hub'ının kullanımıyla bağlantılıdır ve telefonu doğrudan bilgisayara bağlayan kaliteli kablolar kullanılarak kolayca önlenebilir. ADB'yi kök modunda da çalıştırabilirsiniz (kullanılan ROM'a bağlı olarak, bu önemsiz olabilir veya olmayabilir).

İlk yöntem çok açıktır: .zip dosyasını herhangi bir ZIP yazılımı ile ayıklayın, dosya boot.imgarşivin kökünde tam orada olmalıdır.

İkinci yöntem için, önce depolama cihazının boot.imgiçeriğinin alınabileceği (ne yazık ki cihaza özel) yolu belirlemeniz gerekir. Bunun için iki yöntem biliyorum:

  • ls /dev/block/platform/*/by-name/(burada *kapakları henüz başka cihaza özel klasör adı, büyük ihtimalle bunun altında tek dizindir vardır platform/), arama kesin adı da platformu bağlıdır ama her zamanki mantıklı (bazı örnekler: boot, LNX"Linux") için (kısaltma). Bu dizindeki dosyalar aslında sembolik bağlantılardır ve bazı insanlar hedefe manuel olarak gitmeyi zahmete sokarlar, ancak daha uzun süre daha az hataya eğilimli kalan daha yüksek seviyeli isme dayalı yolla yapışmayı öneriyorum. Böylece böyle bir yolla bitireceksiniz /dev/block/platform/sdhci-tegra.3/by-name/LNX.
  • Bazı (eski?) Cihazlarda, çıktısı incelenerek doğru cihaz bulunabilir cat /proc/mtd. Etiketle mtd2ilişkilendirilmiş cihazı görürseniz "boot"yolu kullanırsınız /dev/mtd2.

Şimdi:

  • Telefonun geliştirici menüsünden:
    • Telefonunuzda hata ayıklamayı etkinleştirin,
    • ADB'ye kök erişimine izin ver (bu adım CynogenMod çalıştıran telefonlar için geçerlidir, diğer cihazlar potansiyel olarak daha karmaşık bir prosedür gerektirebilir),
  • Bilgisayarınıza bağlayın (ve sanal bir makineden Android araçları kullanıyorsanız, oradan VM misafirine).

Bu önceden yapılmadıysa, ADB sunucusunu bilgisayar tarafında manuel olarak başlatmanızı öneririm, bu, aşağıdaki ADB komutlarının davranışını etkilemeden cihazın yanındaki RSA anahtarını doğrudan doğrulamanızı sağlar:

adb start-server

Ardından kök modunda ADB'yi değiştirin:

adb root

Son olarak, boot.imgbu komutu kullanarak dosyayı aygıttan doğrudan ayıklayabilmeniz gerekir (kaynak ve hedef yolu ve adları örnek olarak verilir, ihtiyaçlarınıza ve tercihlerinize uyarlayın):

adb pull /dev/block/platform/sdhci-tegra.3/by-name/LNX ./boot.img

Komut, hem kullanılmış hem de boş alanı tüm bölümü kopyalayacaktır, bu nedenle elde edilen boot.imgdosyanın boot.imgstok ROM .zip dosyasıyla birlikte gelen orijinal dosyadan daha büyük olacağına şaşırmayın , içeriğin kendisi benzer kalır.

Aktarım tamamlandığında, telefonun bağlantısını kesin ve geliştirici menüsünden hem hata ayıklamayı hem de kök erişimini devre dışı bırakmayı unutmayın.

Orijinal boot.imgdosyayı ambalajından çıkarın

boot.imgDaha önce derlenmiş komutu kullanarak dosyanın kendisini açın :

unpackbootimg -i ./boot.img

Bu boot.img, stoğa göre doğru yapıya sahip bir yeniyi yeniden oluşturmanıza izin vermek için gerekli olan birkaç bilgiyi verecektir boot.img. Ancak, CyanogenMod's upackbootimgaynı bilgileri daha sonra kullanacağımız birkaç dosyaya da kaydettiğinden not defterine acele etmeyin .

Bu komut, giriş dosyasının adına belirli sonekler eklenmiş birkaç dosya oluşturur:

  • *-second: Bu ikinci aşama önyükleyicidir, isteğe bağlı ve son kullanıcı telefonlarında nadiren kullanılır. Bu dosya boşsa (en yaygın durum), telefonun önyükleyici doğrudan Linux çekirdeğini çağırır.
  • *-zImage: Bu Linux çekirdeği.
  • *-ramdisk.gzveya *-ramdisk.lz4: aygıtın kök dizinini doldurmak için kullanılan RAM diski. Uzantı, kullanılan sıkıştırma algoritmasına bağlı olarak farklılık gösterir.
  • *-dt: Yerleştirilen aygıt ağacı /dev.
  • Geri kalan her biri unpackbootimgçıktıda gösterilen değerlerden birini saklayan küçük dosyalardır . Bu değerler, Linux çekirdeğine iletilecek komut satırı parametresini ve önyükleyicinin her nesneyi önyükleme zamanında yüklemesi gereken adresleri tanımlar.

Çoğu zaman, boot.imgtelefonun kök dizininin içeriğini düzenlemek için. Yukarıda görüldüğü gibi, bu içerik *-ramdisk.gzveya *-ramdisk.lz4dosyada saklanır ve aşağıdaki komutlar kullanılarak çıkarılabilir:

mkdir ./ramdisk
cd ./ramdisk/
gzip -dc ../boot.img-ramdisk.gz | cpio -imd

LZ4 sıkıştırılmış RAM disk için son adımı ile değiştirin lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd.

Devam etmeden önce istediğiniz değişikliği yapmakta özgürsünüz. Bununla birlikte, araçlarınızın beklendiği gibi çalıştığından emin olmak için hiçbir şeyi değiştirmeden paketten çıkarma - yeniden paketleme - önyükleme yordamını bir kez izlemeye değer olabilir. Aksi takdirde, bir sorun olması durumunda, nedenin değişikliğiniz veya bazı uyumsuzluk olup olmadığından emin olmayacaksınız (başlangıçta standart olmayan prosedürler veya araçlar gerektiren bazı üreticiler hakkındaki açıklamalarıma bakın).

Yeni new-boot.imgdosyayı almak için yeniden oluştur

CyanogenMod ROM oluşturma işlemi mkbootfs, boot.imgdosyayı üretmek için dahili bir araca dayanır (bu build / tools / releasetools / common.py dosyasında gerçekleşir ). Ancak, bu aracı oluşturma adımları benim cpioiçin işe yaramaz derecede karmaşık görünüyor, ancak sağlanan sistemi kullanmak da aynı derecede iyi görünüyor. İkisi arasındaki temel fark, mkbootfssos kodunda (çok) hızlı bir kontrolden sonra anladığım kadarıyla , ikincisinin, aşağıdaki dosyaları temel /rootalan cpioprosedür sırasında noktalı dosyaları ve sonuç arşivine dizini dahil etmeyerek bazı akıl sağlığı önlemleri uyguladığı gibi görünüyor. sadece seçilen dizin ağacını körü körüne arşive koyacaktır.

Sonuç: çok az avantajla derlemek için gereksiz derecede karmaşık, bu yüzden sistem tarafından sağlanan araçlara sadık kalalım!

Yeni RAM diskini oluşturarak başlayın, ramdiskyukarıda oluşturulan dizinden şunu yazın:

find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | gzip > ../new-boot.img-ramdisk.gz

Veya bir LZ4 arşivi oluşturmanız gerekirse:

find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | lz4 > ../new-boot.img-ramdisk.lz4

Buradaki amaç, orijinal dosyaya olabildiğince yakın özelliklere sahip yeni bir RAM disk dosyası oluşturmaktır (örneğin, sahibinin forumlarda ve bloglarda paylaşılan prosedürlerde genellikle eksik görünmesi, ancak bu benim cihazımda gerekliydi).

new-boot.imgDosyanın kendisini oluşturmak için şimdi üst dizine gidin .

cd ..

Yukarıda görüldüğü gibi, CyanogenMod'un unpackbootimgkomutu , beklenen her parametreyle eşleşen bir dosya oluşturur mkbootimg. Bu nedenle, yapmanız gereken tek şey, mkbootimg -htüm parametrelerin bir listesini almak, ardından eşleşen dosyayı kullanarak her birini uygun değere ayarlamaktır. Bazı parametrelerin dosya yolu beklerken, diğerleri dosyanın içeriğini değer olarak almayı beklediğini unutmayın. Aşağıdaki komutla ilgili bir örneğe bakın:

mkbootimg --kernel ./boot.img-zImage \
--ramdisk ./new-boot.img-ramdisk.gz \
--second ./boot.img-second \
--cmdline "$(cat ./boot.img-cmdline)" \
--base "$(cat ./boot.img-base)" \
--pagesize "$(cat ./boot.img-pagesize)" \
--dt ./boot.img-dt \
--ramdisk_offset "$(cat ./boot.img-ramdisk_offset)"
--second_offset "$(cat ./boot.img-second_offset)" \
--tags_offset "$(cat ./boot.img-tags_offset)" \
--output ./new-boot.img

Burada yalnızca iki parametre ayarlanmamıştır:

  • --board: Anladığım kadarıyla, bu sadece ortaya çıkan görüntüye bir model adı eklemeye izin veren bilgilendirici bir alandır.
  • --id: Bu herhangi bir değer beklemez, sadece görüntü oluşturulduktan sonra benzersiz bir tanımlayıcı yazdırır (zaman damgası ve sağlama toplamı birleştirerek).

new-boot.imgDosyayı cihaza flash

  • Cihazı hızlı önyükleme modunda başlatın (genellikle güç ve ses açma düğmelerini basılı tutarak önyükleyici modu olarak da bilinir).
  • USB kablosunu bağlayın.
  • Cihazın doğru tespit edildiğini kontrol edin:

    sudo fastboot devices
    
  • Yeni ROM'u kullanarak önyüklemeyi deneyin (henüz yanıp sönmeden, bu nedenle sorun olması durumunda, izlere geri dönmek için telefonu yeniden başlatmanız, ./new-boot.imgdosya adını kendi adınızla değiştirmeniz yeterlidir):

    sudo fastboot boot ./new-boot.img
    
  • Telefon yeni önyükleme görüntüsü ile başarılı bir şekilde çalışıyorsa, fastboot moduna geri dönün ve kalıcı olarak yanıp sönün:

    sudo fastboot flash boot ./new-boot.img
    sudo fastboot reboot
    

Sonuç

Bu prosedür ilk başta göz korkutucu görünebilir, ancak bir kez aldığınızda, aslında olmadığını göreceksiniz.

"Göz korkutucu" yönü, tek bir "Android sistemi" olmadığı gerçeğinden geliyor: birçok üretici ve ROM sağlayıcı, ince bir yol farkından tamamen standart dışı bir ortama kadar değişebilen değişiklikler yapıyor.

Yapmanız gereken, cihazınızın duruşunu ve sonra da sizin durumunuz için uygun olan birkaç komutun ne olduğunu belirlemektir. Onları aldıktan sonra, onlara yapışabilir ve hatta sık sık ihtiyacınız varsa kolayca komut dosyası oluşturabilirsiniz.

Bazen gönüllü olarak nispeten düşük düzeyli ayrıntılara girdim çünkü sorunlarınızı daha kolay çözmenizi sağlayacaktır. Yeni 'nizi oluşturmak ve flaş yapmak için bazı "daha kolay" opak yardımcı programı kullanır mısınızboot.img dosyanızı cihazınızın onunla başlayamadığını görürseniz, hangi adımın yanlış gittiğini belirlemeniz daha zor olacaktır. Burada, her adımda, manipüle ettiğiniz verileri orijinal boot.imgdosyadan gelen verilerle veya telefonda görülen verilerle karşılaştırabilir veya örneğin boot.imgdosyayı orijinal veya yeni oluşturulan ile yeniden oluşturmayı deneyebilirsiniz. Herhangi bir fark yaratıp boot.imgyaratmadığını kontrol etmek için RAM disk dosyası (bu, sorunun veya RAM disk dosyası oluşturma prosedüründen kaynaklanıp kaynaklanmadığını belirlemenizi sağlar).


2

Android Kitchen'ı kullanın . Boot.img dosyasını açmak / yeniden paketlemek için bir seçenek var Advanced options.


Ne yazık ki orijinal yazar Android Kitchen'ı korumak için resmen durdu: " Bu proje 2013'ten itibaren emekli oldu, çünkü destekleyecek cihaz sayısı, talep, kötü sağlık ve sürekli yardım talepleri ile boğulmuşum ". Birkaç çatal yapılmış olsa da (cevabımda bazı bağlantılar veriyorum), ancak ne kadar desteklendiklerini bilmiyorum (örneğin, sorunları ortaya çıkarmak veya örneğin bir evrim talep etmek için açık bir halka açık yol bulamadım).
WhiteWinterWolf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.