Cara Mengemas kini Kernel Android anda ke Stabil Linux Terkini

membina setiap bahagian kernel, bukan juga distro Linux yang paling biasa seperti Ubuntu atau Mint. Ini tidak bermaksud anda tidak boleh melakukan pembaikan ini kerana ada ADALAH pembaikan untuk pemandu anda LAKUKAN lari. Ambil contoh arm / arm64 dan ext4, yang masing-masing merupakan sistem seni bina dan fail Android yang paling biasa. Dalam 4.4, dari 4.4.78 (versi tag Oreo CAF terbaru) hingga 4.4.121 (tag hulu terkini), ini adalah nombor berikut untuk pelaksanaan sistem tersebut:



nathan @ flashbox ~ / kernel / linux-stable (master) $ git log --format =% h v4.4.78..v4.4.121 | wc -l2285 nathan @ flashbox ~ / kernel / linux-stable (master) $ git log --format =% h v4.4.78..v4.4.121 lengkungan / lengan | wc -l58 nathan @ flashbox ~ / kernel / linux-stable (master) $ git log --format =% h v4.4.78..v4.4.121 arch / arm64 | wc -l22 nathan @ flashbox ~ / kernel / linux-stable (master) $ git log --format =% h v4.4.78..v4.4.121 fs / ext4 | wc -l18

Bahagian yang paling memakan masa adalah pembukaan awal; setelah anda mengikuti perkembangan terkini, tidak memerlukan waktu sama sekali untuk bergabung dalam rilis baru, yang biasanya tidak berisi lebih dari 100 komit. Manfaat yang ditimbulkan (lebih banyak kestabilan dan keselamatan yang lebih baik untuk pengguna anda) semestinya memerlukan proses ini.

Cara Menggabungkan Kernel Stabil Linux menjadi Kernel Android

Mula-mula anda perlu mengetahui versi kernel yang sedang dijalankan oleh peranti Android anda.

Seperti yang remeh seperti ini, adalah perlu untuk mengetahui di mana anda harus bermula. Jalankan arahan berikut di pokok kernel anda:

buat kernelversion

Ia akan mengembalikan versi yang anda gunakan. Dua nombor pertama akan digunakan untuk mengetahui cabang yang anda perlukan (mis. Linux-4.4.y untuk mana-mana kernel 4.4) dan nombor terakhir akan digunakan untuk menentukan versi apa yang perlu anda mulakan dengan penggabungan (mis. Jika anda menggunakan 4.4 .21, anda akan menggabungkan 4.4.22 seterusnya).

Dapatkan sumber kernel terkini dari kernel.org

kernel.org menempatkan sumber kernel terkini di repositori stabil linux . Di bahagian bawah halaman itu, terdapat tiga pautan pengambilan. Menurut pengalaman saya, cermin Google cenderung paling cepat tetapi hasil anda mungkin berbeza. Jalankan arahan berikut:

git remote add linux-stable https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.gitgit ambil linux-stable

Tentukan sama ada anda mahu menggabungkan keseluruhan kernel atau memilih ceri

Seterusnya, anda perlu memilih sama ada anda ingin menggabungkan komit atau memilih ceri. Inilah kebaikan dan keburukan masing-masing dan bila anda mungkin mahu melakukannya.

CATATAN: Sekiranya sumber kernel anda dalam bentuk tarball, kemungkinan besar anda perlu memilih, jika tidak, anda akan mendapat ribuan konflik fail kerana git mengisi sejarah berdasarkan murni di hulu, bukan apa yang telah diubah oleh OEM atau CAF. Langkau sahaja ke langkah 4.

Memetik ceri:

Kelebihan:

  • Lebih mudah untuk menyelesaikan konflik kerana anda tahu dengan tepat konflik apa yang menimbulkan masalah.
  • Lebih mudah untuk melakukan rebase kerana setiap komit dilakukan dengan sendirinya.
  • Lebih senang dibelah dua sekiranya menghadapi masalah

Keburukan:

  • Memerlukan lebih lama kerana setiap komitmen harus dipilih secara individu.
  • Lebih sukar untuk mengetahui apakah komitmen adalah dari hulu pada pandangan pertama

Pergi

Kelebihan :

  • Lebih cepat kerana anda tidak perlu menunggu semua tampalan bersih bergabung.
  • Lebih mudah untuk melihat kapan komit berasal dari hulu kerana anda tidak akan menjadi pelaku, penyelenggara hulu akan menjadi.

