這個教程顯示了以下步驟:
該圖托已經針對以下目標完成:
您的軟件包管理器或遵循本指南的Downlad ADB和FastBoot 。
sudo apt-get install adb fastboot
啟動ADB守護程序,驗證您可以使用ADB查看手機,並以Bootloader模式(FastBoot模式)重新啟動。
adb start-server
adb devices
adb reboot bootloader
驗證您可以使用FastBoot看到手機並解鎖Bootloader
fastboot devices
fastboot oem unlock
(or fastboot flashing unlock for newest phones)
您還可以遵循本官方指南,以快速啟動模式手動啟動並解鎖引導加載程序。
您可以在此處找到其他FastBoot命令。
我首先嘗試使用官方倉庫中的最新穩定NDK。
(請勿下載!它不起作用)
export PATH=$PATH:/home/user/ndk/android-ndk-r17b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/
export CROSS_COMPILE=arm-linux-androideabi-
但是我在編譯時有非常奇怪的警告,這阻止了最後的念念。
因此,經過幾次研究後,我在這裡發現,最好使用ARM-EABI-GCC而不是ARM-Linux-androideabi-GCC 。
因此,我下載了最新版本的ARM-EABI-4.8。
==>將其提取到/home/user/ndk/arm-eabi-4.8
export PATH=$PATH:/home/user/ndk/arm-eabi-4.8/bin
export CROSS_COMPILE=arm-eabi-
注意:我可以確認ARM-EABI-4.8的選擇,因為它是build.config中的內核圖像中定義的跨編譯器:
ARCH=arm
BRANCH=android-msm-shamu-3.10
CROSS_COMPILE=arm-eabi-
DEFCONFIG=shamu_defconfig
EXTRA_CMDS=''
KERNEL_DIR=private/msm-moto
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin
FILES="
arch/arm/boot/zImage-dtb
vmlinux
System.map
"
為了將自己的內核模塊插入Nexus 6內核中,我們需要讓內核配置選項可加載模塊支持激活。如果您已經紮根了手機,則可以驗證錄音,其他else相信我:
adb shell su -c "lsmod"
or
adb shell su -c "insmod /data/local/tmp/glitchmin.ko"
默認情況下,這些功能在Android內核中沒有授權。因此,我們將啟用啟用選項可加載模塊支持的新內核。
我們收到的Nexus 6(Shamu)的配置如下:
在此列表中,我下載了該官方的Google內核Android-MSM-SHAMU-SHAMU-3.10-MARSHMALLOWALLE。
==>將其提取到/home/user/images_kernel/mmsm-android-msm-shamu-3.10-marshmallow export mykernel =/home/home/user/user/use/images_kernel/msmmmmmmmmsm-android-msm-shamu-3.10-marshmalshmall
您還可以使用[Cyanogenmod kernel android_kernel_moto_shamu](https://github.com/cyanogenmod/android_kernel_moto_shamu)
然後,您可以按照下一步的步驟構建內核(本指南或本指南或[本指南](https://source.android.com/setup/build/devices或該最後一個))。
在$ mykernel/acch/arm/arm/configs/shamu_config中,替代
# CONFIG_MODULES is not set
經過
CONFIG_MODULES=y
然後
cp arch/arm/configs/shamu_config .config
make ARCH=arm SUBARCH=arm CROSS_COMPILE=arm-eabi- shamu_defconfig
驗證該選項是否啟用可加載的模塊支持已得到很好的激活: make ARCH=arm SUBARCH=arm CROSS_COMPILE=arm-eabi- menuconfig
==>如果不選擇啟用可加載的模塊支持,請按鍵盤上的空格,然後選擇保存和退出
最後編譯整個內核(花費大量時間...): make ARCH=arm SUBARCH=arm CROSS_COMPILE=arm-eabi- -j4
(注意:-jn表示它將在Parallele中使用N處理器)
最後,您必須獲得類似的東西:
Kernel: arch/arm/boot/Image is ready
DTC arch/arm/boot/dts/apq8084-shamu-p2.dtb
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gzip
CC arch/arm/boot/compressed/misc.o
CC arch/arm/boot/compressed/decompress.o
CC arch/arm/boot/compressed/string.o
SHIPPED arch/arm/boot/compressed/hyp-stub.S
SHIPPED arch/arm/boot/compressed/lib1funcs.S
SHIPPED arch/arm/boot/compressed/ashldi3.S
AS arch/arm/boot/compressed/hyp-stub.o
AS arch/arm/boot/compressed/lib1funcs.o
AS arch/arm/boot/compressed/ashldi3.o
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
CAT arch/arm/boot/zImage-dtb
Kernel: arch/arm/boot/zImage-dtb is ready
您可以在$ Mykernel/Arch/Arm/boot/boot/boot/boot/boot/boot/ttb中找到圖像, zimage和zimage-dtb/ boot/
您可以在$ Mykernel/Arch/Arch/Arm/boot/dts/*。 DTB上找到設備樹blob .dtb
您已經準備好內核了。在大多數嵌入式系統上,這將是您工作的盡頭。通常,您會將內核複製到SD卡或NFS位置,並且板將啟動。但是在Android上是不同的。您需要準備特殊的引導分區,然後可以使用FastBoot啟動。
有關此鏈接上的內核和啟動圖像的更多信息。
因此,您需要從Google站點下載手機的Android圖像開始。轉到Nexus Factory Images網站,然後下載與手機上的Android版本相匹配的工廠圖像。
在此處下載Nexus6(Shamu)Android 6.0.1(MMB29K)的工廠圖像。
==>將其提取到/home/user/factory/shamu-mmb29k
export FACTORY=/home/user/factory/shamu-mmb29k
cd $FACTORY
mkdir unziped_img
unzip ./image-shamu-mmb29k.zip -d unziped_img
cd unziped_img
或從此鏈接下載boot.img 。
靈感來自[本指南](http://rex-shen.net/android-unpackpackpack-factory-images/。
sudo apt-get install abootimg
進入未拉扎的工廠圖像文件或下載的boot.img文件,
mkdir boot
cd boot
abootimg -x ../boot.img
# after the successful execution of the last command, we will have initrd.img (= ramdisk), zImage (= kernel) and bootimg.cfg (= kernel config)
# inside the boot folder.
如果您想從ramdisk檢查根文件系統rootfs :
file initrd.img
# the output should be similar to the following line:
# initrd.img: gzip compressed data, from Unix
mkdir ramdisk
cd ramdisk
# "gunzip -c" means unpack to standard output, and "cpio -i" convert standard output in files
gunzip -c ../initrd.img|cpio -i
# to create an image:
abootimg --create boot.img -f bootimg.cfg -k $MYKERNEL/arch/arm/boot/zImage-dtb -r initrd.img [-s <secondstage>] -c bootsize=[SIZE_IT_WANTS]
# to update an existing image:
abootimg -u boot.img -f bootimg.cfg -k $MYKERNEL/arch/arm/boot/zImage-dtb -r initrd.img [-s <secondstage>] -c bootsize=[SIZE_IT_WANTS]
注意:選項“ -r” ,其中ramdisk是initrd.img,而不是ramdisk文件夾。
注意:我的情況,它僅適用於Zimage-DTB ,而不是Zimage和**圖像
下載官方的Google工具。
==>將其提取到/home/user/bootimgtool
mkdir $FACTORY/unpacked_img
export BOOTIMGTOOL=/home/user/bootimgtool
cd $BOOTIMGTOOL
./unpack_bootimg --boot_img $FACTORY/unziped_img/boot.img --out $FACTORY/unpacked_img
cp $MYKERNEL/arch/arm/boot/zImage-dtb $ $FACTORY/unpacked_img/kernel
./mkbootimg --kernel $FACTORY/unpacked_img/kernel --ramdisk $FACTORY/unpacked_img/ramdisk -o $FACTORY/boot.img
下載此工具。
git clone https://github.com/bzyx/bootimg-tools
export BOOTIMGTOOL=/home/user/bootimg-tools
然後,您需要從工廠圖像中解開.img。將其插入您的自定義內核並重新包裝。
cd $BOOTIMGTOOL
make
cd mkbootimg
./unmkbootimg -i $FACTORY/unziped_img/boot.img
cp $MYKERNEL/arch/arm/boot/zImage-dtb $ $FACTORY/unpacked_img/kernel
./mkbootimg --base 0 --pagesize 2048 --kernel_offset 0x00008000 --ramdisk_offset 0x02000000 --second_offset 0x00f00000 --tags_offset 0x01e00000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=shamu msm_rtb.filter=0x37 ehci-hcd.park=3 utags.blkdev=/dev/block/platform/msm_sdcc.1/by-name/utags utags.backup=/dev/block/platform/msm_sdcc.1/by-name/utagsBackup coherent_pool=8M' --kernel kernel --ramdisk ramdisk.cpio.gz -o $FACTORY/boot.img
adb reboot bootloader或者按手動電源並降低聲音幾秒鐘。
然後錄製: fastboot devices
您的設備必須出現在列表中
如果您想快速測試您的新自定義boot.img功能良好,請嘗試: fastboot boot boot.img
如果未返回您失敗,則可以嘗試使用以下方式在內存中刷新它。
fastboot flash boot boot.img
fastboot reboot
cd $FACTORY
zip -r ../image-shamu-mmb29k.zip boot.img
fastboot devices ==> device must appear in the list
./flash-all.sh或 fastboot -w update image-shamu-mmb29k.zip
fastboot reboot
如果您想了解有關不同分區,Android系統,FastBoot命令等的更多信息,請在此處瀏覽一下。
您可以為其使用自動腳本,例如CF-Auto-root。
或遵循本指南啟發的下一步。
/*
* hello-1.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.n");
}
ccflags-y += -fno-stack-protector -fno-pic -Wno-unused-function
obj-m += module.o
module-objs := hello-1.o hello-2.o hello-3.o
CROSS_COMPILE=/home/user/ndk/arm-eabi-4.8/binarm-eabi-
KERNEL_DIR=/home/user/images_kernel/msm-android-msm-shamu-3.10-marshmallow
TMP_BUILD ?= /tmp/build
MODULE_NAME = module.ko
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
current_dir := $(patsubst %/,%,$(dir $(mkfile_path)))
all:
mkdir -p $(TMP_BUILD)
cp ./*.c ./*.h ./Makefile $(TMP_BUILD)
make -C ${KERNEL_DIR} M=$(TMP_BUILD) ARCH=arm PLATFORM=shamu CROSS_COMPILE=${CROSS_COMPILE} modules V=1
cp $(TMP_BUILD)/$(MODULE_NAME) $(PWD)/$(MODULE_NAME)
rm -rf $(TMP_BUILD)
clean:
make -C ${KERNEL_DIR} M=$(PWD) clean
make
它應該創建模塊
adb push module.ko /data/local/tmp
adb shell su -c "lsmod"
adb shell su -c "insmod /data/local/tmp/module.ko"
adb shell su -c "lsmod"
您可以提供更多信息:
adb shell su -c "cat /proc/kmsg"
有關內核模塊編程的更多信息。