Android FrameWork-索引

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:读取设备事件,并打印

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/80963322