अपने Android कर्नेल को नवीनतम लिनक्स स्टेबल में कैसे अपडेट करें

कर्नेल के हर एक हिस्से को बनाता है, उबंटू या टकसाल की तरह सबसे आम लिनक्स डिस्ट्रोस भी नहीं। इसका मतलब यह नहीं है कि आपको ये सुधार नहीं करने चाहिए क्योंकि वहाँ कर रहे हैं आप ड्राइवरों के लिए फिक्स कर Daud। उदाहरण के लिए हाथ / arm64 और ext4 लें, जो क्रमशः सबसे आम एंड्रॉइड आर्किटेक्चर और फाइल सिस्टम हैं। 4.4 में, 4.4.78 (नवीनतम Oreo CAF टैग का संस्करण) से 4.4.121 (नवीनतम अपस्ट्रीम टैग) तक, ये उन प्रणालियों के कमिट के लिए निम्नलिखित संख्याएँ हैं:



नातान @ फ्लैशबॉक्स ~ / कर्नेल / लाइनक्स-स्टेबल (मास्टर) $ git log --format =% h v4.4.78..v4.4.121 | wc -l2285 नथन @ फ्लैशबॉक्स ~ / कर्नेल / लिनक्स-स्टेबल (मास्टर) $ गिट लॉग --फॉर्मैट =% h v4.4.78..v4.4.121 आर्क / आर्म | wc -l58 nathan @ Flashbox ~ / kernels / linux-stabil (master) $ git log --format =% h v4.4.78..v4.4.121 कट्टर / arm64 | wc -l22 नातान @ फ्लैशबॉक्स ~ / कर्नेल / लिनक्स-स्टेबल (मास्टर) $ git log --format =% h v4.4.78..v4.4.121 fs / ext4 | wc -l18

सबसे अधिक समय लेने वाला हिस्सा प्रारंभिक लाने वाला है; एक बार जब आप पूरी तरह से अद्यतित हो जाते हैं, तो नई रिलीज़ में विलीन होने में बिल्कुल भी समय नहीं लगता है, जिसमें आमतौर पर 100 से अधिक अंक नहीं होते हैं। हालांकि इससे होने वाले लाभ (आपके उपयोगकर्ताओं के लिए अधिक स्थिरता और बेहतर सुरक्षा) को इस प्रक्रिया की आवश्यकता होनी चाहिए।

कैसे एक Android कर्नेल में लिनक्स स्थिर कर्नेल विलय करने के लिए

सबसे पहले आपको यह पता लगाने की आवश्यकता है कि आपका एंड्रॉइड डिवाइस कौन सा कर्नेल संस्करण चला रहा है।

जैसा कि यह तुच्छ लगता है, यह जानना आवश्यक है कि आपको कहां से शुरू करना है। अपने कर्नेल ट्री में निम्न कमांड चलाएँ:

कर्नेलवर्सन करें

यह उस संस्करण को वापस कर देगा जिस पर आप हैं। पहले दो नंबरों को आपकी ज़रूरत की शाखा का पता लगाने के लिए उपयोग किया जाएगा (जैसे कि किसी भी 4.4 कर्नेल के लिए linux-4.4.y) और अंतिम संख्या का उपयोग यह निर्धारित करने के लिए किया जाएगा कि आपको किस संस्करण को विलय के साथ शुरू करने की आवश्यकता है (जैसे यदि आप 4.4 पर हैं .21, आप आगे विलय करेंगे 4.4.22)।

Kern.org से नवीनतम कर्नेल स्रोत को पकड़ो

kernel.org में नवीनतम कर्नेल स्रोत है linux- स्थिर भंडार । उस पृष्ठ के निचले भाग में तीन लिंक होंगे। मेरे अनुभव में, Google का दर्पण सबसे तेज़ होता है लेकिन आपके परिणाम भिन्न हो सकते हैं। निम्न आदेश चलाएँ:

git रिमोट लिनेक्स-स्थिर जोड़ें https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git फ़िश लिंच-स्थिर

यदि आप संपूर्ण कर्नेल या चेरी को चुनना चाहते हैं तो कमिट्स चुनें

अगला, आपको यह चुनने की आवश्यकता होगी कि क्या आप कमिट्स या चेरी-पिक को मर्ज करना चाहते हैं। यहां प्रत्येक के पक्ष और विपक्ष हैं और जब आप उन्हें करना चाहें।

ध्यान दें: यदि आपका कर्नेल स्रोत एक टारबॉल के रूप में है, तो आपको सबसे अधिक चेरी-पिक की आवश्यकता होगी, अन्यथा आपको हजारों फ़ाइल संघर्ष मिलेंगे क्योंकि गिट अपस्ट्रीम पर आधारित इतिहास को शुद्ध रूप से आबाद कर रहे हैं, न कि OEM या CAF को बदल दिया गया है। बस चरण 4 पर जाएं।

