android 编译学习
来源:互联网 发布:中国研究数据服务平台 编辑:程序博客网 时间:2024/06/15 03:02
Android编译文件说明
编译基本命令:
$ source build/envsetup.sh $ lunch full-eng $ make -j8
第一步: 初始化编译环境变量,引入一些辅助的shell函数(launch, m,mm,mmm,cgrep,jgrep,croot,resgrep,godir,printconfig,add_launch_combo),并且将vender和device目录下的vendersetup.sh文件加载到当前终端
第二步:指定目标的编译设备及编译类型, full是android源码中已经定义好的一种产品,是为模拟器而设定,编译类型eng为工程机
编译类型说明:
当选择这种类型时,编译结果将:
- 安装包含 eng, debug, user,development 标签的模块
- 安装所有没有标签的非 APK 模块
- 安装所有产品定义文件中指定的 APK 模块
当选择这种类型时,编译结果将:
- 安装所有带有 user 标签的模块
- 安装所有没有标签的非 APK 模块
- 安装所有产品定义文件中指定的 APK 模块,APK 模块的标签将被忽略
该类型和 user 一样,除了:
- 会安装包含 debug 标签的模块
- 编译出的系统具有 root 访问权限
Make文件说明:
由代码跟目录的makefile--> build/core/main.mk,一步一步推导开来
![](file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/enhtmlclip/Image.png)
主要的make文件作用说明:
$(call include-path-for, frameworks-native)
便可以获取到 framework 本地代码需要的头文件路径。envsetup.mk配置 Build 系统需要的环境变量,例如:TARGET_PRODUCT,TARGET_BUILD_VARIANT,HOST_OS,HOST_ARCH 等。当前编译的主机平台信息(例如操作系统,CPU 类型等信息)就是在这个文件中确定的。
另外,该文件中还指定了各种编译结果的输出路径。combo/select.mk根据当前编译器的平台选择平台相关的 Make 文件。dumpvar.mk在 Build 开始之前,显示此次 Build 的配置信息。config.mk整个 Build 系统的配置文件,最重要的 Make 文件之一。该文件中主要包含以下内容:
- 定义了许多的常量来负责不同类型模块的编译。
- 定义编译器参数以及常见文件后缀,例如 .zip,.jar.apk。
- 根据 BoardConfig.mk 文件,配置产品相关的参数。
- 设置一些常用工具的路径,例如 flex,e2fsck,dx。
${ONE_SHOT_MAKEFILE}
ONE_SHOT_MAKEFILE 是一个变量,当使用“mm”编译某个目录下的模块时,此变量的值即为当前指定路径下的 Make 文件的路径。${subdir_makefiles}
各个模块的 Android.mk 文件的集合,这个集合是通过 Python 脚本扫描得到的。post_clean.mk在前一次 Build 的基础上检查当前 Build 的配置,并执行必要清理工作。legacy_prebuilts.mk该文件中只定义了 GRANDFATHERED_ALL_PREBUILT 变量。Makefile被 main.mk 包含,该文件中的内容是辅助 main.mk 的一些额外内容。其它主要make目标:
添加新的模块:
在源码树中,一个模块的所有文件通常都位于同一个文件夹中。为了将当前模块添加到整个 Build 系统中,每个模块都需要一个专门的 Make 文件,该文件的名称为“Android.mk”。Build 系统会扫描名称为“Android.mk”的文件,并根据该文件中内容编译出相应的产物。
需要注意的是:在 Android Build 系统中,编译是以模块(而不是文件)作为单位的,每个模块都有一个唯一的名称,一个模块的依赖对象只能是另外一个模块,而不能是其他类型的对象。对于已经编译好的二进制库,如果要用来被当作是依赖对象,那么应当将这些已经编译好的库作为单独的模块。对于这些已经编译好的库使用 BUILD_PREBUILT 或 BUILD_MULTI_PREBUILT。例如:当编译某个 Java 库需要依赖一些 Jar 包时,并不能直接指定 Jar 包的路径作为依赖,而必须首先将这些 Jar 包定义为一个模块,然后在编译 Java 库的时候通过模块的名称来依赖这些 Jar 包。
下面,我们就来讲解 Android.mk 文件的编写:
Android.mk 文件通常以以下两行代码作为开头:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
这两行代码的作用是:
- 设置当前模块的编译路径为当前文件夹路径。
- 清理(可能由其他模块设置过的)编译环境中用到的变量。
为了方便模块的编译,Build 系统设置了很多的编译环境变量。要编译一个模块,只要在编译之前根据需要设置这些变量然后执行编译即可。它们包括:
- LOCAL_SRC_FILES:当前模块包含的所有源代码文件。
- LOCAL_MODULE:当前模块的名称,这个名称应当是唯一的,模块间的依赖关系就是通过这个名称来引用的。
- LOCAL_C_INCLUDES:C 或 C++ 语言需要的头文件的路径。
- LOCAL_STATIC_LIBRARIES:当前模块在静态链接时需要的库的名称。
- LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库的名称。
- LOCAL_CFLAGS:提供给 C/C++ 编译器的额外编译参数。
- LOCAL_JAVA_LIBRARIES:当前模块依赖的 Java 共享库。
- LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的 Java 静态库。
- LOCAL_PACKAGE_NAME:当前 APK 应用的名称。
- LOCAL_CERTIFICATE:签署当前应用的证书名称。
- LOCAL_MODULE_TAGS:当前模块所包含的标签,一个模块可以包含多个标签。标签的值可能是 debug, eng, user,development 或者 optional。其中,optional 是默认标签。标签是提供给编译类型使用的。
0 0
- android编译系统学习
- android编译系统学习 .
- android 编译学习
- android编译系统学习总结
- OpenSceneGraph Android 开发学习 - 编译
- android 学习笔记三(android 源码编译)
- android学习笔记---android项目编译过程
- Android再学习-->Android编译系统
- Android学习笔记之编译系统(一)编译框架一
- Android学习笔记之编译系统(二)编译框架二
- Android学习笔记之编译系统(五)apk编译流程
- Android学习札记之编译系统(五)apk编译流程
- 交叉编译环境学习(编译Android上的可执行程序)
- Android 编译系统(二):envsetup.sh学习
- Android学习笔记之cyanogenmod编译篇
- Android 编译系统(二):envsetup.sh学习
- android ffmpeg 编译加实例学习总结
- 学习android编译的好地方!!
- LeetCode--Search Insert Position
- iOS模拟器中导入视频,获取相册视频,视频缩略图
- STS设置utf-8
- Java多线程
- u-boot-2009.08在mini2440上的移植(四)---增加DM9000驱动和命令自动补全功能 ——调试心得
- android 编译学习
- C# GMarkerGoogle 报错,找不到
- LR--系统瓶颈分析
- linux命令后台运行
- Java中的方法
- Java 8的default方法详解
- C++ Primer复习和学习笔记 第十一章 泛型算法
- 使用jsoup解析HTML之jsoup和HTML DOM简介
- APB_Timer模块DUT&Testbench实践