Android 底层开发概述(四)

1. Android源码目录介绍

bionic/		    C库
build/		    编译系统规则基础开发包配置
cts/		    兼容性测试
dalvik/		    java虚拟机
external/	    Android引入的第三方模块
frameworks/	    Android核心框架
hardware/	    硬件适配层(HAL)
system/		    底层文件系统库,应用和组件
device/		    产品目标目录
out/		    目标文件目录
packages/app	Android原生的app
sdk/ndk		    Android原生sdk

2. Android开发环境搭建

2.1 安装Ubuntu

2.2 配置开发环境

sudo apt-get install git-core gnupg flex bison gperf zip
sudo apt-get install curl libc6-dev-i386 lib32ncurses5-dev
sudo apt-get install lib32readline-gplv2-dev lib32z-dev

2.3 下载jdk到Ubuntu并安装,配置环境变量,打开.bashrc文件,添加如下内容

export JAVA_HOME=jdk目录
export PATH=$JAVA_HOME/bin:$PATH
export classPath=$JAVA_HOME

3. Android开机模式

Android设备的两种开机模式:在uboot阶段会进行判断(比如是否有组合键按下)是否进入recovery模式。

recovery升级模式:挂起system分区,启动recovery分区上的内核和文件系统;差量包升级,将差量包与system分区进行对比,将不同的内容新增(写操作)到system分区上;全包升级,将整个包覆盖(写操作)到system分区。

正常开机模式:启动system分区上的内核和文件系统。

 

4. Android.mk 解析

以下是一个简洁版的Android.mk文件,以它为例进行分析

LOCAL_PATH:=$(call my-dir)        获取当前模块的相对路径(调用my-dir函数),此时MAKEFILE_LIST变量被设置为当前Android.mk所在路径
include $(CLEAR_VARS)             清空当前环境变量,此时MAKEFILE_LIST变量被设置为build/core/路径
LOCAL_MODULE:=test                编译生成的模块名称
LOCAL_SRC_FILES:test.c xxx.c      编译该模块需要的所有源文件
include $(BUILD_EXECUTABLE)       编译所生成的目标文件格式 

4.1 Android编译相关的规则、配置大多在build/ 路径下,通过在build/下搜索my-dir可知,该函数定义在build/core/definitions.mk中

###########################################################
## Retrieve the directory of the current makefile
###########################################################
# Figure out where we are.
define my-dir
$(strip \
  $(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \
  $(if $(filter $(CLEAR_VARS),$(LOCAL_MODULE_MAKEFILE)), \
    $(error LOCAL_PATH must be set before including $$(CLEAR_VARS)) \
   , \
    $(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \
   ) \
 )
endef

my-dir函数的功能就是从MAKEFILE_LIST中取出并执行最后一个makefile,取出该makefile中所有符合CLEAR_VARS模式的单词,如果有符合的就打印错误,否则返回当前makefile所在的路径。

4.2 通过在build/下搜索CLEAR_VARS可知,可知该变量定义在build/core/config.mk中

CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
build/目录下搜索BUILD_SYSTEM可知其定义在build/core/main.mk文件中
BUILD_SYSTEM := $(TOPDIR)build/core

所以CLEAR_VARS:=build/core/clear_vars.mk,这个是makefile中规则模板使用的所有变量,全部置空,只保留了最后一个变量MAKEFILE_LIST := $(lastword $(MAKEFILE_LIST))即clear_vars.mk文件,所以这个脚本不能放到LOCAL_PATH的前面,否则得到的就是build/core/路径,而不是当前模块所处的路径。

【注:】保留最后一个MAKEFILE_LIST变量是为了$(call my-dir)时就不需要每次迭代数千个条目,同时确保不会丢失当前makefile文件中任何我们期望得到的内容。

 

你可能感兴趣的:(Android,android)