चेरी उठा रहा हैं:

पेशेवरों:

  • संघर्षों को हल करने के लिए आसान है क्योंकि आप जानते हैं कि वास्तव में क्या समस्या एक समस्या पैदा कर रही है।
  • प्रत्येक कमिट के रूप में रिबेट करना आसान है।
  • अगर मुद्दों में भाग लेना आसान हो जाए

विपक्ष:

  • इसमें उतना ही समय लगता है, जब प्रत्येक प्रतिबद्ध को व्यक्तिगत रूप से उठाया जाना होता है।
  • पहली नज़र में ऊपर की ओर से कमिटमेंट है तो बताना थोड़ा मुश्किल है

जाओ

पेशेवरों :

  • यह तेज है क्योंकि आपको सभी साफ पैच के विलय का इंतजार नहीं करना है।
  • यह देखना आसान है कि जब कमिट अपस्ट्रीम से हो तो आप कम्फ़र्टेबल नहीं होंगे, अपस्ट्रीम मेंटेनर होगा।

विपक्ष:

  • संघर्षों को हल करना थोड़ा और मुश्किल हो सकता है क्योंकि आपको यह देखना होगा कि कौन सा कमिट git log / git दोष का उपयोग करके संघर्ष का कारण बन रहा है, यह सीधे आपको नहीं बताएगा।
  • रिबासिंग मुश्किल है क्योंकि आप एक मर्ज को वापस नहीं कर सकते, यह व्यक्तिगत रूप से सभी को चेरी-पिक करने की पेशकश करेगा। हालाँकि, आपको अक्सर रिबेटिंग नहीं करना चाहिए, इसके बजाय जहाँ संभव हो वहाँ पर git रिवर्ट और git मर्ज का उपयोग करें।

मैं शुरू में मर्ज करते हुए किसी भी समस्या का पता लगाने के लिए चेरी-पिक करने की सलाह दूंगा, फिर बाद में समस्या को हल करता है, इसलिए अपडेट करना आसान है (क्योंकि विलय अप टू डेट होने के बाद तेज है)।

अपने स्रोत, एक समय में एक संस्करण में कमिट्स जोड़ें

इस प्रक्रिया का सबसे महत्वपूर्ण हिस्सा एक समय भाग में एक संस्करण है। आपकी अपस्ट्रीम सीरीज़ में MAY एक समस्या पैच हो सकती है, जो बूटिंग या साउंड या चार्जिंग (ब्रेकिंग टिप्स और ट्रिक्स सेक्शन में बताई गई) जैसी समस्या का कारण बन सकती है। वृद्धिशील संस्करण परिवर्तन करना इस कारण से महत्वपूर्ण है, कुछ संस्करणों के लिए 2000 के ऊपर की तुलना में 50 कमिट्स में एक मुद्दा खोजना आसान है। मैं केवल एक पूर्ण मर्ज करने की सलाह दूंगा जब आप समस्या और संघर्ष के सभी प्रस्तावों को जान लेंगे।

चेरी उठा रहा हैं

प्रारूप:

git चेरी-पिक ।।

उदाहरण:

git चेरी-पिक v3.10.73..v3.10.74

जाओ

प्रारूप:

मर्ज हो जाना

उदाहरण:

git मर्ज v3.10.74

मैं # मार्कर को हटाकर मर्ज के कमिट में संघर्षों पर नज़र रखने की सलाह देता हूं।

संघर्षों को कैसे हल करें

हम हर एक संघर्ष को हल करने के लिए एक कदम-दर-चरण मार्गदर्शिका नहीं दे सकते हैं, क्योंकि इसमें सी भाषा का अच्छा ज्ञान शामिल है, लेकिन यहां कुछ संकेत दिए गए हैं।

