config.mk可以说是android编译系统中关于配置环境的一个总的makefile,定义了编译环境的方方面面。执行完config.mk就完成了android编译系统的所有准备工作,即准备好了所有的编译需要的全局变量,下一步直接执行make,即可产生镜像文件。

首先,定义了一些变量和目录,

# Only use ANDROID_BUILD_SHELL to wrap around bash.

# DO NOT use other shells such as zsh.

ifdef ANDROID_BUILD_SHELL

SHELL := $(ANDROID_BUILD_SHELL)

else

# Use bash, not whatever shell somebody has installed as /bin/sh

# This is repeated from main.mk, since envsetup.sh runs this file

# directly.

SHELL := /bin/bash

endif

# Utility variables.

empty :=

space := $(empty) $(empty)

comma := ,

# Note that make will eat the newline just before endef.

define newline

endef

# Unfortunately you can't simply define backslash as \ or \\.

backslash := \a

backslash := $(patsubst %a,%,$(backslash))

# Tell python not to spam the source tree with .pyc files. This

# only has an effect on python 2.6 and above.

export PYTHONDONTWRITEBYTECODE := 1

# Standard source directories.

SRC_DOCS:= $(TOPDIR)docs

# TODO: Enforce some kind of layering; only add include paths

# when a module links against a particular library.

# TODO: See if we can remove most of these from the global list.

SRC_HEADERS := \

$(TOPDIR)system/core/include \

$(TOPDIR)system/media/audio/include \

$(TOPDIR)hardware/libhardware/include \

$(TOPDIR)hardware/libhardware_legacy/include \

$(TOPDIR)hardware/ril/include \

$(TOPDIR)libnativehelper/include \

$(TOPDIR)frameworks/native/include \

$(TOPDIR)frameworks/native/opengl/include \

$(TOPDIR)frameworks/av/include \

$(TOPDIR)frameworks/base/include

SRC_HOST_HEADERS:=$(TOPDIR)tools/include

SRC_LIBRARIES:= $(TOPDIR)libs

SRC_SERVERS:= $(TOPDIR)servers

SRC_TARGET_DIR := $(TOPDIR)build/target

SRC_API_DIR := $(TOPDIR)prebuilts/sdk/api

SRC_SYSTEM_API_DIR := $(TOPDIR)prebuilts/sdk/system-api

# Some specific paths to tools

SRC_DROIDDOC_DIR := $(TOPDIR)build/tools/droiddoc

然后调用pathmap.mk,包含一些hard code的路径,

# Various mappings to avoid hard-coding paths all over the place

include $(BUILD_SYSTEM)/pathmap.mk

下面的这些变量在我们写Android.mk时经常会用到,一般都是通过include调用,其实都是一些makefile文件,

# ###############################################################

# Build system internal files

# ###############################################################

BUILD_COMBOS:= $(BUILD_SYSTEM)/combo

CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk

BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk

BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk

BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk

BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk

BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk

BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk

BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk

BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk

BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk

BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk

BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk

BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk

BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk

BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk

BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk

BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk

BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk

BUILD_NATIVE_BENCHMARK := $(BUILD_SYSTEM)/native_benchmark.mk

BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk

BUILD_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/shared_test_lib.mk

BUILD_HOST_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/host_shared_test_lib.mk

BUILD_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/static_test_lib.mk

BUILD_HOST_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/host_static_test_lib.mk

BUILD_NOTICE_FILE := $(BUILD_SYSTEM)/notice_files.mk

BUILD_HOST_DALVIK_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_java_library.mk

BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_static_java_library.mk

如果make的目标中包含showcommands,则会打印完整的命令。

# The 'showcommands' goal says to show the full command

# lines being executed, instead of a short message about

# the kind of operation being done.

SHOW_COMMANDS:= $(filter showcommands,$(MAKECMDGOALS))

定义了一些全局变量,cflags,常用文件后缀等,

# ###############################################################

# Set common values

# ###############################################################

# These can be changed to modify both host and device modules.

COMMON_GLOBAL_CFLAGS:= -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith

COMMON_RELEASE_CFLAGS:= -DNDEBUG -UDEBUG

COMMON_GLOBAL_CPPFLAGS:= $(COMMON_GLOBAL_CFLAGS) -Wsign-promo -std=gnu++11

COMMON_RELEASE_CPPFLAGS:= $(COMMON_RELEASE_CFLAGS)

