android中各种文件简介(.img, .ko, .so, .a, ...)

一、android编译生成的各种img文件:

   1. ramdisk.img:一个分区影像文件,它会在kernel启动的时候,以只读的方式被 mount , 这个文件中只是包含了 /init 以及一些配置文件,这个ramdisk 被用来调用init,以及把真正的root file system mount 起来。其实ramdisk.img的内容就是/out/target/product/generic/root目录的压缩而已。

ramdisk.img会被打包到boot.img中。

   2. system.img:是包含了整个android系统包括framework,application 等等,会被挂接到 "/" 上,包含了系统中所有的二进制文件。system.img是out/target.product/generic/目录下system目录的一个映射,类似与根文件系统的映像,放着android 的应用程序、配置文件和字体等。

  out/target/product/generic/system:
    .
    |-- bin
    |-- build.prop
    |-- etc
    |-- fonts
    |-- framework
    |-- lib
    |-- usr
      -- xbin


重新打包system.img 具体办法
 a) 在android编译后生成的out目录中查找这个工具 mkyaffs2image
    # find out/ -name mkyaffs2image
    得到=>out/host/linux-x86/bin/mkyaffs2image
 b) android编译后会生成system/ 这个目录,而这个目录就是用来生成system.img的
   #  mkyaffs2image system/ system.img

   3. userdata.img:将会被挂接到 /data 下,包含了所有应用相关的配置文件,以及用户相关的数据 。

   4. boot.img:使用kernel和out/target/product/xxx/root目录打包而成(广义的ramdisk),也就是说, boot.img是由kernel和ramdisk.img生成得到。

二、Linux下.ko, .o, .so, .a, .la文件

Linux下文件的类型是不依赖于其后缀名的,但一般来讲:

.ko 是Linux 2.6内核使用的动态连接文件的后缀名,也就是模块文件,用来在Linux系统启动时加载内核模块

.o 是目标文件,相当于windows中的.obj文件

.so 为共享库,是shared object,用于动态连接的,和dll差不多

.a 为静态库,是好多个.o合在一起,用于静态连接

.la 为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。可以用如下命令查看file *.la来查看文件类型

 

创建.a库文件和.o库文件:
$ gcc -c mylib.c
$ ar -r mylib.a mylib.o

 

.o文件与.ko文件的区别

.o的文件是object文件,.ko是kernel object,与.o的区别在于其多了一些sections,比如.modinfo。.modinfo section是由kernel source里的modpost工具生成的,包括MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE, device ID table以及模块依赖以来关系等等。depmod 工具根据.modinfo section生成modules.dep, modules.*map等文件,以便modprobe更方便的加载模块。

在2.6内核下编译driver, 首先要确认你的linux系统里有没有kernel tree,检查的方法是看看文件夹/lib/modules/$(uname -r)/build是否指向source code,并进去看看,是否有Makefile, include, scripts等文件夹,在scripts/mod下可以找到前面提到的modpost,这个东东是 生成.ko的关键。 如果没有kernel tree,需要重新build一份kernel来建立这个kernel tree。

在2.4内核中,生成的就是.o文件,2.6 kernel对内核模块的管理做了一些扩展!

你可能感兴趣的:(android中各种文件简介(.img, .ko, .so, .a, ...))