Android基础知识学习

一.Android编译过程

  • 初始化参数设置
  • 检查环境变量与目标环境
  • 选择lunch并读取目标配置和平台信息
  • 清空输出目录
  • 编译
  • 生成升级包

二. ./build/envsetup.sh分析

  • 加载编译命令:source ./build/envsetup.sh
  • 加载平台信息:lunch平台信息;export查看环境变量

三.Android.mk

  • native层(可执行文件、动态库、静态库);Java层(Jar包、Apk);组成android编译基本语法规则
Android.mk简例

LOCAL_PATH := $(call my-dir)  #LOCAL_PATH定义在build/core/definitons.mk,定义当前模块相对路径
include $(CLEAR_VARS)  #CLEAR_VAR定义在build/core/cler_vars.mk,表示清空除loal_path外的环境变量
LOCAL_MODULE := test   #编译生成名称
LOCAL_SRC_FILES := test.c  #源文件
LOCAL_MODULE_PATH := $(LOCAL_PATH)  #指定输出路径
include $(BUILD_EXECUTABLE)  #生成格式,这里是编程生成二进制文件
  • Android.mk深度学习1:多源码文件编译、一个.mk中编译多个目标文件、编译动态库、编译静态库
Android.mk 简例:增加源文件__将每个文件添加到.mk中

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := test   
LOCAL_SRC_FILES := src/main.c \    #增加多源文件,将每个文件添加到.mk中
                   src/test1.c \
                   src/test2.c
  
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_EXECUTABLE)

Android.mk 简例:增加源文件__使用系统提供的函数处理

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := test   
LOCAL_C_ALL_FILES := $(call all-c-files-under)  #取所有.c文件
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_EXECUTABLE)

Android.mk 简例:一个mk文件编译多个目标文件

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := test   #目标文件test
LOCAL_C_ALL_FILES := $(call all-c-files-under)  #取所有.c文件
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)  
LOCAL_MODULE := test1   #目标文件test1
LOCAL_C_ALL_FILES := $(call all-c-files-under)  #取所有.c文件
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_EXECUTABLE)

Android.mk 简例:编译生成动态库

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := libtest  
LOCAL_C_ALL_FILES := src/test1.c \
                     src/test2.c
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_SHARED_LIBRARY)    #编译生成动态库

Android.mk 简例:编译生成静态库

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := libtest  
LOCAL_C_ALL_FILES := src/test1.c \
                     src/test2.c
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_STATIC_LIBRARY)    #编译生成静态库
  • Android.mk深度学习2:如何引入系统库、如何引入第三方库、如何引入静态库、如何进入头文件
Android.mk 简例:项目中引入系统库

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := test  
LOCAL_SRC_FILES := src/main.cpp
LOCAL_SHARED_LIBRARIES += liblog   #链入系统log库
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_EXECUTABLE)    

Android.mk 简例:加载第三方库

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := libtest  
LOCAL_SRC_FILES := src/test.cpp
LOCAL_MODULE_PATH := $(LOCAL_PATH)/lib 
include $(BUILD_SHARED_LIBRARY)  

include $(CLEAR_VARS)  
LOCAL_MODULE := test 
LOCAL_LDFLAGS :=-L./lib -ltest  #加载当前目录下的第三方库
LOCAL_SRC_FILES := src/main.cpp   #调用了test.cpp接口 
LOCAL_SHARED_LIBRARIES += liblog   
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_EXECUTABLE)  

Android.mk 简例:引入第三方头文件

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := libtest  
LOCAL_SRC_FILES := src/test.cpp
LOCAL_MODULE_PATH := $(LOCAL_PATH)/lib 
include $(BUILD_SHARED_LIBRARY)  

include $(CLEAR_VARS)  
LOCAL_MODULE := test 
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
LOCAL_LDFLAGS :=-L./lib -ltest  #加载当前目录下的第三方库
LOCAL_SRC_FILES := src/main.cpp   #调用了test.cpp接口 
LOCAL_SHARED_LIBRARIES += liblog   
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_EXECUTABLE) 

Android.mk 简例:引入静态库

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)  
LOCAL_MODULE := libtest  
LOCAL_SRC_FILES := src/test.cpp
LOCAL_MODULE_PATH := $(LOCAL_PATH)/lib 
include $(BUILD_SHARED_LIBRARY)  

include $(CLEAR_VARS)  
LOCAL_MODULE := test 
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
LOCAL_LDFLAGS := $(LOCAL_PATH)/lib/libtest1.a
LOCAL_SRC_FILES := src/main.cpp   #调用了test.cpp接口 
LOCAL_SHARED_LIBRARIES += liblog   
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin 
include $(BUILD_EXECUTABLE) 
  • Android.mk深度学习3:如何编译jar包、如何编译Apk、Apk中导入jar包和库文件、mk中如何加判断语句
Android.mk编译生成Apk

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS) 
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := libarity android-support-v4 guava
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := Calculator   #编译生成apk名字
include $(BUILD_PACKAGE)   #编译生成apk

Android.mk编译生成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)   #编译生成静态jar包
若是-》include $(BUILD_JAVA_LIBRARY)   #编译生成共享jar包