GLOBAL_CFLAGS_NO_OVERRIDE := \

-Werror=int-to-pointer-cast \

-Werror=pointer-to-int-cast \

GLOBAL_CPPFLAGS_NO_OVERRIDE :=

# Set the extensions used for various packages

COMMON_PACKAGE_SUFFIX := .zip

COMMON_JAVA_PACKAGE_SUFFIX := .jar

COMMON_ANDROID_PACKAGE_SUFFIX := .apk

# list of flags to turn specific warnings in to errors

TARGET_ERROR_FLAGS := -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point

ifdef TMPDIR

JAVA_TMPDIR_ARG := -Djava.io.tmpdir=$(TMPDIR)

else

JAVA_TMPDIR_ARG :=

endif

buildspec.mk还没研究咋用,-include可以看出不是强制必须存在的,

# ---------------------------------------------------------------

# Try to include buildspec.mk, which will try to set stuff up.

# If this file doesn't exist, the environment variables will

# be used, and if that doesn't work, then the default is an

# arm build

ifndef ANDROID_BUILDSPEC

ANDROID_BUILDSPEC := $(TOPDIR)buildspec.mk

endif

-include $(ANDROID_BUILDSPEC)

include了envsetup.mk,前面已经介绍,设置了很多编译相关的变量。

# ---------------------------------------------------------------

# Define most of the global variables. These are the ones that

# are specific to the user's build configuration.

include $(BUILD_SYSTEM)/envsetup.mk

在调用findleaves.py时设置的选项,

# Pruned directory options used when using findleaves.py

# See envsetup.mk for a description of SCAN_EXCLUDE_DIRS

FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .repo .git)

由于config.mk太长,后面不一一列出来了,找重点的分析,中间主要都是些host和target 编译链相关的变量,还有一些编译需要用的应用程序,例如aapt,aidl等等。

其中调用select.mk主要是为了设置host和target编译链相关的变量。

#下面调用select.mk设置host端,即编译机的编译链,gcc ar等

combo_target := HOST_

combo_2nd_arch_prefix :=

include $(BUILD_SYSTEM)/combo/select.mk

# Load the 2nd host arch if it's needed.

ifdef HOST_2ND_ARCH

combo_target := HOST_

# 2ND_

combo_2nd_arch_prefix := $(HOST_2ND_ARCH_VAR_PREFIX)

include $(BUILD_SYSTEM)/combo/select.mk

endif

# on windows, the tools have .exe at the end, and we depend on the

# host config stuff being done first

# 下面调用select.mk设置target端,即目标机的编译链,gcc ar等

combo_target := TARGET_

combo_2nd_arch_prefix :=

include $(BUILD_SYSTEM)/combo/select.mk

# Load the 2nd target arch if it's needed.

ifdef TARGET_2ND_ARCH

combo_target := TARGET_

combo_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)

include $(BUILD_SYSTEM)/combo/select.mk

endif

然后include了ccache,为了加快再次编译速度,关于ccache后续再研究。

include $(BUILD_SYSTEM)/ccache.mk

接着include了javac.mk,用来设置java编译器,

include $(BUILD_SYSTEM)/combo/javac.mk

同时在android6.0以上默认使用jack进行编译,在javac.mk中,如果ANDROID_COMPILE_WITH_JACK默认没设置,就设置为true。

ifndef ANDROID_COMPILE_WITH_JACK

# Defines if compilation with jack is enabled by default.

ANDROID_COMPILE_WITH_JACK := true

endif

接着包含了clang相关的makefile,关于clang后续再研究。

include $(BUILD_SYSTEM)/clang/config.mk

注:Clang是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言。传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd)。在编译过程中,前端主要负责词法和语法分析,将源代码转化为抽象语法树;优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效;后端则是将已经优化的中间代码转化为针对各自平台的机器代码。Clang则是以LLVM为后端的一款高效易用,并且与IDE结合很好的编译前端。

最后include了dumpvar.mk,就是专为打印变量值的makefile,前面已经分析过。

include $(BUILD_SYSTEM)/dumpvar.mk

envsetup.sh中的一些函数,例如check_product,最终就是make config.mk,而make的目标为dumpvar-*。

