Android源码编译

幽映每白日,清辉照衣裳。这篇文章主要讲述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,如下所示:
$ lunchYou‘re building on LinuxLunch 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-userdebuguserdata.img:将被挂载为 /data,包含了应用程序相关的数据以及和用户相关的数据。 12. full_maguro-userdebug 13. full_manta-userdebug 14. full_toroplus-userdebug 15. full_toro-userdebug 16. full_panda-userdebugWhich 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编译环境。
源码编译指令
【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,包含了应用程序相关的数据以及和用户相关的数据。

    推荐阅读