Android Kernel'inizi En Son Linux Kararlılığına Güncelleme

Ubuntu veya Mint gibi en yaygın Linux dağıtımlarını bile değil, çekirdeğin her bir parçasını oluşturur. Bu, bu düzeltmeleri yapmamanız gerektiği anlamına gelmez çünkü ARE sürücüler için düzeltmeler YAPMAK Çalıştırmak. Sırasıyla en yaygın Android mimarisi ve dosya sistemi olan arm / arm64 ve ext4'ü ele alalım. 4.4.78'de (en son Oreo CAF etiketinin sürümü) 4.4.121'e (en son yukarı akış etiketi) kadar, bunlar bu sistemlerin taahhütleri için aşağıdaki numaralardır:



nathan @ flashbox ~ / çekirdekler / linux kararlı (ana) $ git günlüğü --format =% h v4.4.78..v4.4.121 | wc -l2285 nathan @ flashbox ~ / çekirdekler / linux-kararlı (ana) $ git log --format =% h v4.4.78..v4.4.121 arch / arm | wc -l58 nathan @ flashbox ~ / kernels / linux-stabil (ana) $ git log --format =% h v4.4.78..v4.4.121 arch / arm64 | wc -l22 nathan @ flashbox ~ / çekirdekler / linux-kararlı (ana) $ git log --format =% h v4.4.78..v4.4.121 fs / ext4 | wc -l18

En çok zaman alan kısım ilk ortaya çıkan kısımdır; Tamamen güncel olduğunuzda, genellikle 100'den fazla kayıt içermeyen yeni bir sürümde birleşmek hiç zaman almaz. Bunun getirdiği faydalar (kullanıcılarınız için daha fazla istikrar ve daha iyi güvenlik) bu süreci gerektirmelidir.

Linux Kararlı Çekirdeği Android Çekirdeğine Nasıl Birleştirilir

Öncelikle Android cihazınızın hangi çekirdek sürümünü çalıştırdığını bulmanız gerekir.

Ne kadar önemsiz görünse de, nereden başlamanız gerektiğini bilmek gerekir. Çekirdek ağacınızda aşağıdaki komutu çalıştırın:

çekirdek sürümü yapmak

