Android 底层开发概述
Posted 四季帆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 底层开发概述的主要内容,如果未能解决你的问题,请参考以下文章