Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การแก้ไขปัญหา >> Android

วิธี Build Android Kernel บน Windows 10 (WSL)

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)

  1. Settings > Update and Security > For Developers > Enable Developer Mode
  2. Control Panel > Programs > Turn Windows Features On/Off > Enable Windows Subsystem for Linux
  3. Reboot PC
  4. Launch Linux Subsystem ให้ Download เสร็จ ตั้ง Password อย่าลืม
  5. Windows Store > ดาวน์โหลด Ubuntu
  6. Launch Ubuntu บน Desktop ใส่ Username/Password
  7. Terminal Ubuntu พิมพ์: apt-get update (Update Repos/Dependencies)
  8. sudo apt-get install -y build-essential kernel-package libncurses5-dev bzip2
  9. เช็ค Dependencies: พิมพ์ gcc ควรเห็น "gcc: fatal error: no input file"
  10. make ควรเห็น "make: *** no target specified and no makefile found. stop."
  11. git ควรเห็น Basic Git Commands
  12. Toolchains (GCC, Linaro, Custom) อุปกรณ์บางตัวต้อง Toolchain ต่างกัน (ไม่ทุก Kernel Boot/Compile กับ GCC)

สำหรับ ARM Devices

ใช้ GCC 4.7

  1. Terminal: mkdir kernel
  2. cd kernel
  3. git 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 วิธี:

  1. 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
  2. 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