Bulunduğunuz sürüme geri dönecektir. İlk iki sayı, ihtiyacınız olan dalı bulmak için kullanılacaktır (örneğin, herhangi bir 4.4 çekirdek için linux-4.4.y) ve son sayı, birleştirmeye başlamak için ihtiyacınız olan sürümü belirlemek için kullanılacaktır (örneğin, 4.4 üzerindeyseniz .21, sonra 4.4.22'yi birleştireceksiniz).

Kernel.org'dan en son çekirdek kaynağını edinin

kernel.org en son çekirdek kaynağını barındırır linux kararlı deposu . Bu sayfanın altında, üç getirme bağlantısı olacaktır. Tecrübelerime göre, Google'ın aynası en hızlı olma eğilimindedir, ancak sonuçlarınız değişebilir. Aşağıdaki komutları çalıştırın:

git uzaktan linux kararlı ekle https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.gitgit linux-stabil getir

Çekirdeğin tamamını mı birleştirmek istediğinize karar verin, yoksa kesinleri seçin

Ardından, taahhütleri birleştirmek mi yoksa kiraz seçmeyi mi birleştirmek istediğinizi seçmeniz gerekecek. İşte her birinin artıları ve eksileri ve bunları ne zaman yapmak isteyebileceğiniz.

NOT: Çekirdek kaynağınız bir tarball biçimindeyse, büyük olasılıkla seçmeniz gerekecek, aksi takdirde git, OEM veya CAF'nin değiştirdiği şeyi değil, geçmişi tamamen yukarı akışa göre doldurduğu için binlerce dosya çakışması elde edeceksiniz. 4. adıma atlayın.

Kiraz toplama:

Artıları:

  • Hangi çatışmanın soruna neden olduğunu tam olarak bildiğiniz için çatışmaları çözmek daha kolay.
  • Her taahhüt kendi başına olduğu için yeniden temel almak daha kolaydır.
  • Sorunlarla karşılaşıldığında ikiye bölünmesi daha kolay

Eksileri:

  • Her kaydetmenin ayrı ayrı seçilmesi gerektiğinden daha uzun sürer.
  • İlk bakışta commit'in yukarıdan gelip gelmediğini söylemek biraz daha zor

Git

Artıları :

  • Tüm temiz yamaların birleşmesini beklemeniz gerekmediği için daha hızlıdır.
  • Bir commit'in ne zaman yukarı akıştan geldiğini görmek daha kolaydır, çünkü siz sorumlu olmayacaksınız, yukarı akış bakımcısı olacaktır.

Eksileri:

  • Çatışmaları çözmek biraz daha zor olabilir çünkü git log / git blame kullanarak hangi commit'in çatışmaya neden olduğunu araştırmanız gerekecek, bu size doğrudan söylemez.
  • Yeniden satış yapmak zordur çünkü bir birleştirmeyi yeniden yapamazsınız, tüm taahhütleri tek tek seçmeyi teklif eder. Ancak, sık sık yeniden pazarlama yapmamalısınız, bunun yerine mümkünse git revert ve git merge kullanın.

Başlangıçta herhangi bir sorun çatışmasını çözmek için bir seçim yapmanızı, birleştirme işlemini gerçekleştirmenizi, ardından daha sonra sorun taahhütlerini geri döndürmenizi öneririm, böylece güncelleme daha kolaydır (çünkü güncel olduktan sonra birleştirme daha hızlıdır).

İşlemleri kaynağınıza birer birer ekleyin

Bu sürecin en önemli kısmı, her seferinde bir versiyondur. Yukarı akış serinizde, önyükleme ile ilgili bir soruna neden olabilecek veya ses veya şarj gibi bir şeyi bozabilecek bir sorun yaması OLABİLİR (ipuçları ve püf noktaları bölümünde açıklanmıştır). Artımlı sürüm değişiklikleri yapmak bu nedenle önemlidir, bazı sürümler için 2000'den fazla kaydetmeden 50 işlemde bir sorun bulmak daha kolaydır. Yalnızca tüm sorun taahhütlerini ve çatışma çözümlerini öğrendikten sonra tam bir birleştirme yapmanızı öneririm.

Kiraz toplama

Biçim:

git kiraz çekme ..

Misal:

git kiraz-seçim v3.10.73..v3.10.74

Git

Biçim:

git merge

Misal:

git merge v3.10.74

# İşaretlerini kaldırarak birleştirme işlemlerinde çakışmaları takip etmenizi öneririm.

Çatışmalar Nasıl Çözülür?

İyi bir C dili bilgisi içerdiğinden, her bir çatışmayı çözmek için adım adım bir kılavuz veremeyiz, ancak işte birkaç ipucu.

Eğer birleşiyorsanız, çatışmaya neyin sebep olduğunu bulun. Bunu iki yoldan biriyle yapabilirsiniz:

  1. git log -p v $ (kernelversion olun) .. mevcut sürümünüz ile yukarı akıştan en son sürüm arasındaki değişiklikleri almak için. -P bayrağı, görebilmeniz için her kaydetme tarafından yapılan değişiklikleri size verecektir.
  2. Alandaki her işlemenin karmalarını almak için dosyada git blame komutunu çalıştırın. Ardından, kaydedicinin ana hattan / kararlı sistemden, Google'dan veya CodeAurora'dan olup olmadığını görmek için git show –format = fuller komutunu çalıştırabilirsiniz.
  • Taahhüdünüz olup olmadığını anlayın. Google veya CAF gibi bazı satıcılar, Dirty COW düzeltmesi gibi kritik hatalar için yukarı akış aramaya çalışacak ve bunların backport'ları yukarı akışlarla çakışabilir. Git log –grep = ”” komutunu çalıştırabilir ve herhangi bir şey döndürüp döndürmediğine bakabilirsiniz. Varsa, yürütmeyi atlayabilir (git reset –hard && git cherry-pick –continue kullanarak kiraz toplama yapılıyorsa) veya çakışmaları yok sayabilirsiniz (<<<<<>>>>>).
  • Çözümü bozan bir arka port olup olmadığını anlayın. Google ve CAF, kararlı olmayan belirli yamaları desteklemek istiyor. Stable'ın çoğu zaman ana hat taahhüdünün çözünürlüğünü Google'ın arka portu tercih ettiği belirli yamaların eksikliğine uyarlaması gerekir. Git show'u çalıştırarak ana hat kaydına bakabilirsiniz (ana hat karması, kararlı kaydetme işleminin commit mesajında ​​mevcut olacaktır). Ortalığı karıştıran bir arka plan varsa, değişiklikleri atabilir veya ana hat sürümünü kullanabilirsiniz (genellikle yapmanız gereken şey budur).
  • Kaydın ne yapmaya çalıştığını okuyun ve sorunun halihazırda çözülüp çözülmediğine bakın. Bazen CAF, yukarı akıştan bağımsız bir hatayı düzeltebilir; bu, yukarı akış için düzeltmelerinin üzerine yazabileceğiniz veya yukarıdaki gibi iptal edebileceğiniz anlamına gelir.

Aksi takdirde, yalnızca bir CAF / Google / OEM eklemesinin bir sonucu olabilir, bu durumda sadece bazı şeyleri karıştırmanız gerekir.

Burada Linux kararlı kernel.org deposunun bir aynası GitHub'da, çatışma çözümü için yürütme listeleri ve farkları aramak daha kolay olabilir. İlk önce yürütme listesi görünümüne gitmenizi ve sizinkiyle karşılaştırmak için orijinal farkı görmek için sorunlu işlemeyi bulmanızı öneririm.

Örnek URL: https://github.com/nathanchance/linux-stable/commits/linux-3.10.y/arch/arm64/mm/mmu.c

Bunu komut satırı üzerinden de yapabilirsiniz:

git log .. git göster

Çözümleri çözmek tamamen bağlamla ilgilidir. HER ZAMAN yapmanız gereken, aşağıdaki komutları iki ayrı pencerede çalıştırarak son farkınızın yukarı akışla eşleştiğinden emin olmaktır:

git diff HEAD git fark v $ (çekirdek sürümü yap) .. $ (git etiketi --sort = -taggerdate -l v $ (kernelversion yap | cut -d. -f 1,2) * | head -n1)

Yeniden yayınlamayı etkinleştir

Git, yenidenere adında bir özelliğe sahiptir (Kaydedilmiş Çözünürlüğü Yeniden Kullan anlamına gelir), yani bir çakışma algıladığında, daha sonra yeniden kullanabilmeniz için onu nasıl çözdüğünüzü kaydedeceği anlamına gelir. Bu, hem birleştirme hem de kiraz toplama ile hem kronik rebaserler için özellikle yararlıdır, çünkü sadece git add çalıştırmanız gerekecektir. && git –çatışma daha önce çözdüğünüz gibi çözüleceğinden yukarı akış getirmeyi yeniden yaparken devam edin.

Çekirdek deponuzda aşağıdaki komutu çalıştırarak etkinleştirilebilir:

git config rerere.enabled true

Bir derleyiciye veya çalışma zamanı hatası çalıştırılırken git bisect nasıl yapılır

Oldukça fazla sayıda commit ekleyeceğiniz göz önüne alındığında, bir derleyici veya çalışma zamanı hatası vermeniz çok olasıdır. Sadece pes etmek yerine, sorunun temel nedenini bulmak için git’in yerleşik ikiye bölme aracını kullanabilirsiniz! İdeal olarak, ekledikçe her bir çekirdek sürümünü oluşturuyor ve yanıp sönüyor olacaksınız, böylece ikiye bölmek gerekirse daha az zaman alacaktır, ancak 5000 işlemi herhangi bir sorun olmadan ikiye bölebilirsiniz.

Git bisect'in yapacağı şey, sorunun mevcut olduğu yerden mevcut olmadığı yere kadar bir dizi taahhüt almak ve ardından taahhüt aralığını yarıya indirmeye başlamak, oluşturmanıza ve test etmenize ve iyi olup olmadığını bilmenize izin vermektir. . Sorununuza neden olan kaydı bitirene kadar buna devam edecektir. Bu noktada, onu düzeltebilir veya geri döndürebilirsiniz.

  1. İkiye bölmeye başla: git bisect başlangıç
  2. Geçerli düzeltmeyi kötü olarak etiketleyin: git bisect kötü
  3. Bir revizyonu iyi olarak etiketleyin: git bisect good
  4. Yeni revizyonla oluşturun
  5. Sonuca bağlı olarak (sorun varsa veya yoksa) git: git bisect iyi OR git bisect kötü söyle
  6. Durulayın ve sorun işleme bulunana kadar 4-5 arasındaki adımları tekrarlayın!
  7. Sorun kaydetmeyi geri alın veya düzeltin.

NOT: Birleşmelerin, tüm yamaları doğru şekilde ikiye bölmek için şubenize uygulamak için geçici olarak git rebase -i çalıştırması gerekecek, çünkü yerinde birleşmelerle ikiye bölmek çoğu zaman yukarı akıştaki taahhütleri ödünç alma zamanına neden olacak, yani Android'e özgü taahhütlerden hiçbirine sahip değilsiniz. İstek üzerine bu konuda daha derinlere inebilirim ama güven bana, buna ihtiyaç var. Sorun taahhüdünü belirledikten sonra, geri döndürebilir veya yeniden birleştirerek birleştirebilirsiniz.

Yukarı akış güncellemelerini ezmeyin

'Daha temiz' ve yönetimi 'daha kolay' olduğu için birçok yeni geliştirici bunu yapma eğilimindedir. Bu birkaç nedenden dolayı korkunç:

  • Yazarlık kayboldu. Çalışmaları için kredilerinin ödenmesi diğer geliştiriciler için haksızlıktır.
  • İkiye ayırmak imkansız. Bir dizi kaydetmeyi bastırırsanız ve bu seride bir sorun varsa, squash'ta hangi işlemenin soruna neden olduğunu söylemek imkansızdır.
  • Gelecekteki kiraz toplama işleri daha zor. Ezilmiş bir seriyle yeniden temel almanız gerekiyorsa, bir çatışmanın nereden kaynaklandığını söylemek zor / imkansızdır.

Zamanında güncellemeler için Linux Kernel posta listesine abone olun

Bir yukarı akış güncellemesi olduğunda bildirim almak için şu adrese abone olun: linux-kernel-duyuru listesi . Bu, her yeni çekirdek piyasaya sürüldüğünde bir e-posta almanıza olanak tanır, böylece mümkün olduğunca çabuk güncelleme ve itme yapabilirsiniz.

9 dakika okundu