安卓八股
八股
安卓四大组件
Activity
负责创建页面和相关组件,用户和app的交互门户Activity有四种启动模式Standard,SingleTop,SingleTask,SingleInstance,分别对应AMS对Activity栈的不同管理方式,
启动Activity通过Intent对象,Intent中设置包名类名等数据然后调用startActivity方法,用来实现Activity跳转或者生成新ActivityActivity启动后依次调用onCreate,onStart,onResume回调
Serivce
后台逻辑线程,通常用于处理耗时任务,在Activity销毁后仍可以继续运行
BroadcastReceiver
监听系统广播信号,通过注册IIntentReciver到AMS后开启监听,AMS收到信号匹配回调列表,然后触发onReceive回调
如果配置在AndroidManifest中,当接收到信号时会先拉起进程(如果进程此时还未启动)
ContentProvider
在AndroidManifest中设置的一套接口,用于向别的App提供数据
假设应用A需要向应用B请求数据
应用A先通过向AMS请求应用B的Binder句柄,AMS从B获取句柄后再传给A
A在获取句柄后,和B直接进行通信,数据传输并不直接使用Binder,而是B会初始化一块共享内存,将结果写入在共享内存中,然后这个内存的FD会被传给A,A直接从这个内存读结果
Binder通信
Binder是安卓系统中与系统服务通信的方式,Binder通过一种称为Parcel的二进制数据包传递数据,比如KeyStore服务中的证书句柄就是序列化为Pracel后传递的
App启动流程
Launcher服务通过binder向AMS发送startActivity请求- AMS向
Zygote创建新进程的请求,这里通过Socket通信(可能是历史遗留原因) Zygote通过fork复制自身产生一个新进程- 调用
ActivityThread.main(),主线程启动 - 由AMS发送
Binder信号初始化Application,然后再初始化MainActivity - 调用
onCreate,onStart,onResume回调
TEE机制
安卓中的可信计算环境由KeyStore服务提供,负责管理所有和系统根证书相关的服务,其中私钥经过设计绝无可能从TEE环境外读取,用户通过Binder句柄来调用证书进行通信加密等操作
selinux的权限管理机制
selinux的核心机制是安全上下文,其通过对系统中的用户(访问者)和资源(被访问者)打上标签的方式管理权限
标签有四个部分,分别是User,Role,Type,Sensitivity
对于进程来说,Type叫做域,对于文件Type是类型,selinux通过管理原类型的用户对目标类型的资源的访问策略来管理权限
设备指纹相关
系统服务获取
Android ID,IMEI,Apk包列表,蓝牙信息,wifi信息
这些都通过系统服务获取的,也就是在java层获取的,根据安卓版本不同申请方法不同,由AndroidManifest静态申请权限,或者运行时动态向systemService申请权限
ContentProvider
某些特殊机型的OS可能会通过ContentProvider提供一些设备指纹
prop
主要通过getprop获取或android.os包里面的方法,一些内核层的字段信息
内核相关
主要在/proc和/sys路径下的一些文件,里面可能会有一些序列号之类的,比如/proc/sys/kernel/random/boot_id