Appuals มีคู่มือ Android Development ดีๆ เช่น Build Custom ROM จาก AOSP แต่ส่วนใหญ่เน้น Linux Environment
คู่มือนี้สอน Build Android Kernel บน Windows 10 - ใช้ Linux Build Environment แต่เป็น Linux Subsystem ภายใน Windows 10 (WSL) เหมาะสำหรับ Windows 10 User ที่อยาก Develop Android
เน้น Build Kernel สำหรับ ARM และ MediaTek Devices, เพิ่ม Features, และ Git Basics
ข้อกำหนด
- Windows 10 x64 (มี Fall Creator's Update)
ตั้งค่า Linux Environment (WSL)
- Settings > Update and Security > For Developers > Enable Developer Mode
- Control Panel > Programs > Turn Windows Features On/Off > Enable Windows Subsystem for Linux
- Reboot PC
- Launch Linux Subsystem ให้ Download เสร็จ ตั้ง Password อย่าลืม
- Windows Store > ดาวน์โหลด Ubuntu
- Launch Ubuntu บน Desktop ใส่ Username/Password
- Terminal Ubuntu พิมพ์:
apt-get update(Update Repos/Dependencies) sudo apt-get install -y build-essential kernel-package libncurses5-dev bzip2- เช็ค Dependencies: พิมพ์
gccควรเห็น "gcc: fatal error: no input file" makeควรเห็น "make: *** no target specified and no makefile found. stop."gitควรเห็น Basic Git Commands- Toolchains (GCC, Linaro, Custom) อุปกรณ์บางตัวต้อง Toolchain ต่างกัน (ไม่ทุก Kernel Boot/Compile กับ GCC)
สำหรับ ARM Devices
ใช้ GCC 4.7
- Terminal:
mkdir kernel cd kernelgit clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7
สำหรับ ARM 64 Devices
ต้อง 64-bit Kernel Compiler เช่น aarch64
หา Source Files ของอุปกรณ์
ส่วนยาก ต้องหา GitHub Repo ที่ Host Kernel Source ค้นหาบน XDA Forums
โครงสร้าง Kernel ทั่วไป:
- /arch/arm/configs: Config Files (Governors, etc.)
- /output/arch/arm/boot/: ที่เก็บ zImage
- build.sh: Script ทำให้ Build ง่ายขึ้น
- /arm-cortex-linux-gnueabi-linaro_5.2-2015.11-2: Toolchain ใน Source
Clone Kernel Source:
cd kernel git clone "GitHub Kernel URL" -b "Branch Name" ตัวอย่าง: git clone https://github.com/atxoxx/android_ke...amsung_msm8974 -b xenomTW
Build Kernel
เข้า File Explorer: /home/user ID/kernel จะมี 2 โฟลเดอร์ Toolchain และ Kernel Source เข้า Kernel Source
ARM Devices
#!/bin/bash export ARCH=arm export CROSS_COMPILE= mkdir output make -C $(pwd) O=output "defconfig name และ variant ถ้ามี" make -j4 -C $(pwd) O=output
คำอธิบาย:
- #!/bin/bash: รันใน Shell
- export ARCH=arm: Kernel Architecture Type (arm64, etc.)
- export CROSS_COMPILE=: Path ของ Toolchain ต้องตรงแม่นยำ และ Dash ท้ายบรรทัดบังคับ
- mkdir output: โฟลเดอร์เก็บ zImage ที่ Compile เสร็จ
- make -C $(pwd) O=output: Defconfig สำหรับ Compile
- make -j4 -C $(pwd) O=output: -j# = ความเร็ว Compile ตาม CPU (Budget CPU อย่า -j32 จะไม่เสถียร)
- cp output/arch/arm/boot/Image $(pwd)/arch/arm/boot/zImage: ย้าย Image ไป Path ที่ 2
ตัวอย่างเพิ่ม:
#!/bin/bash export ARCH=arm export CROSS_COMPILE=$(pwd)/arm-cortex-linux-gnueabi-linaro_5.2-2015.11-2/bin/arm-cortex-linux-gnueabi- mkdir output make -C $(pwd) O=output msm8974_sec_defconfig VARIANT_DEFCONFIG=msm8974_sec_ks01_skt_defconfig SELINUX_DEFCONFIG=selinux_defconfig make -j4 -C $(pwd) O=output cp output/arch/arm/boot/Image $(pwd)/arch/arm/boot/zImage
ARM 64 Devices
#!/bin/bash export ARCH=arm64 export CROSS_COMPILE="path to toolchain" (ต้องจบด้วย "nameofarch-something-") mkdir output make -C $(pwd) O=output "defconfig name" make -j4 -C $(pwd) O=output
Mediatek (MTK) Devices
#!/bin/bash export CROSS_COMPILE="path to toolchain" (จบด้วย "nameofarch-something-") export ARCH=arm ARCH_MTK_PLATFORM= make "defconfig name" make -j4
เสร็จแล้ว Terminal: sudo bash build.sh ใส่ Password Compile เริ่ม (CPU Dependent: AMD Phenom X4 3.4GHz 8GB RAM ~10 นาที)
เสร็จจะแจ้ง "zimage is ready"
หา zImage
- ARM/ARM64: /Output/arch/arm/boot/
- Mediatek: /arch/arm/boot/
ไม่ทุก Build ให้ zImage อาจเป็น Image Format อื่น
สำคัญ: Compile ใหม่ ควร make clean และ make mrproper ก่อน
ทำให้ Kernel Boot ได้
2 วิธี:
- AnyKernel Method (XDA @osm0sis): อ่าน Tutorial เต็มๆ สรุป: วาง zImage ที่ Root (dtb/dtbo สำหรับอุปกรณ์ที่ต้องการ) วาง Ramdisk Files ใน /ramdisk, Modules ใน /modules, Patch Files ใน /patch แก้ anykernel.sh (Kernel Name, Boot Partition, Permissions, Ramdisk Methods)
zip -r9 UPDATE-AnyKernel2.zip * -x .git README.md *placeholder - Unpack/Repack boot.img: จาก ROM เดียวกัน (CM, TouchWiz, EMUI) และ Android Version เดียวกัน Swap zImage กระบวนการซับซ้อน อ่าน Tutorial เต็มๆ สรุป: Unzip, unpackimg command หรือ Drag-drop, แก้ Ramdisk, repackimg Batch Script รวม zImage+Ramdisk ใหม่, cleanup Batch Script Reset Folder
ก่อน Flash: Backup Stock boot.img แล้ว Flash Kernel ดูว่า Boot ได้ไหม
เพิ่ม Features ใน Kernel
เพิ่ม Features ทำให้ Kernel น่าสนใจ: CPU Governors, IO Schedulers, GPU Overclocking, Audio Enhancements, etc.
ตัวอย่าง Add Governor (Intellimm):
ใน "arch/arm/configs/" ไฟล์ "msm8974_sec_defconfig" และ "cm_msm8974_sec_defconfig" ถูกแก้ไข
ระหว่างบรรทัด 140-141 เพิ่ม: CONFIG_CPU_FREQ_GOV_INTELLIMM=y (Enable Intellimm ตอน Compile)
เทคนิคเดียวกันกับ Text Boxes อื่นๆ (เพิ่ม/ลบ/ตำแหน่ง)
ขึ้นอยู่กับ Features ที่เพิ่ม Files ที่แก้ไข/เพิ่ม/ลบ จะต่างออกไป
Commit แสดง Changes ทั้งหมด!
General Tips and Tricks
เปลี่ยน Kernel Name และ Version
วิธีง่าย: Edit ใน defconfig: CONFIG_LOCALVERSION="-" after - in your defconfig ตัวอย่าง: CONFIG_LOCALVERSION="-XenomTW-3.2.6"
วิธีขั้นสูง:
Makefile ใน Root Folder ของ Kernel Source เพิ่ม:
CONFIG_LOCALVERSION="nameofyourkernel" LOCALVERSION="versionofyourkernel"
ห้ามแก้ Version, PatchLevel, Sublevel, Extraversion
Alternative: scripts/mkcompile_h เพิ่ม:
LINUX_COMPILE_BY="nameofyourchoice" LINUX_COMPILE_HOST="nameofyourchoice"
แก้ไข PATH Problems
Error "Is your path correct?": Terminal export PATH="pathtotoolchainlocation"/bin:$PATH
เข้าถึง Ubuntu Folders จาก Windows 10
Path ปกติ: C:\Users"NAME"\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home
อย่า Edit ไฟล์จาก Windows โดยตรง จะทำลาย Permissions ต้อง Reset จาก Linux Terminal