Computer >> Máy Tính >  >> Xử lý sự cố >> Android

Cách cập nhật nhân Android của bạn lên Linux ổn định mới nhất

Chúng tôi đã đề cập đến các hướng dẫn về hạt nhân Android, chẳng hạn như “Cách xây dựng nhân tùy chỉnh” và “Nhân tùy chỉnh tốt nhất cho Android”, nhưng hôm nay chúng tôi sẽ hướng dẫn bạn cách ngược dòng hạt nhân của bạn lên bản ổn định Linux mới nhất.

Hãy biết rằng đây là nâng cao nội dung - nếu bạn chưa bao giờ biên dịch hạt nhân trước đây, bạn nên làm theo hướng dẫn “Cách tạo hạt nhân tùy chỉnh” được liên kết ở trên và hướng dẫn này sẽ liên quan đến việc chọn và hợp nhất các cam kết từ hạt nhân ổn định Linux mới nhất với hạt nhân Android của bạn trước khi bạn biên dịch nó.

Việc nâng cấp nhân Android của bạn lên bản ổn định Linux mới nhất có rất nhiều lợi ích tích cực, chẳng hạn như được cập nhật các cam kết bảo mật và sửa lỗi mới nhất - chúng tôi sẽ giải thích một số ưu và nhược điểm sau trong hướng dẫn này.

Nhân Linux-Ổn định là gì?

Cách cập nhật nhân Android của bạn lên Linux ổn định mới nhất

Ổn định Linux như tên của nó là nhánh ổn định của nhân Linux. Nhánh còn lại được gọi là “dòng chính”, là nhánh chính . Tất cả quá trình phát triển nhân Linux diễn ra trong dòng chính và thường tuân theo quy trình này:

  1. Linus Torvalds sẽ nhận một loạt các bản vá từ những người bảo trì của anh ấy trong hai tuần.
  2. Sau hai tuần này, anh ấy phát hành hạt nhân rc1 (ví dụ:4.14-rc1).
  3. Mỗi tuần trong 6-8 tuần tới, anh ấy sẽ phát hành một hạt nhân RC khác (ví dụ:4.14-rc2, 4.14-rc3, v.v.), chỉ chứa các bản sửa lỗi và hồi quy.
  4. Sau khi được coi là ổn định, nó sẽ được phát hành dưới dạng tarball để tải xuống trên tổ chức (ví dụ:4.14).

Hạt nhân LTS là gì?

Mỗi năm, Greg sẽ chọn một hạt nhân và duy trì nó trong hai năm (LTS) hoặc sáu năm (LTS kéo dài). Chúng được thiết kế để có các sản phẩm cần sự ổn định (như điện thoại Android hoặc các thiết bị IOT khác). Quá trình này hoàn toàn giống như trên, nó chỉ xảy ra trong một thời gian dài hơn. Hiện tại có sáu hạt nhân LTS (luôn có thể xem được trên trang phát hành kernel.org ):

  • 4,14 (LTS) , do Greg Kroah-Hartman duy trì
  • 4.9 (LTS) , do Greg Kroah-Hartman duy trì
  • 4.4 (eLTS) , do Greg Kroah-Hartman duy trì
  • 4.1 (LTS) , được duy trì bởi Sasha Levin
  • 3,16 (LTS) , được duy trì bởi Ben Hutchings
  • 3.2 (LTS) , được duy trì bởi Ben Hutchings

Lợi ích của việc ngược dòng hạt nhân Android của tôi lên Linux Stable là gì?

Khi các lỗ hổng quan trọng được tiết lộ / sửa chữa, các hạt nhân ổn định là những người đầu tiên lấy được chúng. Do đó, hạt nhân Android của bạn sẽ an toàn hơn rất nhiều trước các cuộc tấn công, lỗi bảo mật và lỗi nói chung.

Ổn định Linux bao gồm các bản sửa lỗi cho nhiều trình điều khiển mà thiết bị Android của tôi không sử dụng, điều này hầu như không cần thiết phải không?

Có và không, tùy thuộc vào cách bạn xác định “chủ yếu”. Nhân Linux có thể bao gồm nhiều mã không được sử dụng trong hệ thống Android, nhưng điều đó không đảm bảo sẽ không có xung đột từ các tệp đó khi hợp nhất các phiên bản mới! Hiểu rằng hầu như không ai xây dựng mọi phần riêng lẻ của hạt nhân, thậm chí không phải là các bản phân phối Linux phổ biến nhất như Ubuntu hoặc Mint. Điều này không có nghĩa là bạn không nên thực hiện các bản sửa lỗi này bởi vì các bản sửa lỗi cho trình điều khiển mà bạn NÊN chạy. Lấy ví dụ như arm / arm64 và ext4, đây là hệ thống tệp và kiến ​​trúc Android phổ biến nhất. Trong 4.4, từ 4.4.78 (phiên bản của thẻ Oreo CAF mới nhất) đến 4.4.121 (thẻ ngược dòng mới nhất), đây là những con số sau cho cam kết của các hệ thống đó:

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