यदि आप विलय कर रहे हैं, तो यह पता लगाएँ कि क्या संघर्ष का कारण है। आप इसे दो तरीकों में से एक कर सकते हैं:

  1. git log -p v $ (कर्नेलवर्शन करें) .. अपने वर्तमान संस्करण और अपस्ट्रीम से नवीनतम के बीच परिवर्तन प्राप्त करने के लिए। -P ध्वज आपको प्रत्येक प्रतिबद्ध द्वारा किए गए परिवर्तन देगा ताकि आप देख सकें।
  2. क्षेत्र में प्रत्येक कमिट के हैश पाने के लिए फ़ाइल पर गिट दोष चलाएं। इसके बाद आप देख सकते हैं कि git show -format = fuller देखने के लिए कि क्या कम्यूटर मेनलाइन / स्टेबल, गूगल या कोडअरोरा से था।
  • यदि आपके पास पहले से ही कमिट है तो फिगर आउट करें। कुछ विक्रेता जैसे कि Google या CAF गंभीर बगों के लिए अपस्ट्रीम देखने की कोशिश करेंगे, जैसे डर्टी गाय फिक्स, और उनके बैकस्टेज अपस्ट्रीम के साथ संघर्ष कर सकते हैं। आप git log -grep = ”चला सकते हैं और देख सकते हैं कि यह कुछ भी देता है या नहीं। यदि ऐसा होता है, तो आप कमिट को छोड़ सकते हैं (यदि चेरी रीसेट को git reset –hard && git चेरी-पिक-कॉन्टिन्यू का उपयोग करके) या संघर्षों को अनदेखा करें (निकालें<<<<<>>>>>)।
  • अगर रिज़ॉल्यूशन गड़बड़ कर रहा है तो वहां से बाहर निकलें। Google और CAF ऐसे कुछ पैच को बैकप करना पसंद करते हैं जो स्थिर नहीं होंगे। स्थिर को अक्सर कुछ पैच के अनुपस्थिति के लिए प्रतिबद्ध मेनलाइन के संकल्प को अनुकूलित करने की आवश्यकता होगी जो Google बैकपोर्ट को पसंद करता है। आप git शो चलाकर मेनलाइन कमिट को देख सकते हैं (मेनलाइन हैश स्थिर कमिट के संदेश में उपलब्ध होगा)। यदि कोई बैकपोर्ट गड़बड़ कर रहा है, तो आप या तो परिवर्तनों को छोड़ सकते हैं या आप मेनलाइन संस्करण का उपयोग कर सकते हैं (जो कि आमतौर पर आपको करने की आवश्यकता होगी)।
  • पढ़ें कि कमिट क्या करने की कोशिश कर रहा है और देखें कि समस्या पहले से ही ठीक है या नहीं। कभी-कभी सीएएफ अपस्ट्रीम से स्वतंत्र बग को ठीक कर सकता है, जिसका अर्थ है कि आप ऊपर के लिए उनके फिक्स को ओवरराइट कर सकते हैं या ऊपर की तरह इसे छोड़ सकते हैं।

अन्यथा, यह सिर्फ सीएएफ / गूगल / ओईएम के अतिरिक्त परिणाम हो सकता है, जिस स्थिति में आपको बस कुछ चीजों को फेरबदल करने की आवश्यकता होती है।

यहाँ है लिनक्स-स्थिर कर्नेल के एक दर्पण। रिपॉजिटरी GitHub पर, जो कमिट सूचियों को देखने के लिए आसान हो सकता है और संघर्ष के समाधान के लिए भिन्न हो सकता है। मैं आपको पहले सूची दृश्य में जाने की सलाह देता हूं और आपकी तुलना करने के लिए मूल अंतर को देखने के लिए समस्या का पता लगाने के लिए प्रतिबद्ध करता हूं।

उदाहरण URL: https://github.com/nathanchance/linux-stable/commits/linux-3.10.y/arch/arm64/mm/mmu.c

आप इसे कमांड लाइन के माध्यम से भी कर सकते हैं:

git log .. गिट शो

संकल्पों को हल करना सभी संदर्भ के बारे में है। आपको हमेशा क्या करना चाहिए, यह सुनिश्चित करें कि आपका अंतिम अंतर अपस्ट्रीम से दो अलग-अलग विंडो में चलकर मेल खाता है:

git diff HEAD git diff v $ (कर्नेलवर्सन करें) .. $ (git tag --sort = -taggerdate -l v $ (kernversion बनायें-कट -d। -f 1,2) *। head.nn1)

सक्षम करें

Git में रेरियर नामक सुविधा है (जिसका अर्थ है Reuse Recorded Resolution), इसका अर्थ है कि जब यह एक संघर्ष का पता लगाता है, तो यह रिकॉर्ड करेगा कि आपने इसे कैसे हल किया ताकि आप इसे बाद में पुन: उपयोग कर सकें। यह विशेष रूप से मर्जिंग और चेरी-पिकिंग दोनों के साथ पुरानी पुनरावर्ती के लिए सहायक है क्योंकि आपको बस गिट ऐड को चलाने की आवश्यकता होगी। && गिट-कॉन्टिन्यू तब करें जब अपस्ट्रीम कोअपअप को रिड्यूस करने के रूप में संघर्ष को हल किया जाएगा कि आपने इसे पहले कैसे हल किया था।

