Android源码编译

前言


Android源码编译学习小结

内容


系统源码编译

   笔者最近在学习安卓系统源码的编译,为了能够印象深刻,粗略的总结了以下内容,希望对我一样的初学者有一些帮助。

系统编译的初始化指令

   对Android编译环境进行初始化很简单,分为两步。第一步打开终端输入source build/envseup.sh加载所需的文件。

$ source build/envseup.sh
including device/asusource build/envseup.shs/grouper/vendorsetup.sh  
including device/asus/tilapia/vendorsetup.sh  
including device/generic/armv7-a-neon/vendorsetup.sh  
including device/generic/armv7-a/vendorsetup.sh  
including device/generic/mips/vendorsetup.sh  
including device/generic/x86/vendorsetup.sh  
including device/lge/mako/vendorsetup.sh  
including device/samsung/maguro/vendorsetup.sh  
including device/samsung/manta/vendorsetup.sh  
including device/samsung/toroplus/vendorsetup.sh  
including device/samsung/toro/vendorsetup.sh  
including device/ti/panda/vendorsetup.sh  
including sdk/bash_completion/adb.bash  

   从命令的输出可以知道,文件build/envsetup.sh在加载的过程中,又会在device目录中寻找那些名称为vendorsetup.sh的文件,并且也将它们加载到当前终端来。另外,在sdk/bash_completion目录下的adb.bash文件也会加载到当前终端来,它是用来实现adb命令的bash completion功能的。也就是说,加载了该文件之后,我们在运行adb相关的命令的时候,通过按tab键就可以帮助我们自动完成命令的输入。

   第二步是执行命令lunch,如下所示:

$ lunch  

You're building on Linux  

Lunch menu... pick a combo:  
     1. full-eng  
     2. full_x86-eng  
     3. vbox_x86-eng  
     4. full_mips-eng  
     5. full_grouper-userdebug  
     6. full_tilapia-userdebug  
     7. mini_armv7a_neon-userdebug  
     8. mini_armv7a-userdebug  
     9. mini_mips-userdebug  
     10. mini_x86-userdebug  
     11. full_mako-userdebug  userdata.img:将被挂载为 /data,包含了应用程序相关的数据以及和用户相关的数据。
     12. full_maguro-userdebug  
     13. full_manta-userdebug  
     14. full_toroplus-userdebug  
     15. full_toro-userdebug  
     16. full_panda-userdebug  

Which would you like? [full-eng]   

   我们看到lunch命令输出了一个Lunch菜单,该菜单列出了当前Android源码支持的所有设备型号及其编译类型。例如,第一项“full-eng”表示的设备“full”即为模拟器,并且编译类型为“eng”即为工程机。

   当我们选定了一个Lunch菜单项序号(1-16)之后,按回车键,就可以完成Android编译环境的初始化过程。例如,我们选择1,可以看到以下输出:

Which would you like? [full-eng] 1  

============================================  
PLATFORM_VERSION_CODENAME=REL  
PLATFORM_VERSION=4.2  
TARGET_PRODUCT=full  
TARGET_BUILD_VARIANT=eng  
TARGET_BUILD_TYPE=release  
TARGET_BUILD_APPS=  
TARGET_ARCH=arm  
TARGET_ARCH_VARIANT=armv7-a  
HOST_ARCH=x86  
HOST_OS=linux  
HOST_OS_EXTRA=Linux-3.8.0-31-generic-x86_64-with-Ubuntu-13.04-raring  
HOST_BUILD_TYPE=release  
BUILD_ID=JOP40C  
OUT_DIR=out  
============================================  

   我们可以看到,lunch命令帮我们设置好了很多环境变量。通过设置这些环境变量,就配置好了Android编译环境。

源码编译指令

   在执行编译指令之前,为了确保编译环境的Api匹配所要编译的源码版本,我们会先进行make update-api进行Api更新,在此步骤之中可能会遇到各种问题,请读者们自行上网搜索解决,直到更新完成后执行make指令进行编译,注:对于整个系统源码编译,必须在系统源码根目录下执行。

   在Android编译系统在编译过程中,会通过根目录下的Makefile脚本加载build/core/main.mk脚本,接着build/core/main.mk脚本又会加载build/core/Makefile脚本,而Android系统镜像文件就是由build/core/Makefile脚本负责打包生成的。

编译打包过程

  1. 首先,每个模块对应一个android.mk,对应于各个模块的makefile,该文件中只需定义一些变量,就能触发一个模块的编译,不同模块的编译方式不同,当然每个模块必须遵守编译规则;
  2. 其次,每个模块相互独立,但是利用include指令可以将各个模块,添加如main.mk文件中,并有先后顺序,最终各个零散的makefile文件汇聚成最终的makefile文件;
  3. 最后,通过以上过程讲所有模块编译打包。

打包的产物

   所有的编译产物都将位于 /out 目录下,该目录下主要有以下几个子目录:

  • /out/host/:该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulator,adb,aapt 等。
  • /out/target/common/:该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库。
  • /out/target/product//:包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,是具体目标设备的名称。
  • /out/dist/:包含了为多种分发而准备的包,通过“make disttarget”将文件拷贝到该目录,默认的编译目标不会产生该目录。

编译生成的镜像文件

   Build 的产物中最重要的是三个镜像文件,它们都位于 /out/target/product// 目录下。

  • system.img:包含了 Android OS 的系统文件,库,可执行文件以及预置的应用程序,将被挂载为根分区。
  • ramdisk.img:在启动时将被 Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程。
  • userdata.img:将被挂载为 /data,包含了应用程序相关的数据以及和用户相关的数据。

版权声明:本文为博主原创文章,转载请注明出处KidSea

小额赞助,鼓励作者写出更好的文章