Phần tốn thời gian nhất là khởi tạo ban đầu; khi bạn đã cập nhật tất cả, hoàn toàn không mất thời gian để hợp nhất trong một bản phát hành mới, thường chứa không quá 100 cam kết. Tuy nhiên, những lợi ích mà điều này mang lại (ổn định hơn và bảo mật tốt hơn cho người dùng của bạn) nên cần quá trình này.

Cách hợp nhất nhân Ổn định Linux vào nhân Android

Trước tiên, bạn cần tìm ra phiên bản hạt nhân mà thiết bị Android của bạn đang chạy.

Điều này có vẻ tầm thường, nhưng bạn cần phải biết mình cần bắt đầu từ đâu. Chạy lệnh sau trong cây nhân của bạn:

 tạo kernelversion 

Nó sẽ trả về phiên bản bạn đang sử dụng. Hai số đầu tiên sẽ được sử dụng để tìm ra nhánh bạn cần (ví dụ:linux-4.4.y cho bất kỳ hạt nhân 4.4 nào) và số cuối cùng sẽ được sử dụng để xác định phiên bản bạn cần để bắt đầu hợp nhất (ví dụ:nếu bạn đang sử dụng 4.4 .21, bạn sẽ hợp nhất 4.4.22 tiếp theo).

Lấy nguồn hạt nhân mới nhất từ ​​kernel.org

kernel.org chứa nguồn hạt nhân mới nhất trong kho lưu trữ ổn định linux. Ở cuối trang đó, sẽ có ba liên kết tìm nạp. Theo kinh nghiệm của tôi, gương của Google có xu hướng nhanh nhất nhưng kết quả của bạn có thể khác nhau. Chạy các lệnh sau:

 git từ xa thêm linux-ổn định https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.gitgit tìm nạp linux-ổn định 

Quyết định xem bạn muốn hợp nhất toàn bộ hạt nhân hay chọn sơ ri các cam kết

Tiếp theo, bạn sẽ cần phải chọn nếu bạn muốn hợp nhất các cam kết hoặc chọn anh đào. Dưới đây là ưu và nhược điểm của từng loại và khi nào bạn có thể muốn thực hiện chúng.

LƯU Ý: Nếu nguồn hạt nhân của bạn ở dạng tarball, rất có thể bạn sẽ cần phải sơ chế, nếu không, bạn sẽ nhận được hàng nghìn xung đột tệp vì git đang điền lịch sử hoàn toàn dựa trên ngược dòng chứ không phải những gì OEM hoặc CAF đã thay đổi. Chỉ cần chuyển sang bước 4.

Hái anh đào:

Ưu điểm:

  • Giải quyết xung đột dễ dàng hơn khi bạn biết chính xác xung đột nào đang gây ra sự cố.
  • Tái cơ sở dễ dàng hơn vì mỗi cam kết đều có riêng.
  • Dễ dàng phân chia hơn nếu gặp sự cố

Nhược điểm:

  • Sẽ mất nhiều thời gian hơn vì mỗi cam kết phải được chọn riêng lẻ.
  • Thoạt nhìn, hơi khó để biết liệu cam kết có phải là từ thượng nguồn không

Hợp nhất

Ưu điểm :

  • Nhanh hơn vì bạn không phải đợi tất cả các bản vá lỗi hợp nhất.
  • Sẽ dễ dàng nhận ra khi nào một cam kết là từ thượng nguồn vì bạn sẽ không phải là người cam kết mà sẽ là người bảo trì ngược dòng.

Nhược điểm:

  • Việc giải quyết xung đột có thể khó hơn một chút vì bạn sẽ cần phải tra cứu cam kết nào đang gây ra xung đột bằng cách sử dụng git log / git blu, nó sẽ không trực tiếp cho bạn biết.
  • Việc khôi phục lại khó khăn vì bạn không thể căn cứ lại một hợp nhất, nó sẽ cung cấp cho bạn chọn tất cả các cam kết riêng lẻ. Tuy nhiên, bạn không nên khôi phục thường xuyên, thay vào đó hãy sử dụng git revert và git merge nếu có thể.

Tôi khuyên bạn nên thực hiện một thao tác chọn sơ ri để tìm ra bất kỳ xung đột vấn đề nào ban đầu, thực hiện hợp nhất, sau đó hoàn nguyên các cam kết về vấn đề sau đó để cập nhật dễ dàng hơn (vì hợp nhất nhanh hơn sau khi được cập nhật).

Thêm cam kết vào nguồn của bạn, mỗi lần một phiên bản

