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: 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

更多相关文章

  1. android广播动态注册与发送流程分析
  2. FFmpeg交叉编译
  3. Android静态代码分析
  4. Android(安卓)Manifest merger failed :tools:replace="android:n
  5. Android编译过程详解(二)
  6. android 编译
  7. Android(安卓)Framework中添加AIDL文件编译
  8. Android编译过程详解(一)
  9. Android编译过程详解(三)

随机推荐

  1. Android(安卓)JNI实例
  2. Android(安卓)9.0 电源管理之省电模式
  3. 解决下载Android4.0源码时遇到的问题
  4. Android(安卓)项目上线流程总结
  5. android 模块之桌面闹钟
  6. android 安全讲座第二层 使用AndBug调试A
  7. 详解如何将android工具链作为独立编译器
  8. Android(安卓)内置浏览器
  9. 在Android(安卓)Studio 中加入jar 和.so
  10. 【Android】学习笔记(4)――基本控件之Pr