判断
ifeq/ifneq:根据判断条件执行相关编译

四.Android启动过程

五.Android启动模式

  • recovery升级模式:启动recovery分区内核和文件系统;
  • 正常启动模式:引导内核和启动Android系统;

六.init启动分析

  • Android init进程:init进程源码位置system/core/init/init.c,init系统中位置/init;

七.走进init启动脚本

八.Android启动脚本分析

九.Android脚本执行和进程守护

  • init进程处理消息事件:(1)根据shell或系统中消息设置系统Prop;(2)守护系统服务,如果服务退出,重启退出的服务;

十.Android服务介绍与davlink启动

十一.Zygote剖析与system_server启动

十二.Zygote创建APP分析

十三.Zygote_load系统资源分析及优化

    优化的实质:使我们的进程最大限度的抢占CPU,最新优化另有BLCR技术发展中。

十四.开机界面分析

 

十五.systemserver服务分析

十六.ServiceManager服务分析

  • serviceManager服务:(1)服务进程,是android系统中的核心服务之一;(2)系统服务管理:管理系统和应用向系统添加服务;(3)查询获取服务管理:响应client请求并返回响应的服务;
  • serviceManager:(1)根据init脚本定义:如果该服务连续几次异常退出,系统会重启;(2)如果该服务重启,那么它将会重启media,zygote,surfaceflinger等服务;(3)系统中的服务或者应用调用其他服务必须使用serviceManager提供的机制;

十七.packageManagerService服务分析

  • 作用:(1)管理系统的jar包和apk,负责系统权限;(2)负责程序的安装,卸载,更新,解析;(3)对于其他应用和服务提供安装卸载服务;

  • 启动过程:(1)和install进行连接,进行安装卸载操作;(2)创建PackageHandler线程,处理外部安装卸载;(3)处理系统权限相关的文件/system/etc/permission/*.xml;(4)扫描安装jar包和APK,并得到安装包信息;

十八.AndroidSensor简介

十九.AndroidSensor框架

  • SensorManager:(1)初始化并连接sensorservice;(2)对应用层提供接口,获取sensor类型和sensor数据;(3)处理sensor传感数据,转化成android可识别的数据格式;
  • Sensorservice:(1)获取平台动态加载的hal库,初始化hal层;(2)抓取底层数据根据需要向上转发sensor数据;
  • SensorHal:(1)封装底层接口,对上提供统一接口;(2)打开sensor设备,提供相关操作接口;

二十.SensorManager分析

  • android sensor流程:(1)app注册服务(powmanager,sensormanager,...);(2)得到sensormanage,注册listener;(3)创建消息队列,通过jni和sensorServer建立连接;(4)接受数据,通过listener回调得到数据;

二十一.SensorServer分析

  • 初始化:(1)SystemServer初始化的时候,初始化SensorServer;(2)SensorServer创建SensorDevice对象,SensorDevice是hal层的操作函数集;(3)SensorDevice会得到系统支持的sensor的个数及Sensor操作接口;(4)SensorServer将系统支持的sensor添加sensorlist中;(5)根据系统反馈创建虚拟sensor;(6)等待连接,启动线程分发数据;

二十二.SensorHal分析

  • android 寻找动态库和得到操作句柄的过程:(1)获取系统prop,查找对应的库/path/sensor.prop.so;(2)dlopen打开库文件,使用dlsym获取HMI的hw_module_t句柄;(3)HMI是一个字符串,对应动态库中的一个符号,动态库是一个ELF文件格式;(4)ELF头在文件的开始,保存了路线图,描述了该文件的组织情况,包括指令,数据,符号表,重定位信息等等;(5)使用readelf -s sensor.default.so可以查看动态库符号信息,找到HMI符号;

二十三.Android_input分析

  • input主要模块:(1)WindowManagerService管理窗口,收集input事件和分发input事件;(2)inputManger接收和分发输入事件;(3)EventHub打开所有的输入设备,输入事件映射;(4)inputReader收集到input事件并进行判断处理;(5)inputDispatcher事件过滤(home,volume+/-,power),将事件发送给上层;(6)其它模块例如上层事件分发,输入法等;

  • EventHub分析:(1)监听/dev/input目录;(2)扫描并打开/dev/input下的输入设备;(3)根据配置文件的键值映射文件对设备进行配置和键值映射;(4)将所有设备添加到本地列表中;(5)捕获输入输入事件,并根据相应设备类型进行处理;
  • EventHub和inputReader处理不同设备输入:(1)得到设备输入类型:按键、手柄、触摸(单点,多点);(2)根据设备类型和prop做键值布局(.kl)和映射(.kcm);(3)将设备添加到inputReader对象中;(4)根据设备类型,添加不同的mapper;(5)inputReader做一次按键收集,EventHub获取一次底层键值,并对键值进行处理;(6)将收集到的键值发送给监听对象;

二十四.Android_input事件获取

二十五.Android创建输入设备

二十六.Android浏览器简介

  • Android浏览器内核发展:(1)4.2以前版本:使用webkit作为浏览器内核;(2)4.4中版本:使用chomeium作为浏览器内核;

学习视频路径:https://www.bilibili.com/video/BV1mb411872F?from=search&seid=13706101650228050770

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页