Phần quan trọng nhất của quá trình này là từng phiên bản một. CÓ THỂ có một bản vá sự cố trong loạt video ngược dòng của bạn, có thể gây ra sự cố khởi động hoặc hỏng một thứ gì đó như âm thanh hoặc sạc (được giải thích trong phần mẹo và thủ thuật). Vì lý do này, việc thực hiện các thay đổi phiên bản gia tăng là rất quan trọng, dễ dàng tìm thấy sự cố trong 50 lần cam kết hơn là 2000 lần cam kết đối với một số phiên bản. Tôi chỉ khuyên bạn nên thực hiện hợp nhất đầy đủ khi bạn biết tất cả các cam kết và giải quyết xung đột của vấn đề.

Hái anh đào

Định dạng:

 git cherry-pick  ..  

Ví dụ:

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

Hợp nhất

Định dạng:

 hợp nhất git  

Ví dụ:

git merge v3.10.74

Tôi khuyên bạn nên theo dõi các xung đột trong các cam kết hợp nhất bằng cách xóa # điểm đánh dấu.

Cách Giải quyết Xung đột

Chúng tôi không thể đưa ra hướng dẫn từng bước để giải quyết mọi xung đột vì nó liên quan đến kiến ​​thức tốt về ngôn ngữ C, nhưng sau đây là một vài gợi ý.

Nếu bạn đang hợp nhất, hãy tìm ra cam kết nào đang gây ra xung đột. Bạn có thể thực hiện việc này theo một trong hai cách:

  1. git log -p v $ (tạo kernelversion) .. để nhận các thay đổi giữa phiên bản hiện tại của bạn và phiên bản mới nhất từ ​​ngược dòng. Cờ -p sẽ cung cấp cho bạn những thay đổi được thực hiện bởi mỗi lần cam kết để bạn có thể thấy.
  2. Chạy lỗi git trên tệp để nhận các băm của từng cam kết trong khu vực. Sau đó, bạn có thể chạy git show –format =fuller để xem trình xác nhận đến từ mainline / stable, Google hay CodeAurora.
  • Tìm hiểu xem bạn đã có cam kết chưa. Một số nhà cung cấp như Google hoặc CAF sẽ cố gắng tìm kiếm các lỗi nghiêm trọng, chẳng hạn như bản sửa lỗi BÒ Bẩn và các cổng phản hồi của họ có thể xung đột với các lỗi ngược dòng. Bạn có thể chạy git log –grep =”” và xem nó có trả về bất kỳ thứ gì không. Nếu có, bạn có thể bỏ qua cam kết (nếu hái cherry bằng git reset –hard &&git cherry-pick –continue) hoặc bỏ qua các xung đột (xóa <<<<<>>>>>).
  • Tìm hiểu xem có một backport nào đang làm rối loạn độ phân giải hay không. Google và CAF muốn phản hồi một số bản vá lỗi ổn định thì không. Ổn định thường sẽ cần phải điều chỉnh độ phân giải của cam kết đường chính đối với sự vắng mặt của một số bản vá lỗi mà Google chọn để backport. Bạn có thể xem cam kết của dòng chính bằng cách chạy git show (băm dòng chính sẽ có sẵn trong thông báo cam kết của cam kết ổn định). Nếu có một backport nào đó làm xáo trộn nó, bạn có thể hủy các thay đổi hoặc có thể sử dụng phiên bản dòng chính (đó là những gì bạn thường cần làm).
  • Đọc những gì cam kết đang cố gắng thực hiện và xem sự cố đã được khắc phục chưa. Đôi khi CAF có thể sửa một lỗi không phụ thuộc vào quá trình ngược dòng, nghĩa là bạn có thể ghi đè bản sửa lỗi của họ cho phần ngược dòng hoặc loại bỏ nó, như ở trên.

Nếu không, nó có thể chỉ là kết quả của việc bổ sung CAF / Google / OEM, trong trường hợp đó, bạn chỉ cần xáo trộn một số thứ xung quanh.

Đây là bản sao của kho lưu trữ kernel.org linux-ổn định trên GitHub, có thể dễ dàng hơn cho việc tra cứu danh sách cam kết và các khác biệt để giải quyết xung đột. Tôi khuyên bạn nên đi đến chế độ xem danh sách cam kết trước và xác định sự cố cam kết để xem sự khác biệt ban đầu để so sánh nó với của bạn.

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

Bạn cũng có thể làm điều đó thông qua dòng lệnh:

 git log  ..   git show  

Giải quyết vấn đề là tất cả về ngữ cảnh. Điều bạn LUÔN LUÔN nên làm là đảm bảo điểm khác biệt cuối cùng của bạn khớp với phần ngược dòng bằng cách chạy các lệnh sau trong hai cửa sổ riêng biệt:

 git diff HEADgit diff v $ (tạo kernelversion) .. $ (git tag --sort =-taggerdate -l v $ (make kernelversion | cut -d. -f 1,2) * | head -n1)  

