Android编译过程及脚本分析:
1:. build/envsetup.sh 分析;
2:lunch做了什么,如何增加和删除lunch;
3:Android编译命令使用;
Android编译过程:
初始化参数设置
检查环境变量与目标环境
选择lunch并读取目标配置和平台信息
清空输出目录
编译
生成升级包
. build/envsetup.sh 分析;
加载编译命令
加载平台信息
Android.mk的编写
分析一个最简单的Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= test
LOCAL_SRC_FILES := test.c
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)
定义了当前模块的相对路径
include $(CLEAR_VARS)
清空当前环境变量
LOCAL_MODULE:= test
编译生成的目标名称
LOCAL_SRC_FILES := test.c
编译该模块需要的源文件
include $(BUILD_EXECUTABLE)
编译所生成的目标文件格式
将工程下的所有源码文件添加到变量中
1:将每个文件添加到Android.mk
中
2:使用系统提供的函数处理
项目中引用系统的库:
LOCAL_SHARED_LIBRARIES += libxxxx:
将系统库文件名添加到Android.mk
中
引入第三方库文件:
LOCAL_LDFLAGS := -L/Path -lxxx
引入第三方头文件:
LOCAL_C_INCLUDES:= path
编译生成apk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := LocalPackage
include $(BUILD_PACKAGE)
BUILD_PACKAGE
:编译生成apk
LOCAL_PACKAGE_NAME
:编译生成apk名字
编译生成jar包:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := com.test.myjar
include $(BUILD_STATIC_JAVA_LIBRARY)
include $(BUILD_JAVA_LIBRARY)
include $(BUILD_STATIC_JAVA_LIBRARY)
:编译成静态jar包
include $(BUILD_JAVA_LIBRARY)
:编译生成共享jar包
jar包分类:
静态jar包:include $(BUILD_STATIC_JAVA_LIBRARY)
使用.class
文件打包而成的JAR
文件,可以在任何java
虚拟机运行
动态jar
包:include $(BUILD_JAVA_LIBRARY)
在静态jar
包基础之上使用.dex
打包而成的jar
文件,.dex
是android系统使用的文件格式。
APK依赖于jar包:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_JAVA_LIBRARIES := static-library
LOCAL_JAVA_LIBRARIES := share-library
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := LocalPackage
include $(BUILD_PACKAGE)
LOCAL_STATIC_JAVA_LIBRARIES
:静态jar包
LOCAL_JAVA_LIBRARIES
:动态jar包
预编译jar包:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := com.test.share
LOCAL_SRC_FILES := com.test.static
include $(BUILD_PREBUILT)
BUILD_PREBUILT
:预编译
LOCAL_MODULE_CLASS
:指定编译生成文件类型
预编译生成文件类型:
LOCAL_MODULE_CLASS
:编译文件类型
JAVA_LIBRARIES:dex
归档文件
APPS
:APK文件
SHARED_LIBRARIES
:动态库文件
EXECUTABLES
:二进制文件
ETC
:其他文件格式
Android.mk添加判断语句:
ifeq($(VALUE), x) #ifneq
do_yes
else
do_no
endif
ifeq/ifneq
:根据判断条件执行相关编译
Android启动过程分析主要内容
Android 启动模式
recovery
升级模式:启动recovery
模式,内核和文件系统
正常启动模式:引导内核和启动Android系统
Android init进程
init进程源码位置:system/core/init/init.c
init系统中位置:/init
Android 启动脚本
init进程:
开机界面分析:
Android bootanim 启动分析
1:init.rc脚本中,bootanim是disable的
2:启动界面依赖于android系统的surface管理服务,显示必须初始化完成
3:surfaceflinger服务完成后,才能显示开机界面
4:当system_server启动系统HomeUI的时候关闭bootanim
bootanimation.zip格式:
1:文件位置:/system/media/
2:文件:part0,part1,desc.txt
3:图片文件:part0,part1
4:显示配置:desc.txt:
384 320 20:分辨率,宽384,高320, 帧率20P/s
p 1 0 part1:p 后的第一个数字:1:显示1次,0:循环播放
p 后的第二个数字:休眠一定时间显示下一帧
part1:显示图片的文件名
制作bootanimation.zip:
1:替换显示图片
2:修改desc.txt配置
3:压缩:压缩格式为存储的zip包
Android SystemServer分析
Android ServiceManager分析
1:服务进程,是android系统中的核心服务之一
2:系统服务管理:管理系统和应用向系统添加的服务
3:查询获取服务管理:响应client请求并返回相应的服务
ServiceManager:
1:根据init脚本定义:如果该服务连续几次异常退出,系统会重启。
2:如果该服务重启,那么他将会重启media,zygote,surfaceflinger等服务。
3:系统中的服务或者应用调用其它服务必须使用serviceManager提供的机制。
Android ServiceManager启动过程:
Android ServiceManager管理服务:
packageMangerService服务分析
packageMangerService作用:
1:管理系统的jar包和apk,负责系统权限;
2:负责程序的安装,卸载,更新,解析;
packageMangerService启动过程:
1:和installd进行连接,进行安装卸载操作
2:创建PackageHandler线程,处理外部安装卸载请求
3:处理系统权限相关的文件/system/etc/permission/*.xml
4:扫描安装jar包和APK,并得到安装包的信息
packageMangerService权限管理:
packageMangerService安装Jar包和APK:
Android Sensor简介
Android Sensor框架:
Android SensorManger:
1:初始化并连接SensorServer
2:对应用层提供接口,获取sensor类型和sensor数据
3:处理sensor传感器数据,转化成android可以识别的数据格式
Android SensorService:
1:根据平台动态加载hal层的库,初始化hal层
2:抓取底层数据根据需要向上转发sensor数据
Android SensorHal:
1:封装底层接口,对上提供统一接口;
2:打开sensor设备,提供相关操作接口;
Android SensorManager分析
Android SensorManager注册:
Android SensorManager框架图:
Android SensorManager:
Android Sensor流程:
1:APP 注册服务(powmanager,sensormanager…)
2:得到sensormanager,注册listener
3:创建消息队列,通过JNI 和SensorServer建立连接
4:接收数据,通过listener回调得到数据
Android SensorService分析
Android SensorService初始化:
1:SystemServer初始化的时候,初始化SensorService;
2:SensorService创建SensorDevice对象,SensorDevice是hal层的操作函数集;
3:SensorDevice会得到系统支持sensor的个数及Sensor操作接口;
4:SensorServer将系统支持的sensor添加sensorlist中;
5:根据系统反馈创建虚拟sensor;
6:等待连接,启动线程分发数据;
Android SensorService框架图:
Android SensorService结构:
SensorService 初始化过程:
Android SensorServer导入hal层库流程:
1:根据系统Prop设置值,在/system/lib/hw找到要加载的库
2:使用dlopen动态库文件
3:使用dlsym得到并返回sensor的操作函数集
Android framework和Hal层关系:
Android 寻找动态库和得到操作句柄的过程:
1:获取系统prop,查找对应的库 /Path/sensors.prop.so
2:dlopen打开库文件,使用dlsym获取HMI的hw_module_t句柄
3:HMI是一个字符串,对应动态库中的一个符号,动态库是一个ELF文件格式;
4:ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况;
包括指令,数据,符号表,重定位信息等等
5:使用readelf -s sensors.default.so 可以查看动态库符号信息,找到HMI符号
Android sensorHal层具体操作:
Android Sensor数据流:
Android input子系统框架图:
Android input主要模块:
1:WindowManagerService:管理窗口,收集input事件和分发input事件;
2:InputManager:接收和分发输入事件;
3:EventHub:打开所有的输入设备,输入事件映射;
4:InputReader:InputReader收集到input事件并进行判断处理;
5:InputDispatcher:事件过滤(home,Volume+/-, Power),将事件发送给上层;
6:其他模块例如上层事件分发,输入法等;
Android inputManager 对象关系图:
Android EventHub分析:
1:监听/dev/input目录(包括热插拔设备:蓝牙键鼠等)
2:扫描并打开/dev/input下的输入设备
3:根据配置文件和键值映射文件对设备进行配置和键值映射
4:将所有设备添加到本地列表中
5:捕获输入事件,并根据相应设备类型进行处理
Android EventHub和InputReader处理不同输入设备:
1:得到设备输入类型:按键,手柄,触摸(单点,多点);
2:根据设备类型和prop做键值布局(.kl)和映射(.kcm);
3:将设备添加到InputReader对象中;
4:根据设备类型添加不同mapper;
5:InputReader做一次按键收集, EventHub获取一次底层键值,并对键值进行处理;
6:将收集到的键值发送给监听对象
Android inputEvent数据流程图:
Android Input事件获取
struct input_event:
getevent分析:
1:监控/dev/input目录
2:打开设备,并且轮训设备
3:读取设备事件,并打印