Android 编译系统
16lz
2021-01-23
Android 系统编译
- 1. Android 编译系统
- (1) Android 编译系统设计原则
- (2) Android 顶层编译架构分析
- 2. Android.mk编写
- (1)静态库、动态库、可执行文件的释义
- (2) 静态库编译
- (3) 动态库编译
- (4) 可执行文件编译
- 3. make file 语法介绍
1. Android 编译系统
Android 编译采用GNU make.
(1) Android 编译系统设计原则
Android 编译系统在多次迭代演进中,主要坚持的设计原则如下:
- 同一套代码支持编译出不同的构建目标。
既支持运行与Android 设备端的软件包,也支持编译Host平台上的各种工具,如模拟器、辅助工具等。 - 采用唯一的 Makefile 来组织所有的自动化编译。
- 支持对项目中任意模块进行单独的编译验证。
- 编译中间文件以及最终编译结果 与 源代码在存储目录上隔离
(2) Android 顶层编译架构分析
(1) 顶层模型
主要分为四个阶段,如下图:
典型makefile 文件的解析步骤主要为三步:
- 变量赋值、环境检测等初始化操作
- 按照规则生成所有依赖树
- 根据用户(通过传递编译参数)选择的依赖树,从叶到根逐步生成目标文件,即执行编译
以上三步宏观上与前三个阶段是相互对应的,而对于整个系统而言,编译的目标最终会按照所属的架构范畴,打包到指定的镜像中,比如system.img, vendor.img等,即最后完成打包的动作。
(2) build/core/Main.mk
# This is the default target. It must be the first declared target..PHONY: droidDEFAULT_GOAL := droid....droid: droidcore dist_files ....
如代码所示,Android 系统编译对应的根节点为droid,为默认的伪目标,也是第一个目标。
droid依赖于droidcore 和 dist_files,其中droidcore 主要完成多个镜像编译,包括system、boot、recovery、userdata、cache、vendor。
2. Android.mk编写
官方参考链接:http://android.mk/
(1)静态库、动态库、可执行文件的释义
程序一般需经代码编译、链接、加载和运行几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;
- 静态库:如果在链接时,链接器将从库文件取得所需的(中间)代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。
include $(BUILD_STATIC_LIBRARY) - 动态库:如果在链接时,链接器仅仅是在可执行文件中打上标志,说明需要使用哪些动态连接库;当运行程序时,加载器根据这些标志把所需的动态链接库加载到内存。
include $(BUILD_SHARED_LIBRARY) - 可执行文件:可以被运行的目标文件。
include $(BUILD_EXECUTABLE);
(2) 静态库编译
假设有文件mul.c,实现了乘法操作函数,需要生成静态库libMul.a。
添加 Android.mk 如下:
#获取当前路径LOCAL_PATH := $(call my-dir)#清除本mk调用前的已经设置的编译参数,LOCAL_PATH除外include $(CLEAR_VARS)#指明编译的目标名称LOCAL_MODULE := Mul#指明编译依赖的源文件mul.cLOCAL_SRC_FILES := mul.c#定义本库为编译为静态库include $(BUILD_STATIC_LIBRARY)
(3) 动态库编译
假设有文件add.c,实现了加操作函数,需要生成动态库libMul.so。
#获取当前路径LOCAL_PATH := $(call my-dir)#清除本mk调用前的已经设置的编译参数,LOCAL_PATH除外include $(CLEAR_VARS)#指明编译的目标名称LOCAL_MODULE := Add#指明编译依赖的源文件为add.cLOCAL_SRC_FILES := add.c#定义本库为编译为动态库include $(BUILD_SHARED_LIBRARY)
(4) 可执行文件编译
假设需要编译生成可执行文件arithmetic,其中libAdd.so与libSub.so做为两个动态库引入,libMul.a与libDiv.a做为两个静态库引入.
# load shared libraryinclude $(CLEAR_VARS)LOCAL_MODULE := AddLOCAL_SRC_FILES := libAdd.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := SubLOCAL_SRC_FILES := libSub.soinclude $(PREBUILT_SHARED_LIBRARY)# load static libraryinclude $(CLEAR_VARS)LOCAL_MODULE := MulLOCAL_SRC_FILES := libMul.ainclude $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := DivLOCAL_SRC_FILES := libDiv.ainclude $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := arithmeticLOCAL_SRC_FILES := arithmetic.cLOCAL_SHARED_LIBRARIES := Add SubLOCAL_STATIC_LIBRARIES := Mul Div
3. make file 语法介绍
详细见:
跟我一起写makefile:
https://blog.csdn.net/xiaoshuai537/article/details/79340153
更多相关文章
- android广播动态注册与发送流程分析
- Android静态代码分析
- LibGDX制作android动态壁纸
- Android 动态加载(三) - 类的加载流程源码分析
- Android 动态加载(二) - 基础篇(二)
- [android]android自动化测试七之动态AVD硬件参数
- cocos2dx打包Android出现“未指定Android目标平台版本”问题
- Android 动态加载(六) - 360开源框架DroidPlugin的使用介绍
- android动态墙纸有关问题