android config.mk,android编译分析之10—config.mk相关推荐

  1. Android车载应用开发与分析(10)- 车载空调系统(HVAC)

    1. HVAC 功能介绍 HVAC 全称:供暖通风与空气调节(Heating Ventilation and Air Conditioning).用户可以通过他来控制整个汽车的空调系统,是汽车中非常重 ...

  2. android逆向分析so,Android逆向——so反编译分析由浅入深(回帖奖励)

    如果可以,请自己编写so文件库,然后进行反编译自行学习.这样的进步是最快的. 这篇分析仅此一份,心血付出. 0x00 前言 说明 1.之前学习Android逆向的时候跑的太快,很多东西没有咀嚼直接吞咽 ...

  3. android.mk 冒号,android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)

    本文不作为ndk初学使用,只是对cpp等c++文件编译成so文件的过程中,参数含义,及ndk配置的解释.使用的技术比较旧. androidStudio使用gradle调用ndk-build工具编译c+ ...

  4. 【视频教程】老罗分享Android源代码下载和编译及如何分析源代码

    小编语:老罗(罗升阳)的Android之旅,在国内是让不少人收益,也给了我非常大的启示,老罗最近自己折腾了一个网站叫<进击的程序员>,域名:http://0xcc0xcd.com/,继续他 ...

  5. android.mk 优化编译,android下ndk编译c优化

    android开发中,有时候需要控制包的大小,这样就会要求对代码进行优化, 下面这个文章不错.大家可参考 原文链接 https://blog.algolia.com/android-ndk-how-t ...

  6. [Android 13]开机动画原理分析

    Android开机动画 hongxi.zhu 2023-6-12 Lineageos_20(Android T) on Pixel 2XL 目录 Android开机动画 一. 开机动画的启动 1.1 ...

  7. Qlcomm Android 开发环境,编译

    1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流 ...

  8. 【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★

    文章目录 一.Android 进程注入工具开发系列博客 二.Android 进程注入工具 源码下载编译 三.逆向环境搭建 四.使用注入工具进行逆向操作 1.获取远程进程号 2.注入工具准备 3.注入动 ...

  9. Android提权漏洞CVE-2014-7920CVE-2014-7921分析

    作者:没羽@阿里移动安全,更多技术干货,请访问阿里聚安全博客 这是Android mediaserver的提权漏洞,利用CVE-2014-7920和CVE-2014-7921实现提权,从0权限提到me ...

最新文章

  1. TaintDroid介绍
  2. mysql 时间点_MySQL 基于时间点与位置恢复
  3. lvs为何不能完全替代DNS轮询--转
  4. centos7安装mysql8.0简书_CentOS7安装MySQL8.0图文教程
  5. from torch._C import * ImportError: DLL load failed解决方法
  6. mysql check table_修复MySQL的MyISAM表命令check table用法
  7. wildfly管理控制台_WildFly管理控制台已更新–请求反馈
  8. 电脑安装系统多少钱_电脑系统安装教学
  9. anylogic中如何构建复杂网络_如何对复杂网络建模所需要的数据进行预处理
  10. DockOne微信分享(七十七):用Harbor实现容器镜像仓库的管理和运维
  11. matplotlib官方文档pdf_Matplotlib知识
  12. vs中四点画矩形的算法_实战基于图割算法的木材表面缺陷图像分析
  13. C语言代码自动生成工具
  14. 命运2服务器维修,命运2服务器
  15. 05Nginx动静分离、 URLRewrite
  16. Qt 语言切换 QTranslator cmake qmake
  17. maya导入abc动画_大佬养成宝典:教你四十二招玩转MAYA(三)
  18. 9针串口的RS232、RS485、RS422引脚定义
  19. 爆炒猪肚的做法 爆炒猪肚怎样炒才脆
  20. python 解析excel模板_python 解析Excel

热门文章

  1. asp 取数据 计算_ASP.NET Core 简介
  2. 「协方差」与「相关系数」的概念
  3. 微软新浏览器_要超越Chrome?微软新发布的这款浏览器,有翻天覆地的变化!
  4. 【各种信噪比联系与区别详解】实信号、复信号Es、N0、符号信噪比EsN0、带内信噪比、比特信噪比EbN0、SNR的含义及关系详解
  5. 高斯白噪声下基于EM的多径时延估计
  6. java简单文本编译器_java -简易文本编辑器
  7. Java开发笔记(二十三)数组工具Arrays
  8. EL表达式的11隐含对象
  9. 使用RichTextBox控件实现系统剪切板功能
  10. 搭建struts2框架