在对Android进行编译时,用的就是Linux下的Makefile和Kconfig编译系统,对整个系统进行编译。当然还包括很多配置命令,比如make defconfig, make oldconfig以及各种编译的脚本,共同构成Android的整个编译系统!

跟make menuconfig这个命令相关的文件,包括三类,包括.config,Kconfig,Makefile。为什么不说三个,而说三类呢?因为 Kconfig和Makefile是配合使用的,在很多的子目录都存在,而.config只存在于根目录中。这三个文件的作用分别是:

Kconfig:定义了配置项

**defconfig:对配置项进行赋值

Makefile:建立配置项的生成法则

看到这里,可能有人就头疼了,到底什么是配置项,什么是生成法则。这里要求具有理解Makefile的能力,如果不懂的话,可以去找Makefile的相关资料。

如果使用举例的话,比较容易理解。比如,我编写了一个新设备的驱动文件sprd_sim.c,这里不关心sprd_sim.c的内容。如果想把sprd_sim.c编译到Android系统中,需要按照以下的步骤来完成。

1)       将sprd_sim.c放到Android系统驱动中的一个相关目录中,这个目录只要求已存在Kconfig和Makefile中,比如源码kernel目录/kernel/driver/目录中。

2)       在这个目录的Kconfig中添加

[html] view
plain
copy

  1. menu "SPRD_SIM support"
  2. config SPRD_SIM
  3. bool "Support for SPRD_SIM"
  4. help
  5. Say Y here to add support for leadexd SPRD_SIM
  6. if SPRD_SIM
  7. config SPRD_SIM_LEADEXCEED
  8. tristate "LEADEXD Sprd SIM Driver"
  9. depends on HAS_IOMEM
  10. help
  11. Leadexceed sprd SIM Driver implemented by Jobs-Hu.
  12. endif
  13. endmenu

3)       在Makefile中添加

[html] view
plain
copy

  1. #
  2. #  Makefile for the sim detect device drivers.
  3. #
  4. # 16 May 2014, hu<Jobs.Hu@leadexd.com>
  5. #
  6. #  Object files in subdirectories
  7. obj-$(CONFIG_SPRD_SIM_LEADEXD)    += sprd_sim.o
  8. obj-y

4)       在.config中可以添加

[html] view
plain
copy

  1. CONFIG_SPRD_SIM=y
  2. CONFIG_SPRD_SIM_LEADEXD=y

或者在执行make menuconfig时,找到显示名为MY_DRIVER的选项,使用空格选中。但是这个一般不需要我们自己去执行,一般执行相关的编译脚本后,这些配置信息便会

自动解析到相关的config文件里

5)在board.c中加入该设备

