Android Device အတွက် Kernel တစ်ခု ဘယ်လိုတည်ဆောက်မလဲ

date_range 18 October 2017

Android Device အတွက် Kernel တစ်ခု ဘယ်လိုတည်ဆောက်မလဲ

visibility 6100 Views

                အရင်ဆုံး Intro အနေနဲ့ Kernel ဆိုတာ ဘာလဲ၊ ဘာအတွက်လဲဆိုတာ ရှင်းပြပေးပါမယ်။ Android OS က Linux Kernel ကို Based ထားပြီး၊ Android ရဲ့ Kernel က Modified ထားတဲ့ Linux Kernel တခုပါ။ Android မှာ သုံးထားတဲ့ Linux Kernel branch တွေက Long Term Support (LTS) Branch တွေ ဖြစ်ပါတယ်။  https://www.kernel.org မှာ Long Term Branch တွေကြည့်နိုင်ပါတယ်။ ဥပမာ Nexus 5X, 6, 6P မှာဆို linux-3.10-y ဆိုတဲ့ branch ကို သုံးပါတယ်။

                Android OS က Linux Kernel ပေါ်မှာ အခြေခံပြီး တည်ဆောက်ထားတာဖြစ်ပြီး၊ Kernel ဆိုတာ OS တခုရဲ့ အရေးကြီးတဲ့ အစိတ်အပိုင်းတခုပါ။ CPU, Memory, Display စတဲ့ Hardware အစိတ်အပိုင်းတွေနဲ့ Software နဲ့ကြား ချိတ်ဆက်ပြီး အလုပ်လုပ်တဲ့ နေရာမှာ Kernel က အရေးကြီးတဲ့ အပိုင်းမှာ ပါဝင်ပါတယ်။ Android OS Architecture ရဲ့ Linux Kernel အပိုင်းမှာ Display Driver, Camera Driver, USB Driver, Bluetooth Driver, Audio Driver, Power Management အစရှိသဖြင့် ပါဝင်ပါတယ်။ ( ဥပမာ ပြောပြတာပါ နောက်ထပ် ကျန်ပါ သေးတယ်။) နမူနာပြောပြရရင် ကျွန်တော့်ရဲ့ Nexus 5X မှာ ပုံမှန် Built-in ပါတဲ့ Stock Kernel မှာ Double Tap to Wake/Sleep တို့ Display နဲ့ ပတ်သက်တဲ့ KCAL Color Control တို့ Audio နဲ့ ပတ်သက်တဲ့ Sound Control တို့ မပါပါဘူး၊ ကိုယ့်မှာ Skill ရှိရင် Kernel source တခုခု ကနေ အဲဒီ Kernel features တွေ Add ပြီး ပြန် compile လုပ်နိုင်ပါတယ်။ ဆိုလိုတဲ့ သဘောက အဲဒါတွေက Kernel ပိုင်းက လုပ်နိုင်တဲ့ features တွေပါ။ ဘာလို့ Custom Kernel တခု ပြန် Compile ရတာလည်း ဆိုရင် အဲဒီလို Kernel features တွေ လိုချင်လို့ပါပဲ။


Requirements

  1. Linux OS သုံးထားသော Computer တလုံး (ကျွန်တော်ကတော့ ubuntu သုံးပါတယ်)
  2. အခြေခံ Linux command အနည်းအပါး သိရပါမယ်
  3. ကိုယ်ရဲ့ ဖုန်းအတွက် လိုအပ်တဲ့ Kernel Source တခု
  4. Kernel compile ဖို့အတွက် လိုအပ်တဲ့ Toolchains (တနည်းအားဖြင့် ARM/ARM64 GCC Compiler တခု)
  5. Git သုံးတတ်ရင် ပိုကောင်းပါမယ် နောက်ပိုင်း Kernel features တွေ add ရင် လိုလာပါလိမ့်မယ်။

Kernel Sources

                Kernel source တွေက ဖုန်းအမျိုးအစာပေါ် မူတည်ပြီး Download ရမယ့် Site တွေက ကွဲပြားသွားပါလိမ့်မယ်၊ လိုအပ်တဲ့ Link တွေ အောက်မှာ ပေးထားပါမယ်။