Keburukan:

  • Menyelesaikan konflik boleh menjadi lebih sukar kerana anda perlu melihat komitmen yang menyebabkan konflik menggunakan git log / git menyalahkan, ia tidak akan memberitahu anda secara langsung.
  • Melancarkan semula adalah sukar kerana anda tidak dapat mengembalikan gabungan, ia akan menawarkan untuk memilih semua komitmen secara individu. Namun, anda tidak seharusnya sering mengalami penurunan harga, sebaliknya menggunakan git revert dan git merge jika memungkinkan.

Saya akan mengesyorkan melakukan pilihan untuk mengetahui konflik masalah pada mulanya, melakukan penggabungan, kemudian mengembalikan masalah yang dilakukan selepas itu sehingga pengemaskinian lebih mudah (kerana penggabungan lebih cepat setelah dikemas kini).

Tambahkan komit ke sumber anda, satu versi pada satu masa

Bahagian yang paling penting dalam proses ini adalah versi satu bahagian pada satu masa. MUNGKIN ada tambalan masalah dalam siri hulu anda, yang boleh menyebabkan masalah dengan boot atau mematahkan sesuatu seperti suara atau pengisian (dijelaskan di bahagian petua dan trik). Melakukan perubahan versi tambahan adalah penting untuk alasan ini, lebih mudah untuk mencari masalah dalam 50 komit daripada lebih dari 2000 komitmen untuk beberapa versi. Saya hanya mengesyorkan melakukan penggabungan penuh setelah anda mengetahui semua masalah yang dilakukan dan penyelesaian konflik.

Memetik ceri

Format:

git cherry-pick ..

Contoh:

git cherry-pick v3.10.73..v3.10.74

Pergi

Format:

pergi bergabung

Contoh:

git merge v3.10.74

Saya cadangkan untuk mengawasi konflik dalam gabungan gabungan dengan membuang # penanda.

Cara Menyelesaikan Konflik

Kami tidak dapat memberikan panduan langkah demi langkah untuk menyelesaikan setiap konflik, kerana ini melibatkan pengetahuan bahasa C yang baik, tetapi berikut adalah beberapa petunjuk.

Sekiranya anda bergabung, ketahui komitmen yang menyebabkan konflik. Anda boleh melakukan ini dengan dua cara:

  1. git log -p v $ (buat kernelversion) .. untuk mendapatkan perubahan antara versi semasa anda dan yang terbaru dari hulu. Bendera -p akan memberi anda perubahan yang dilakukan oleh setiap komit sehingga anda dapat melihatnya.
  2. Jalankan kesalahan git pada fail untuk mendapatkan hash setiap komit di kawasan tersebut. Anda kemudian boleh menjalankan pertunjukan git –format = lebih lengkap untuk melihat apakah pelawat itu dari mainline / stable, Google, atau CodeAurora.
  • Cari tahu jika anda sudah mempunyai komit. Beberapa vendor seperti Google atau CAF akan berusaha mencari bug kritikal di hulu, seperti pembetulan Dirty COW, dan backport mereka boleh bertentangan dengan hulu. Anda boleh menjalankan git log –grep = ”” dan melihat apakah ia mengembalikan apa-apa. Sekiranya berlaku, anda boleh melangkau komit (jika memilih ceri menggunakan git reset –hard && git cherry-pick –continue) atau mengabaikan konflik (hapus<<<<<>>>>>).
  • Cari tahu apakah ada backport yang mengacaukan resolusi. Google dan CAF ingin menyokong tambalan tertentu yang tidak stabil. Stabil sering kali perlu menyesuaikan resolusi komitmen utama dengan ketiadaan tambalan tertentu yang dipilih oleh Google untuk disokong. Anda dapat melihat komit utama dengan menjalankan pertunjukan git (hash utama akan tersedia dalam mesej komit dari komit stabil). Sekiranya terdapat backport yang mengacaukannya, anda boleh membuang perubahan atau menggunakan versi utama (yang biasanya anda perlu lakukan).
  • Baca apa yang cuba dilakukan oleh komit dan lihat apakah masalahnya sudah selesai. Kadang-kadang CAF dapat memperbaiki bug yang tidak bergantung pada hulu, yang bermaksud anda boleh mengganti perbaikannya untuk hulu atau membuangnya, seperti di atas.

Jika tidak, ini mungkin hasil daripada penambahan CAF / Google / OEM, jadi anda hanya perlu mengubah beberapa perkara.

Di sini cermin repositori kernel.org stabil-linux di GitHub, yang lebih mudah untuk mencari senarai komit dan berbeza untuk penyelesaian konflik. Saya cadangkan pergi ke paparan senarai komit terlebih dahulu dan cari masalahnya untuk melihat perbezaan asal untuk membandingkannya dengan yang anda miliki.

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