Bật rerere

Git có một tính năng gọi là rerere (viết tắt của Reuse Recorded Resolution), nghĩa là khi phát hiện ra xung đột, nó sẽ ghi lại cách bạn đã giải quyết để bạn có thể sử dụng lại sau này. Điều này đặc biệt hữu ích cho cả những người làm lại lâu năm với cả hợp nhất và hái anh đào vì bạn sẽ chỉ cần chạy git add. &&git –tiếp tục khi thực hiện lại quy trình ngược dòng vì xung đột sẽ được giải quyết theo cách bạn đã giải quyết trước đó.

Nó có thể được kích hoạt bằng cách chạy lệnh sau trong kho hạt nhân của bạn:

 git config rerere.enabled true 

Cách git bisect khi chạy vào trình biên dịch hoặc lỗi thời gian chạy

Do bạn sẽ thêm một số lượng lớn các cam kết, bạn rất có thể gặp lỗi trình biên dịch hoặc thời gian chạy. Thay vì bỏ cuộc, bạn có thể sử dụng công cụ bisect tích hợp sẵn của git để tìm ra nguyên nhân gốc rễ của vấn đề! Lý tưởng nhất là bạn sẽ xây dựng và cài đặt từng phiên bản hạt nhân khi bạn thêm nó, vì vậy việc chia nhỏ sẽ mất ít thời gian hơn nếu cần nhưng bạn có thể chia nhỏ 5000 lần cam kết mà không gặp bất kỳ vấn đề gì.

Những gì git bisect sẽ làm là thực hiện một loạt các cam kết, từ nơi có vấn đề đến nơi không xuất hiện và sau đó bắt đầu giảm một nửa phạm vi cam kết, cho phép bạn xây dựng và kiểm tra và cho biết liệu nó có tốt hay không. . Nó sẽ tiếp tục điều này cho đến khi nó tạo ra cam kết gây ra sự cố của bạn. Tại thời điểm đó, bạn có thể sửa hoặc hoàn nguyên.

  1. Bắt đầu chia nhỏ:git bisect start
  2. Gắn nhãn bản sửa đổi hiện tại là xấu:git bisect bad
  3. Gắn nhãn bản sửa đổi là tốt:git bisect good
  4. Xây dựng với bản sửa đổi mới
  5. Dựa trên kết quả (nếu sự cố có hay không), hãy cho git biết:git bisect tốt HOẶC git bisect xấu
  6. Rửa sạch và lặp lại các bước 4-5 cho đến khi phát hiện ra lỗi!
  7. Hoàn nguyên hoặc sửa lỗi cam kết.

LƯU Ý: Các hợp nhất sẽ cần phải tạm thời chạy git rebase -i để áp dụng tất cả các bản vá cho chi nhánh của bạn để phân chia phù hợp, vì việc chia đôi với các hợp nhất tại chỗ thường sẽ kiểm tra các cam kết ngược dòng, nghĩa là bạn không có cam kết cụ thể nào của Android . Tôi có thể đi sâu hơn về vấn đề này theo yêu cầu nhưng hãy tin tôi, nó là cần thiết. Khi bạn đã xác định cam kết vấn đề, bạn có thể hoàn nguyên hoặc căn cứ lại nó vào hợp nhất.

KHÔNG xóa các bản cập nhật ngược dòng

Rất nhiều nhà phát triển mới bị cám dỗ làm điều này vì nó “sạch hơn” và “dễ quản lý hơn”. Điều này thật tồi tệ vì một vài lý do:

  • Quyền tác giả bị mất. Thật không công bằng cho các nhà phát triển khác khi họ bị giảm tín dụng cho công việc của họ.
  • Việc chia nhỏ là không thể. Nếu bạn bỏ qua một loạt cam kết và có điều gì đó gây ra vấn đề trong chuỗi đó, thì bạn sẽ không thể biết được cam kết nào đã gây ra sự cố trong một loạt cam kết.
  • Việc hái anh đào trong tương lai khó hơn. Nếu bạn cần phải căn cứ lại bằng một loạt bài bị bóp méo, thì rất khó / không thể biết được xung đột bắt nguồn từ đâu.

Đăng ký danh sách gửi thư Nhân Linux để cập nhật kịp thời

Để nhận được thông báo bất cứ khi nào có bản cập nhật ngược dòng, hãy đăng ký danh sách thông báo của linux-kernel . Điều này sẽ cho phép bạn nhận email mỗi khi hạt nhân mới được phát hành để bạn có thể cập nhật và đẩy nhanh nhất có thể.