Android(安卓)底层开发概述(四)
1. Android源码目录介绍
bionic/ C库build/ 编译系统规则基础开发包配置cts/ 兼容性测试dalvik/ java虚拟机external/ Android引入的第三方模块frameworks/ Android核心框架hardware/ 硬件适配层(HAL)system/ 底层文件系统库,应用和组件device/ 产品目标目录out/ 目标文件目录packages/appAndroid原生的appsdk/ndk Android原生sdk
2. Android开发环境搭建
2.1 安装Ubuntu
2.2 配置开发环境
sudo apt-get install git-core gnupg flex bison gperf zipsudo apt-get install curl libc6-dev-i386 lib32ncurses5-devsudo apt-get install lib32readline-gplv2-dev lib32z-dev
2.3 下载jdk到Ubuntu并安装,配置环境变量,打开.bashrc文件,添加如下内容
export JAVA_HOME=jdk目录export PATH=$JAVA_HOME/bin:$PATHexport 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.mkbuild/目录下搜索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文件中任何我们期望得到的内容。
更多相关文章
- 1. Android(安卓)环境搭建
- 关于android avd目录的设置
- android内部外部存储卡路径的获取
- 设置Android(安卓)SDK tools工作路径环境变量
- Android根据文件路径使用File类获取文件相关信息
- android keytool 不是内部命令或外部命令在 (win7下不能用的解决
- katalon设置Android(安卓)SDK路径
- Android根据文件路径使用File类获取文件相关信息
- 《Android开发从零开始》——1.Android开发环境的搭建