अपने कर्नेल रेपो में निम्न कमांड चलाकर इसे सक्षम किया जा सकता है:

git config rerere.enabled सही

कंपाइलर या रनटाइम एरर में चलने पर बिज़ को कैसे करें

यह देखते हुए कि आप एक बड़ी संख्या में कमिट जोड़ रहे हैं, आपके लिए कंपाइलर या रनटाइम त्रुटि पेश करना बहुत संभव है। सिर्फ देने के बजाय, आप समस्या के मूल कारण का पता लगाने के लिए गिट के बिल्ट-इन बाइसेक्ट टूल का उपयोग कर सकते हैं! आदर्श रूप से, आप प्रत्येक एकल कर्नेल संस्करण का निर्माण और फ्लैशिंग कर रहे होंगे क्योंकि आप इसे जोड़ते हैं ताकि बिसेक्टिंग को जरूरत पड़ने में कम समय लगेगा लेकिन आप बिना किसी मुद्दे के 5000 कमिट्स को बाइसेक्ट कर सकते हैं।

Git bisect क्या करेगी, कमिट्स की एक सीमा लेती है, जहाँ से यह मुद्दा मौजूद है जहाँ यह मौजूद नहीं था, और फिर कमिट रेंज को बंद करना शुरू करें, जिससे आप निर्माण कर सकें और परीक्षण कर सकें और यह जान सकें कि यह अच्छा है या नहीं । यह तब तक जारी रहेगा जब तक कि यह आपके मुद्दे के कारण प्रतिबद्ध नहीं हो जाता। उस बिंदु पर, आप इसे ठीक कर सकते हैं या इसे वापस ला सकते हैं।

  1. बिसेक्टिंग शुरू करें: गिट बिसात शुरू
  2. वर्तमान संशोधन को बुरे के रूप में लेबल करें: गिट बाइसेक्ट खराब
  3. एक संशोधन को अच्छे के रूप में लेबल करें: git bisect अच्छा
  4. नए संशोधन के साथ बनाएँ
  5. परिणाम के आधार पर (यदि समस्या मौजूद है या नहीं), तो git बताएं: git bisect अच्छा या git bisect खराब
  6. समस्या होने तक 4-5 रगड़ें और दोहराएं!
  7. समस्या को कम करना या ठीक करना।

ध्यान दें: विलय के लिए अस्थायी रूप से गिट रिबेस-आई को उचित रूप से बाइसेक्टिंग के लिए अपनी शाखा में लागू करने की आवश्यकता होगी, क्योंकि विलय के साथ बाइसेक्टिंग अक्सर अपस्ट्रीम कमिट्स पर चेकआउट होगा, जिसका अर्थ है कि आप एंड्रॉइड विशिष्ट कमिट्स में से कोई भी नहीं हैं। मैं अनुरोध पर इस पर और गहराई में जा सकता हूं, लेकिन मुझ पर भरोसा रखें, इसकी जरूरत है। एक बार जब आप समस्या की पहचान कर लेते हैं, तो आप उसे मर्ज में वापस ला सकते हैं या उसे वापस कर सकते हैं।

अपस्ट्रीम अपडेट को स्क्वैश न करें

बहुत सारे नए डेवलपर्स को ऐसा करने के लिए लुभाया जाता है क्योंकि यह 'क्लीनर' और 'आसान' है। यह कुछ कारणों से भयानक है:

  • ऐतिहासिकता खो गई है। अन्य डेवलपर्स के लिए अनुचित है कि वे अपने काम के लिए अपने क्रेडिट को रोक दें।
  • सम्हालना असंभव है। यदि आप कमिट्स की एक श्रृंखला को स्क्वैश करते हैं और उस सीरीज़ में कुछ समस्या है, तो यह बताना असंभव है कि स्क्वैश में कोई समस्या क्या है।
  • भविष्य चेरी-पिक्स कठिन हैं। यदि आपको एक स्क्वैश श्रृंखला के साथ रिबेस करने की आवश्यकता है, तो यह बता पाना मुश्किल / असंभव है कि संघर्ष कहाँ से होता है।

समय पर अद्यतन के लिए लिनक्स कर्नेल मेलिंग सूची की सदस्यता लें

जब भी कोई अपस्ट्रीम अपडेट हो, तो उसे नोटिफाई करने के लिए सब्सक्राइब करें लिनक्स-कर्नेल-घोषणा सूची । यह आपको हर बार एक नया कर्नेल जारी करने के लिए एक ईमेल प्राप्त करने की अनुमति देगा ताकि आप अपडेट कर सकें और जितनी जल्दी हो सके धक्का दे सकें।

9 मिनट पढ़ा