Toolchains

                Kernel Source ကနေ compile ဖို့အတွက်ဆိုရင် Toolchain တခုလိုအပ်ပါတယ်၊ Toolchain မှာ ကိုယ့်ဖုန်းရဲ့ CPU architecture ပေါ် မူတည်ပြီး၊ ARM နဲ့ ARM64 ဆိုပြီး (၂) မျိုး ရှိပါတယ်။ လိုအပ်တဲ့ Link တွေ အောက်မှာ ပေးထားပါတယ်။

Downloading

ဒီ Tutorial ကို ကျွန်တော့်မှာရှိတဲ့ Nexus 5X နဲ့ ဥပမာပေးပြီး ပြောသွားမှာပါ။ ကျန်တဲ့ဖုန်းတွေ အတွက်ကလည်း သဘောတရားက တူတူပါပဲ၊ Kernel Source download တဲ့ နေရာပဲ ကွာသွားမှာပါ။

အရင်ဆုံး Terminal ကိုဖွင့်ပြီး ဒီ command လေးရိုက်လိုက်ပါ။ (Dir တခုဆောက်ပါမယ်)

mkdir KernelName
cd KernelName
  • Nexus 5X အတွက် Kernel source download ဖို့ အတွက် ဒီ command လေး ရိုက်လိုက်ပါ။
  • အရင်ဆုံး ကိုယ့် Computer ထဲမှာ Git install ထားဖို့ လိုပါတယ်။
git clone -b android-msm-bullhead-3.10-oreo-r4 --depth=1 https://android.googlesource.com/kernel/msm
  • ပြီးရင် Kernel compile ဖို့အတွက် Toolchains download ရပါမယ်။ ( ဒီနေရာမှာ တခု သတိထားဖို့လိုပါတယ် ကိုယ်ရဲ့ဖုန်း CPU arch က arm64 ဆို arm64 toolchain ကို download ပါ၊ မဟုတ်ဘူး arm ဆိုရင် arm toolchain ကို download ပါ )

git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9

  • အဲဒါတွေ အကုန်ပြီးသွားပြီဆိုရင် Kernel Build ဖို့ အဆင်သင့်ဖြစ်ပါပြီ။

How To Build Kernel

  • အရင်ဆုံး Kernel source နဲ့ toochains ကို ပထမက ဆောက်ထားတဲ့ KernelName (PuerZ-Kernel-N5X) ဆိုတဲ့ Dir ထဲမှာ နှစ်ခုလုံး အဆင်သင့် ရှိနေရပါမယ်။
  • Toolchain Name ကို AOSP-Toolchain လို့ အမည်ပေးလိုက်ပြီး၊ Nexus 5X Kernel Source Name ကို bullhead လို့ အမည် ပေးလိုက်ပါမယ်။ (အဆင်ပြေသလို Rename လိုက်ပါ၊ ပြဿ နာ မရှိပါဘူး၊ တခုပဲ Toolchain Location ပြန်ပေးတဲ့ နေရာမှာ အဲဒီ Name တွေအတိုင်း အတိအကျ သိ ဖို့ လိုပါတယ်)
  • e.g : Toolchain location

/home/zawzaw/PureZ-Kernel-N5X/AOSP-Toolchain

  • e.g : Kernel Source location

/home/zawzaw/PureZ-Kernel-N5X/bullhead


  • ပြီးရင် ကိုယ့်ဖုန်းအတွက် download ထားတဲ့ Kernel source Folder ထဲ ဝင်လိုက်ပါ။
  • Right Click ထောက်ပြီး Terminal လေးကို ဖွင့်လိုက်ပါ။
  • ပထမဦးဆုံး လုပ်ရမှာ Kernel source ကနေ compile ဖို့အတွက် export ဆိုတဲ့ command ကို သုံးပြီး toolchain ကို Set new environment variable သွားလုပ်ရပါမယ်။ (export - Set a New Environmetn Variable)
  • Type this command (အဲဒီမှာ bin/နောက်ကကောင်ကို toochain prefix လို့ခေါ်ပါတယ် အခု Google က ပေးထားတဲ့ Toochain တွေ ရဲ့ prefix တွေကို ပြောပြပါမယ်၊ ARM အတွက်ဆိုရင် "arm-eabi-" ၊ ARM64 အတွက်ဆိုရင် "aarch64-linux-android-" ဖြစ်ပါတယ်)
