安卓内核驱动编译的方法——自我感悟

本文介绍了在Android环境中编译内核的方法,包括如何避免使用makemenuconfig配置内核时遇到的问题,以及如何直接修改Makefile文件来编译驱动程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习linux的时候,一般有两种方法。一种是配置Kconfig与Makefile文件,接着使用make menuconfig来实现内核的添加。还有一种是将驱动编译为.ko文件,通过insmod的方式来加载。

可最近在编译安卓源码,发现这样子行不通。当让,第二种方法是可以的。需要用adb工具,将驱动文件添加到手机内部,然后加载,这种方式对于要调TP驱动的我来说不是很方便。于是尝试使用第一种方法,make menuconfig,接着就在kernel目录下产生了.config文件,与在kernel/include/下产生了config的空文件夹。前者用来存放要编译的驱动信息,后者不知道。

在添加完驱动后,在安卓顶层目录下编译内核:make kernel 2>&1 | tee log.txt  结果出现错误:is not clean, please run 'make mrproper'  经过查找原因:grep -nR "is not clean, please run 'make mrproper' " *   发现是kernel顶层目录的Makefile文件里的提示语句。于是删除上述两个文件.config与config文件夹。再次编译,没有报错。

这样就产生了矛盾,于是在第一种方法的基础上不使用make menuconfig。在kernel/arch/arm/configs/目录下有对应平台的后缀为decongfig文件,在文件中添加选项并赋值为y即可。如果想查看文件是否被编译,则在文件中添加错误的代码,编译报错则代表成功。

转念一想,驱动的Makefile都是有固定格式的,如obj-y += 文件名.o  表示将驱动编译进内核,obj-m += 文件名.o 表示将驱动编译成模块。这样子,我们只需要将Makefile文件中的变量直接用y来代替即可,这样就可以将驱动编译进内核。当然,这样做要保证需要编译的部分已经在Makefile的编译流程中。

如果是子目录,就需要被上级目录的Makefile所包含。可以在确定会被编译的目录中新建一个子目录xxx,在当前文件夹下的Makefile 中添加 obj-y +=xxx/ 。然后在xxx目录下新建Makefile,在Makefile 中添加 obj-y += 文件名.o 即可。

下图作为参考

 

今天终于知道原因了(ps:引用大神博客,链接

Android编译kernel时make menuconfig是没有作用的

Android 中编译时会以arch/arm64/configs/xxxdefconfig和各级kconfig文件生成到out\target\product\msm8953_64\obj\KERNEL_OBJ\.config。

执行完Make menuconfig 在对android进行全编,menuconfig的操作是无效的,因为android下编译脚本去out\target\product\msm8953_64\obj\KERNEL_OBJ\目录寻找.config 文件,而menuconfig生成在kernel根目录,除非将menuconfig生成的.config替换掉arch/arm64/configs/xxxdefconfig文件。


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值