[html] view
plain
copy

  1. static struct platform_device *devices[] __initdata = {
  2. #ifdef CONFIG_ION
  3. &sprd_ion_dev,
  4. #endif
  5. &sprd_emmc_device,
  6. &sprd_sdio0_device,
  7. &sprd_sim_device,
  8. ....

总而言之,就是如果需要向系统内核中添加一个功能,那么首先定义一个配置项对应于这个功能,添加到特定的Kconfig文件中。然后在Makefile 里,定义这个配置项需要编译哪些文件。最后就可以通过make menuconfig或者直接修改.config来使能这个配置项。

其实,.config就是将执行make menuconfig后,对配置项的修改保存到一个文件中而已。当然,各个公司会按照自己的工作需要,加入一些编译脚本,执行新的编译指令,也会生成.config文件,如果没有.config时,make menuconfig会按照默认值来显示。

参考文档:http://blog.chinaunix.net/uid-24227137-id-3277449.html

http://shunfengwei.blog.163.com/blog/static/17522511720123494332301/

http://blog.csdn.net/estate66/article/details/5886816

http://blog.csdn.net/dianhuiren/article/details/6917132


Android编译系统中的Kconfig,Makefile,.config编译系统浅析的更多相关文章

  1. Android驱动中的Kconfig文件与Makefile文件

    内核源码树的目录下都有两个文档Kconfig(2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文 ...

  2. [原创]Android系统中常用JAVA类源码浅析之HashMap

    由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...

  3. 关于Android应用中图片占用内存浅谈

    从事过移动端应用开发的童鞋应该都清楚,内存是非常宝贵的资源.如果能很好的利用有限的内存,对应用性能的提升会有很大的帮助.在实际应用开发中图片内存占整个应用非常大的比重,我们只有了解图片是如何加载到内存 ...

  4. Android编译系统中的Android.bp【转】

    本文转载自: 转自:http://note.qidong.name/2017/08/android-blueprint/ Android编译系统中的Android.bp.Blueprint与Soong ...

  5. 【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109 为了弄清内核的组织结构,我们先来实现下面这个简单的例子. 一.增加 ...

  6. ubuntu——Kconfig、.config、Makefile的关系

    原文地址:http://blog.csdn.net/estate66/article/details/5886816 ,本人对此文有改进. 当我们编写完一个驱动后,我们要把它以模块形式编译或者直接编译 ...

  7. 浅谈内核的Makefile、Kconfig和.config文件

    Linux内核源码文件繁多,搞不清Makefile.Kconfig..config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎么编进内核,不知道怎么配置内核,这些问题 ...

  8. openwrt编译系统制作ubi镜像时会使用系统自带的ubinize还是openwrt编译系统中编译的ubinize

    答:使用openwrt编译系统中编译的ubinize,那么这个工具在哪个目录下?在staging_dir/host/bin目录下

  9. 关于Android NDK中调用第三方的动态库

    因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := li ...

随机推荐

  1. PHP Ajax JavaScript Json 实现天气信息获取

    使用第三方服务 间接方式 思路 使用到的服务 实现代码 前端完整代码 总结 要在自己的网站上添加一个天气预报功能,是一个很普通的需求,实现起来也不是很难.今天来介绍几个简单的方法. 使用第三方服务 有 ...

  2. 信用卡3D验证相关资料

    3D 验证服务,是银行与VISA .MASTERCARD国际组织联合推出的为保障银行维萨及万事达信用卡持卡客户网上交易安全,防范网上伪冒交易的一项信用卡网上支付安全验证服务( 维萨卡使用的验证服务叫& ...

  3. actionbar详解(二)

    经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对较为深刻的理解了.唯一欠缺的是,前面我们都只是学习了理论知识而已,虽然知识点已经掌握了,但是真正投入到项目实战当中时会不会掉链子还很 ...

  4. not in 前面/后面存在null值时的处理

    表声明 order_header表中有ship_method列: ship_method_map表中ship_method为主键列. 需求 找出order_header表中所有ship_method不 ...

  5. qsort函数应用大全

    七种qsort排序方法 <本文中排序都是采用的从小到大排序> 一.对int类型数组排序  int num[100]; Sample: int cmp ( const void *a , c ...

  6. MPI二维笛卡尔坐标划分【1】

    本文简单演示,如何对现有进程进行二维划分,如何获得进程的X和Y坐标. 只有一段程序: #include <mpi.h> #include <stdio.h> #include ...

  7. javascript之正则表达式

    创建正则表达式的两种方法 显式: new RegExp("pattern"[,"flags"]); 例 var regex = new ("abc&q ...

  8. Android项目开发填坑记-Fragment的onAttach

    背景 现在Android开发多使用一个Activity管理多个Fragment进行开发,不免需要两者相互传递数据,一般是给Fragment添加回调接口,让Activity继承并实现. 回调接口一般都写 ...

  9. 查看linux的进程到底用了多少内存

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有    (1). ps aux:      其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存.          ...

  10. (一〇八)iPad开发之横竖屏适配

    在iPad开发中,横竖屏的视图常常是不同的,例如侧边栏Dock,在横屏时用于屏幕较宽,可以展示足够多的内容,每个按钮都可以展示出标题:而竖屏时Dock应该比较窄,只显示图标不现实按钮标题. iPad比 ...