幽映每白日,清辉照衣裳。这篇文章主要讲述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脚本负责打包生成的。
编译打包过程
- 首先,每个模块对应一个android.mk,对应于各个模块的makefile,该文件中只需定义一些变量,就能触发一个模块的编译,不同模块的编译方式不同,当然每个模块必须遵守编译规则;
- 其次,每个模块相互独立,但是利用include指令可以将各个模块,添加如main.mk文件中,并有先后顺序,最终各个零散的makefile文件汇聚成最终的makefile文件;
- 最后,通过以上过程讲所有模块编译打包。
所有的编译产物都将位于 /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,包含了应用程序相关的数据以及和用户相关的数据。
推荐阅读
- 未能找到元素“appender”的架构信息
- Android基础部分再学习---activity的状态保存
- android Service oncreate 在UI线程何时用service,何时用thread
- java 安卓环境配置
- Android最简单屏幕适配,项目用dp,sp的只需加一行代码
- Android M 动态权限获取
- 从Handler+Message+Looper源代码带你分析Android系统的消息处理机制
- android context
- Android 全局使用第三方字体