export CROSS_COMPILE=${HOME}/PureZ-Kernel-N5X/AOSP-Toolchain/bin/aarch64-linux-android-
  • ကိုယ့်ဖုန်းရဲ့ CPU arch က arm လား arm64 လား သိထားဖို့ အရင်လိုပါတယ်။
  • အရင်ဆုံး ကိုယ့်ဖုန်းရဲ့ arch ကို ပြောပေးဖို့ လိုပါတယ်။
  • Nexus 5X က arm64 ဖြစ်တဲ့အတွက် ဒီ command လေး ဆက်ရိုက်လိုက်ပါ။ (တကယ်လို့ ကိုယ့်ဖုန်းက arm ဆိုရင် arm64 နေရာမှာ armလို့ ပြောင်း ရိုက်လိုက်ပါ။
export ARCH=arm64
export SUBARCH=arm64
  • နောက်တခုက Kernel source ထဲမှာ Compile ထား output file တွေ ရှိရင် ရှင်း ပေးဖို့ လိုပါတယ်။

make clean


  • နောက်ထပ်တခု သိဖို့ကတော့ ကိုယ့် build မယ့် Kernel ရဲ့ build kernel configuration ပါ။
  • ARM device ဆိုရင် kernelsource/arch/arm/configs/ အောက်မှာ ရှိပါတယ်။
  • ARM64 device ဆိုရင် kernelsource/arch/arm64/configs/ အောက်မှာ ရှိပါတယ်။
  • Nexus 5X အတွက်ဆိုရင် bullhead/arch/arm64/configs/bullhead_defconfig (bullhead_defconfig ဆိုတာ Nexus 5X အတွက် build မယ့် kernel configuration အပိုင်းပါပဲ)
  • ကိုယ့်ဖုန်းအတွက် kernel defconfig ကို သိချင်ရင် KernelSource/build.config file လေးကို ဖွင့်ကြည့်နိုင်ပါတယ်။
  • အရင်ဆုံး Kernel compile မလုပ်ခင် build configuration လုပ်ပေးဖို့ လိုပါတယ်။

make bullhead_defconfig


  • ပြီးရင် Kernel compile ပါတော့မယ်၊ compile ဖို့အတွက် အောက်က command လေးရိုက်လိုက်ပါ။

make -j$(nproc --all)


  • Compilation Processing Time က ကိုယ့် Computer ရဲ့ CPU core ပေါ် မူတည်ပြီး ကြာနိုင်ပါတယ်။
  • အဲဒါတွေပြီးသွားရင် Compiler ကနေ Compile လုပ်သွားပါလိမ့်မယ်။


  • Build လိုက်တဲ့ Kernel zImage တွေက ARM ဆိုရင် - kernelsource/arch/arm/boot/အောက်မှာ ထွက်ပါတယ်၊ ARM64 ဆိုရင် - kernelsource/arch/arm64/boot/အောက်မှာ ထွက်သွားလိမ့်မယ်။


  • အဲဒါ တွေ အောင်မြင်သွားပြီဆိုရင် ကိုယ်ဖုန်းအတွက် Kernel Install ဖို့ FlashableZip ဘယ်လိုလုပ်မလဲ ဆိုတာ ဆက်ရေးပါမယ်။

How To Create FlashableZip

  • Kernel Build ပြီးလို့ zImage တွေ ထွက်လာပြီဆိုရင် ကိုယ့်ရဲ့ဖုန်းအတွက် CustomRecovery (TWRP) ကနေ Install လို့ရမယ့် FlashableZip Create နည်းကို ပြောပြပါမယ်။ XDA Recognized Developer တယောက်ဖြစ်တဲ့ osm0sis ရေးထားတဲ့ AnyKernel2 - Kernel FlashableZip Template ဆိုတာရှိပါတယ်။ အဲဒီ Template ကနေ ကိုယ့်ဖုန်းအတွက် ဘာတွေ ပြင်ဆင်ဖို့ လိုအပ်လည်းဆိုတာ ဆက်ပြောပါမယ်။
  • AnyKernel2 Documentation နည်းနည်းဖက်ကြည့်လိုက်ပါ လွယ်ပါတယ် : https://github.com/osm0sis/AnyKernel2/blob/master/README.md
  • အရင်ဆုံး AnyKernel2 ကို download လုပ်လိုက်ပါ။
git clone https://github.com/osm0sis/AnyKernel2

OR

  • Recommended for Nexus 5X
git clone -b bullhead --depth=1 https://github.com/zawzaww/anykernel2-flashable
  • ဘာတွေလိုအပ်လည်း ဆိုရင် Kernel name ပြင် ပေးလို့ရမယ်၊ device name သိရပါမယ် (eg: LG Nexus 5X ဆို device name - bullhead)၊ ကိုယ့်ဖုန်းရဲ့ boot partition location သိရမယ်၊ ramdisk ထဲမှာဆိုရင် ကိုယ့်ဖုန်းရဲ့ fstab.devicename (eg- fstab.bullhead) လိုပါတယ်၊ fstab ဆိုတာ File Systems Table ကိုပြောတာပါ။
  • Nexus 5X အတွက် fstab.bullhead တခု ဥပမာပေးပါမယ် : https://github.com/purezandroid/device-lge-bullhead/blob/purez-8.0.0/fstab.bullhead ( အဲလိုပဲ ကိုယ့်ရဲ့ ဖုန်းအတွက် လိုအပ်ပါတယ် device-tree/fstab.your-devicename )
  • ပထမဦးဆုံး အနေနဲ့ Compile လို့ ရလာတဲ့ Image.gz-dtb (kernelsource/arch/arm64/boot/Image-gz-dtb) ကို Copy ကူးပြီး< ခုနက AnyKernel2 Folder ထဲ Paste လိုက်ပါ၊ ပြီးရင် zImage-dtb လို့ rename လိုက်​ပါ။
  • ပြင်ရမယ့်ကောင်တွေကို ဆက်ပြောပါမယ်။
  • Kernel Name : AnyKernel2 ထဲက anykernel2.sh file လေးကို Text Editor တခုခုနဲ့ ဖွင့် kernel.string= kernel name ရေးလိုက်ပါ။
kernel.string=PureZ Kernel by ZawZaw @XDA-Developers

Device Name : anykernel2.sh ကိုဖွင့်ပြီး device.name1 နဲ့ device.name2 နေရာမှာ ကိုယ့်ဖုန်းရဲ့ device name ကို ရေးလိုက်ပါ။ (ဖုန်း အမျိုးအစားအပေါ် မူတည်ပြီး Name ကွာသွားပါလိမ့်မယ်။

device.name1=bullhead
device.name2=Bullhead
  • boot partition : ဒါက အရေးကြီးပါတယ် ကိုယ့်ဖုန်းအတွက် boot partition location ကို အတိအကျ သိရပါမယ်၊ ဘယ်လိုရှာကြည့်နိုင်လဲ ဆိုရင် ကိုယ့်ဖုန်းက Root ထားရင်ကြည့်နိုင်ပါတယ်၊ anykernel2.sh ထဲက "block=/dev/block/platform/..." ဆိုတဲ့ line မှာ ပြင်ပေးရမှာပါ။
  • For Nexus 5X

block=/dev/block/platform/soc.0/f9824900.sdhci/by-name/boot;


  • fstab.device-name : AnyKernel2 ထဲမှာ ramdisk ဆိုတဲ့ folder လေးရှိပါတယ်၊ အဲဒီ အထဲကို အပေါ်မှာပြောခဲ့တဲ့အတိုင်း Nexus 5X အတွက် fstab.bullhead file လေး ကို သွားထည့်ရမှာပါ။ (အဲဒီ fstab file လေးထဲမှာ ဘာတွေ အဓိကပါလဲဆိုတော့ ကိုယ့်ဖုန်း ရဲ့ /system, /data, /cache, /firmware, /boot, /recovery, /persist အစရှိတဲ့  <mount_point> partition တွေ ပါဝင်ပါတယ်၊ ဒီ mount_point တွေဆိုတာ filesystem path တွေပဲ ဖြစ်ပါတယ်။ ကိုယ့်ဖုန်းရဲ့ Android Filesystems Table လေး တစ်ခုပါပဲ။
  • သူရဲ့ format လေးကို နည်းနည်းရေးပြပါမယ်။ (Android 4.3 နဲ့ နောက်ပိုင်း version တွေရဲ့ ပုံစံပါ)
  • ဒီထက်မက လေ့လာချင်ရင် AOSP site မှာ အပြည့်အစုံဖတ်နိုင်ပါတယ်။
 <src>  <mount_point>  <type>  <mount_flags>  <fs_mgr_flags>
  • E.g for Nexus 5X ( /system )

 /dev/block/platform/soc.0/f9824900.sdhci/by-name/system       /system         ext4   ro,barrier=1,inode_readahead_blks=8

  • For Nexus 5X (fstab.bullhead) Sample : https://android.googlesource.com/device/lge/bullhead/+/oreo-r6-release/fstab.bullhead

    # Android fstab file.
    #<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
    # The filesystem that contains the filesystem checker binary (typically /system) cannot
    # specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/system /system ext4 ro,barrier=1,inode_readahead_blks=8 wait,verify=/dev/block/platform/soc.0/f9824900.sdhci/by-name/metadata
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor /vendor ext4 ro,barrier=1,inode_readahead_blks=8 wait,verify=/dev/block/platform/soc.0/f9824900.sdhci/by-name/metadata
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/userdata /data ext4 noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc,errors=panic,inode_readahead_blks=8 wait,check,forcefdeorfbe=/dev/block/platform/soc.0/f9824900.sdhci/by-name/metadata
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/cache /cache ext4 noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc,errors=panic wait,check
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/persist /persist ext4 noatime,nosuid,nodev,barrier=1,data=ordered,nodelalloc,nomblk_io_submit,errors=panic wait,notrim
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/modem /firmware vfat ro,shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0 wait
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/boot /boot emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/recovery /recovery emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/misc /misc emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/modem /radio emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/sbl1 /sbl1 emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/tz /tz emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/rpm /rpm emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/sdi /sdi emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/aboot /aboot emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/imgdata /imgdata emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/pmic /pmic emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/hyp /hyp emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/sec /sec emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/keymaster /keymaster emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/cmnlib /cmnlib emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/persistent /persistent emmc defaults defaults
    /devices/soc.0/f9200000.ssusb/f9200000.dwc3/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
    /dev/block/zram0 none swap defaults zramsize=533413200,notrim
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/sbl1bak /sbl1bak emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/tzbak /tzbak emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/rpmbak /rpmbak emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/abootbak /abootbak emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/pmicbak /pmicbak emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/hypbak /hypbak emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/keymasterbak /keymasterbak emmc defaults defaults
    /dev/block/platform/soc.0/f9824900.sdhci/by-name/cmnlibbak /cmnlibbak emmc defaults
    view raw fstab.bullhead hosted with ❤ by GitHub

  • အဲဒါတွေ အောင်မြင်ပြီ ဆိုရင် Flashable Zip တစ်ခု Create လုပ်ပါမယ်။
  • AnyKernel2 folder ထဲမှာ Right Click ထောက်ပြီး Terminal ကိုဖွင့်လိုက်ပါ။
  • Type this command
zip -r9 Your-Kernel-Name.zip * -x README Your-Kernel-Name.zip
  • ပြီးသွားရင် Kernel2 folder ထဲမှာ Kernel Flashable Zip တခုထွက်လာပါပြီ။
  • Reday to flash your Kernel Zip from TWRP Recovery for your Android Device
  • Done
References
TechX Myanmar
About Author
Assinged Tags
Android Operating System Kernel Linux related GitHub Linux Kernel KernelBuild Tutorial
Categorized Under
How To

Join Us On

Facebook
YouTube
Twitter
GooglePlus
TechX RSS Feed