Indroduction
ဒီတခါက ဘာအကြောင်းအရာလဲ ဆိုတော့ ကိုယ့်ရဲ့ Android Device အတွက် Build လိုက်တဲ့ Kernel မှာ Linux Kernel version ကို ဘယ်လို Update လုပ်မလဲ ဆိုတဲ့ အကြောင်းအရာပါ။ Linux Kernel release တဲ့ ပိုင်းမှာ (၄)မျိုး ကွဲပြားပါတယ်။
- Prepatch
- Mainline
- Stable
- Long Term
ဆိုပြီး ရှိပါတယ်။ အသေးစိတ်ကိုတော့ ဒီမှာ လေ့လာကြည့်ပါ။
ပထမ Tutorial မှာလည်း ကျွန်တော်ပြောခဲ့ပါတယ် Android မှာ သုံးတဲ့ Linux Kernel branch တွေက Long Term Support (LTS) branch တွေဖြစ်ပါတယ်။ Linux Kernel LTS branch တွေအများကြီး ရှိပါတယ်။ Android ဖုန်း အမျိုးအစားပေါ် မူတည်ပြီး သုံးတဲ့ Linux Kernel LTS branch တွေက မတူနိုင်ပါဘူး။
ဥပမာ အနေနဲ့ ပြောပြရရင် Nexus 5X မှာဆိုရင် linux-3.10.y ဆိုတဲ့ LTS branch ကိုသုံးပြီး၊ Google Pixel မှာဆိုရင် linux-3.18.y ဆိုတဲ့ LTS branch ကို သုံးပါတယ်။ ပြီးမှ အဲဒီ သက်ဆိုင်ရာ Linux kernel branch တွေကို အခြေခံပြီး အသုံးချပြီး Android ဘက်က Engineer တွေ သူတို့ရဲ့ Android Mobile Device အတွက် ကိုက်ညီမှုရှိအောင် ပြန် Modifed ခဲ့တဲ့သဘောပါပဲ။
ဒါကြောင့် ကိုယ့်ဖုန်းအတွက် Kernel source ယူရင် Android ဘက်က Engineer ပေးတဲ့ သက်ဆိုင်ရာဖုန်းအတွက် Kernel source တွေယူရပြီး၊ Linux kernel version update တွေ လုပ်ချင်ရင် မူရင်း kernel.org site ကနေ git. ကိုသုံး၊ code တွေ merge ပြီး ကိုယ့်ဖုန်းအတွက် kernel version တွေ update လုပ်ပေးရမှာပါ။
နောက်တခုက Android ဘက်ကလူတွေက ဘယ်တော့မှ Linux kernel version တွေကို latest လုပ်မပေးပါဘူး။ kernel source မှာ ပါလာတဲ့ built-in kernel version က အမြဲနိမ့်ပါတယ်။ ဥပမာ အနေနဲ့ ပြောပေးရရင် Nexus 5X မှာ linux-v3.10.73 နဲ့ default လာပါတယ်။ ခုလက်ရှိ Latest က linux-v3.10.107 ပါ။ အဲဒါကြောင့် ကိုယ်တိုင် လုပ်ပေးနိုင်ရင် အကောင်းဆုံးပါပဲ။
တချို့သော Android ဘက်က Developer တွေက "Android ရဲ့ linux kernel branch က LTS ဖြစ်လို့ update မလုပ်လည်း ဘာပြဿနာမှ မရှိပါဘူး ရေရှည် Support နိုင်တယ်" ဆိုတဲ့သဘောမျိုးကို ပြောကြပါတယ်။ မှန်တော့မှန်ပါတယ်။ ဒါပေမယ့်လည်း ကျွန်တော်ကတော့ အဲဒါကို သိပ်သဘောမကျပါဘူး။ ပုံမှန် linux kernel update တွေ update လုပ်ရတာ သဘောကျပါတယ်။
ဒါကြောင့် အခု Tutorial မှာ git ကိုသုံးပြီး linux kernel site ကနေ ကိုယ့်ဖုန်းအတွက် Kernel version ကို ဘယ်လို update လုပ်မလဲ ဘယ်လို linux kernel Code (C Programming Code) တွေ ဘယ်လို merge လုပ်မလဲ ဆိုတာ ဆက်ရေးပါမယ်။ ဒီနေရာမှာ နည်းနည်း ပြောပြချင်ပါတယ်။ Linux kernel Repo က C နဲ့ ရေးပါတယ်။ တကယ်တမ်း ကိုယ့်ဖုန်းအတွက် code တွေ merge ရင် အနည်းနဲ့အများ "merge conflicts" တွေဖြစ်နိုင်ပါတယ်။
အဲဒါကြောင့် conflicts တွေရှင်းနိုင်တဲ့ အရည်အချင်းတော့ ရှိရပါမယ်။ အဲလိုမှ မရှင်းနိုင်ရင် Compiler ကနေ compile လုပ်နေတဲ့အချိန် Terminal ကနေ error code တွေပြပေးပြီး Kernel image တွေ ထွက်မလာနိုင်တော့ပါဘူး။ တနည်းအားဖြင့် ဒီအတိုင်းကြီးရှင်းတာထက် စာရင် C Programming Language ကို လေ့လာပြီး ကောင်းကောင်း နားလည်ထားရင် အကောင်းဆုံးပါပဲ။
Requirements
- Linux OS သုံး Computer တလုံး
- Git သုံးတတ်ရပါမယ်
- C Programming ကို basic လောက်တော့ သိရပါမယ်
How To Update
- Linux Kernel version ကို ဘယ်လို Update လုပ်မလဲ ဆိုတဲ့ နေရာမှာ [git merge] ကိုသုံးပြီး code တွေ merge တဲ့နည်းရယ်၊ [git cherry-pick] ကိုသုံးပြီး code တွေ merge တဲ့ နည်းရယ် ဆိုပြီး နှစ်မျိုးရှိပါတယ်။
- ခုမှ git နဲ့ စထိတွေ့မယ့်သူဆို git cherry-pick နည်းပဲ သုံးပါလို့ အကြံပေးချင်ပါတယ်။ မဟုတ်ရင် tag တွေသုံးပြီး git merge ကိုသုံးရင် conflicts တွေ ထောင်သောင်းချီသွားပါလိမ့်မယ်။
- ပထမဦးဆုံး အနေနဲ့ ကိုယ့် Computer ထဲမှာ git install ထားဖို့လိုပါတယ်။
Method(1) : git merge
- ပထမဦးဆုံး အနေနဲ့ linux kernel branch တွေရှိတဲ့ နေရာကို သိရပါမယ်။ မသိရင်လည်း ဒီမှာ သွားကြည့်နိုင်ပါတယ်။
- နောက်တခုက ကိုယ့်ဖုန်းအတွက် Kernel source က ဘယ် linux kernel branch ကို သုံးလဲ ဆိုတာ သိရပါမယ်။ ဥပမာ အနေနဲ့ kernel-source/Makefile ကို ဖွင့်ကြည့်လိုက်ပါ။ Nexus 5X မှာဆိုရင် 3.10.73 ဆိုပြီး တွေ့ရပါမယ်။
Format
VERSION = 3
PATCHLEVEL = 10
SUBLEVEL = 73
EXTRAVERSION =
NAME = TOSSUG Baby Fishအပေါ်က format ကို ကြည့်ရင် 3 10 ဆိုတာ linux kernel branch မှာဆိုရင် linux-3.10.y ကို ဆိုလိုခြင်း ဖြစ်ပါတယ်။
- အခု git command တွေသုံးပြီး code တွေ merge ပါမယ်။
- အရင်ဆုံး ကိုယ့်ဖုန်းအတွက် download လုပ်ထားတဲ့ Kernel source folder ထဲဝင်၊ Right Click ခေါက်၊ Terminal ကို ဖွင့်လိုက်ပြီး အောက်က command လေး ရိုက်လိုက်ပါ။ (Nexus 5X အတွက်ဖြစ်လို့ branch name က linux-3.10.y ပါ)
Format (git merge မလုပ်ခင် git fetch အရင် လုပ်ပေးရပါမယ်)
git fetch --tags <repo-url> <branch-name>
Example: for Nexus 5X
git fetch --tags https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/ linux-3.10.y
- git fetch လုပ်တာက Internet connection ပေါ် မူတည်ပြီး ကြာပါမယ်။ ပြီးသွားရင် tags အလိုက်တွေ Terminal မှာ စီပြီး ပြပေးပါလိမ့်မယ်။
- git merge ပါတော့မယ်။ (ဒီနေရာက အရေးကြီးပါတယ် ခုလက်ရှိ ကိုယ့် Kernel source ထဲက Makefile မှာ တချက်လောက် ကြည့်လိုက်ပါ kernel version ကို 3.10.73 ဆိုရင် နောက် git mergeရင် .74 ကို တဆင့်ချင်း merge ပါ၊ မဟုတ်ဘူးဆိုရင် Latest .107 ကို တန်းပြီး mergeရင် merge conflicts တွေများသွားပါလိမ့်မယ်)
Format
git merge <tag-name>
Example for Nexus 5X
git merge v3.10.74
ဒါမှမဟုတ် Latest version ကို တန်းပြီး merge ရဲရင်လည်း merge ပါ။ conflicts တွေကများလို့ စိတ်တော့ မညစ်သွားပါနဲ့ :P (စတာပါ ဟီးဟီး)
git merge v3.10.107
Method(2) : git cherry-pick
- git cherry-pick တဲ့နေရာမှာ အမှန်က tag အလိုက် cherry-pick တာရယ် commit အလိုက် cherry- pick တာရယ် ဆိုပြီး နှစ်မျိုးရှိပါတယ်။ ဒါပေမယ့် လွယ်လွယ်နဲ့ မြန်မြန်လုပ်လို့ရမယ့် commit အလိုက် cherry-pick တာပဲ ပြောပါမယ်။
- ပထမဆုံး git fetch အရင်လုပ်ပေးရပါမယ်။
Format
git fetch <repo_url> <branch_name>
Example: for Nexus 5X
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/ linux-3.10.y
- ပြီးသွားရင် ကိုယ် Update ချင်တဲ့ Linux kernel version Page ထိ သွားရပါမယ်။ ဥပမာ Nexus 5X အတွက် linux v3.10.107 ကို update လုပ်ချင်ရင် ဒီလင့်ခ် ကို သွားပါ။ အပေါ်ဆုံးမှာ Linux 3.10.107 ဆိုတဲ့ commit ကို တွေ့ပါလိမ့်မယ်။ အဲဒါ အခုလက်ရှိ Latest kernel version(3.10.107) ရဲ့ last commit ပါ။ ပြီးရင် အောက်ထိဆင်းပြီး [next] ကိုနှိပ်ပါ။ ဘယ်ထိသွားရမလဲ ဆိုရင် အဝါရောင်လေးနဲ့ ရေးထားတဲ့ tag လေး v3.10.106 ထိ သွားပါ။ အဲဒီအပါ် commit တကြောင်းက Latest kernel version(3.10.107) ရဲ first commit ပါ။ (ဒီနေရာမှာက ပြောချင်တာက first commit နဲ့ last commit အကြောင်းပါ)
- First commit နဲ့ Last commit အကြောင်း အပေါ်မှာ ရှင်းပြထားပါတယ်၊ အဲဒါ git cherry-pick တဲ့ နေရာမှာ ပြန်သုံးရမှာပါ။ အဲဒါကြောင့် ရှင်းပြတာပါ။
အပေါ်မှာ git fetch သွားတာ ပြီးသွားရင် အောက်က command လေး ရိုက်လိုက်ပါ။
Format (သဘောက Linux 3.0.107 အတွက် commit ထားတဲ့ code အတွေအကုန် ကိုယ့် Repo ထဲ merge လုပ်သွားပါလိမ့်မယ်)
git cherry-pick <first_commit>^..<last_commit>
- Example: (အဲဒါတွေက <commit_hash> တွေပါ copy ပြီး paste လိုက်တာပါ)
First commit ...
Last commit ...
git cherry-pick 0ee88216358c4a1821022763cb84d2b0550bf1e2^..0e3d5747a3ef9986d7617cec396850bf9d039309
<OR>
- ဒါကတော့ commit တခုချင်းစီ git cherry-pick တဲ့ နည်းပါ။
Format
git cherry-pick <commit_hash>
Example: (first commit ကနေ last commit ထဲ တခုချင်းစီ merge တဲ့နည်းပါ။ စိတ်ရှည်ဖို့တော့ လိုပါတယ် commit တွေက အများကြီးပါပဲ)
git cherry-pick 0ee88216358c4a1821022763cb84d2b0550bf1e2
git cherry-pick de714a8a75b6985452fe6e5d3f6393eb1da2eb3d
git cherry-pick 408d8245b80b5426d670de4b4ec60f24b05eb0ef
Continue...- အဲဒါတွေ ပြီးသွားရင် Merge တဲ့ လုပ်ငန်းတော့ ပြီးသွားပြီ။
- အဲဒီနောက် ပထမ Kernel-Building Tutorial အတိုင်း ပြန်ပြီး Compile လုပ်လိုက်ပါ။
- တကယ်လို့ Merge conflicts တွေ ဖြစ်ခဲ့ရင် Terminal ကနေ code error တွေအပြင် line no. တွေကအစ အတိအကျ ပြောပေးပါလိမ့်မယ်။ (C Programming Language ကို အနည်းအပါးရရင် ဖြေရှင်းနိုင်ပါလိမ့်မယ်)
- Conflicts တွေ ဖြေရှင်းတဲ့ နည်းလမ်းတွေ နောက်ထက် သက်သက်ဆက်ရေးပါ့မယ်။
- DONE
Join Us On