Anda juga boleh melakukannya melalui baris arahan:

git log .. persembahan git

Menyelesaikan resolusi adalah berkaitan dengan konteks. Apa yang harus anda selalu lakukan adalah memastikan perbezaan akhir anda sesuai dengan hulu dengan menjalankan perintah berikut dalam dua tetingkap yang berasingan:

git diff HEAD git diff v $ (buat kernelversion) .. $ (git tag --sort = -taggerdate -l v $ (buat kernelversion | cut -d. -f 1,2) * | head -n1)

Dayakan semula

Git mempunyai ciri yang disebut rerere (singkatan dari Reuse Recorded Resolution), yang bermaksud bahawa ketika mengesan konflik, ia akan merakam bagaimana anda menyelesaikannya sehingga anda dapat menggunakannya kembali di kemudian hari. Ini sangat berguna untuk kedua-dua rebaser kronik dengan penggabungan dan pengambilan ceri kerana anda hanya perlu menjalankan git add. && git –teruskan ketika membuat semula huluan kerana konflik akan dapat diselesaikan bagaimana anda menyelesaikannya sebelum ini.

Ia dapat diaktifkan dengan menjalankan perintah berikut di repo kernel anda:

git config rerere.enabled true

Cara git bisect ketika menghadapi kesalahan compiler atau runtime

Memandangkan anda akan menambahkan jumlah komitmen yang cukup besar, sangat mungkin bagi anda untuk memperkenalkan kesalahan penyusun atau runtime. Daripada hanya menyerah, anda boleh menggunakan alat bisect bawaan git untuk mengetahui punca masalahnya! Sebaik-baiknya, anda akan membina dan mem-flash setiap versi kernel semasa anda menambahkannya sehingga membelah dua akan memakan masa lebih sedikit jika diperlukan tetapi anda dapat membelah 5000 komit tanpa masalah.

Apa yang akan dilakukan oleh git bisect adalah mengambil pelbagai komitmen, dari mana masalah ini muncul hingga di mana ia tidak hadir, dan kemudian mula mengurangkan separuh komit, membolehkan anda membuat dan menguji dan membiarkannya tahu sama ada ia baik atau tidak . Perkara ini akan diteruskan sehingga mengeluarkan komit yang menyebabkan masalah anda. Pada ketika itu, anda boleh memperbaikinya atau membalikkannya.

  1. Mula membelah dua: git bisect start
  2. Labelkan semakan semasa sebagai buruk: git bisect buruk
  3. Label semakan sebagai baik: git bisect baik
  4. Bangun dengan semakan baru
  5. Berdasarkan hasilnya (jika masalah ada atau tidak), beritahu git: git bisect baik ATAU git bisect buruk
  6. Bilas dan ulangi langkah 4-5 sehingga masalah selesai dijumpai!
  7. Kembalikan atau perbaiki masalah komit.

CATATAN: Penggabungan perlu menjalankan sementara git rebase -i untuk menerapkan semua tambalan ke cawangan anda untuk membagi dua bahagian yang betul, kerana membelah dua dengan penggabungan di tempat akan sering kali melakukan pembayaran ke bahagian hulu, yang bermaksud bahawa anda tidak mempunyai komit khusus Android. Saya dapat melihat lebih mendalam mengenai perkara ini atas permintaan tetapi percayalah, ia diperlukan. Setelah anda mengenal pasti masalah, anda boleh mengembalikan atau memasukkannya semula ke dalam penggabungan.

JANGAN laburkan kemas kini hulu

Banyak pemaju baru tergoda untuk melakukan ini kerana 'lebih bersih' dan 'lebih mudah' diuruskan. Ini mengerikan kerana beberapa sebab:

  • Kepengarangan hilang. Tidak adil bagi pemaju lain untuk mendapatkan kredit mereka untuk pekerjaan mereka.
  • Bisecting adalah mustahil. Sekiranya anda melakukan siri komit dan ada masalah dalam siri tersebut, mustahil untuk mengetahui apakah komitmen yang menyebabkan timbulnya masalah dalam skuasy.
  • Pilihan ceri masa depan lebih sukar. Sekiranya anda perlu membuat semula dengan siri squashed, adalah sukar / mustahil untuk mengetahui dari mana konflik berlaku.

Langgan senarai mel Linux Kernel untuk kemas kini tepat pada masanya

Untuk mendapat pemberitahuan setiap kali terdapat kemas kini hulu, berlangganan senarai pengumuman linux-kernel . Ini akan membolehkan anda mendapatkan e-mel setiap kali kernel baru dilepaskan sehingga anda dapat mengemas kini dan mendorong secepat mungkin.

9 minit membaca