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. Android静态代码分析
  3. LibGDX制作android动态壁纸
  4. Android 动态加载(三) - 类的加载流程源码分析
  5. Android 动态加载(二) - 基础篇(二)
  6. [android]android自动化测试七之动态AVD硬件参数
  7. cocos2dx打包Android出现“未指定Android目标平台版本”问题
  8. Android 动态加载(六) - 360开源框架DroidPlugin的使用介绍
  9. android动态墙纸有关问题

随机推荐

  1. Android 开发技术周报 Issue#275
  2. android - open failed: EROFS (Read-onl
  3. Android RoboGuice 使用指南(15):Inject
  4. android开发 零碎知识
  5. 开源项目之Android GreenDroid(界面库)
  6. Android之记住密码与自动登陆实现
  7. Android LCD(一):LCD基本原理篇
  8. android > 布局尺寸
  9. 配置android开发环境eclipse获取ADT获取
  10. Android 在Service开启对话框的方法