Android 编译系统

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) 顶层模型
主要分为四个阶段,如下图:

Created with Raphaël 2.2.0 开始 初始化构建环境 构建依赖关系树 执行编译流程 打包 结束

典型makefile 文件的解析步骤主要为三步:

  • 变量赋值、环境检测等初始化操作
  • 按照规则生成所有依赖树
  • 根据用户(通过传递编译参数)选择的依赖树,从叶到根逐步生成目标文件,即执行编译
    以上三步宏观上与前三个阶段是相互对应的,而对于整个系统而言,编译的目标最终会按照所属的架构范畴,打包到指定的镜像中,比如system.img, vendor.img等,即最后完成打包的动作。

(2) build/core/Main.mk

# This is the default target. It must be the first declared target.
.PHONY: droid
DEFAULT_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.c
LOCAL_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.c
LOCAL_SRC_FILES := add.c
#定义本库为编译为动态库
include $(BUILD_SHARED_LIBRARY)

(4) 可执行文件编译

假设需要编译生成可执行文件arithmetic,其中libAdd.so与libSub.so做为两个动态库引入,libMul.a与libDiv.a做为两个静态库引入.

# load shared library
include $(CLEAR_VARS)
LOCAL_MODULE    := Add
LOCAL_SRC_FILES := libAdd.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := Sub
LOCAL_SRC_FILES := libSub.so
include $(PREBUILT_SHARED_LIBRARY)

# load static library
include $(CLEAR_VARS)
LOCAL_MODULE    := Mul
LOCAL_SRC_FILES := libMul.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := Div
LOCAL_SRC_FILES := libDiv.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := arithmetic
LOCAL_SRC_FILES := arithmetic.c

LOCAL_SHARED_LIBRARIES := Add Sub
LOCAL_STATIC_LIBRARIES := Mul Div

3. make file 语法介绍

详细见:
跟我一起写makefile:
https://blog.csdn.net/xiaoshuai537/article/details/79340153

你可能感兴趣的:(Andorid)