滴滴Framework专项面经:LocationManager原理、SensorManager、TelephonyManager、系统服务注册

84 阅读4分钟

上篇聊完出行场景性能优化,这篇进入滴滴Framework专项。滴滴依赖大量系统服务——定位(LocationManager)、传感器(SensorManager)、电话(TelephonyManager)。资深岗面试考Framework层原理和源码理解。

今天8道题覆盖滴滴Framework面试核心考点。

Q1:LocationManager的底层原理是什么?

架构:App调用LocationManager API → LocationManagerService(system_server进程)→ LocationProvider(GPS/Network/Fused)。

GPS Provider:通过JNI调用HAL层GPS芯片驱动。冷启动(无星历)需30-60秒,热启动几秒。AGPS通过网络下载星历加速。

Network Provider:收集WiFi AP的MAC+信号强度、基站Cell ID,发送到服务端查询位置数据库。

追问:FusedLocationProvider是Google Play Services提供的(不是系统Framework),内部融合GPS+Network+传感器数据。国内用高德/百度SDK替代。

Q2:SensorManager怎么用?传感器数据怎么过滤?

SensorManager:管理所有传感器。getDefaultSensor获取传感器实例,registerListener注册监听(可指定采样率:FASTEST/GAME/UI/NORMAL)。

常见传感器:加速度传感器(三轴加速度)、陀螺仪(三轴角速度)、磁力计(地磁场)、气压计(大气压强)。

数据过滤:低通滤波(保留重力分量):filtered = alpha * filtered + (1-alpha) * input。高通滤波(去除重力):accel = input - gravity

追问:计步器怎么实现?加速度数据+峰值检测。Android 4.4+有TYPE_STEP_COUNTER(硬件计步,持续计数)。

Q3:TelephonyManager能获取什么信息?

设备信息:getDeviceId()(IMEI,Android 10+受限)、getSimOperatorName()(运营商)、getNetworkType()(4G/5G)。

通话状态:PhoneStateListener监听通话状态(IDLE/RINGING/OFFHOOK)。滴滴场景:司机通话中暂停GPS上报。

权限收紧:Android 10+获取IMEI/IMSI需READ_PRIVILEGED_PHONE_STATE。Android 14进一步限制。

追问:不获取IMEI怎么唯一标识设备?ANDROID_ID(恢复出厂后变化)、广告ID(用户可重置)、自生成UUID存SP(卸载丢失)。组合多个非敏感标识生成设备指纹。

Q4:系统服务(SystemService)注册机制是什么?

ServiceManager:系统服务注册到ServiceManager(Binder的"电话簿")。客户端通过getService获取Binder代理。

注册流程:系统服务在system_server启动时注册。ServiceManager.addService("location", new LocationManagerService(context))

Binder机制:跨进程通信。客户端Proxy调用 → Binder驱动 → 服务端Stub.onTransact → 执行逻辑 → 返回。一次拷贝(内核→目标进程),比传统IPC高效。

追问:AIDL怎么用?定义.aidl接口 → 编译生成Stub/Proxy → 服务端继承Stub → 客户端bindService获取Proxy → 调用方法。

Q5:ContentProvider的底层原理是什么?

架构:ContentProvider封装CRUD接口,URI标识数据(content://authority/path)。客户端通过ContentResolver操作。

跨进程:底层用Binder通信。ContentResolver.query() → Provider的Binder代理 → 跨进程调用 → 返回Cursor。

生命周期:在Application.onCreate之前初始化。单例模式。

追问:ContentProvider vs SP?大量结构化数据用ContentProvider/Room。少量键值对用SP/DataStore。ContentProvider支持跨App共享。

Q6:Handler/Looper/MessageQueue的关系?

Looper:每个线程最多一个。Looper.prepare()创建,Looper.loop()启动循环。主线程自动创建。

MessageQueue:Looper内部的单向链表,按when排序。

Handler:发送和处理Message的工具。sendMessage/post放入队列,handleMessage/Runnable.run在Looper所在线程执行。

消息循环:Looper.loop()无限循环 → next()取消息(无消息时epoll_wait阻塞)→ dispatchMessage处理 → recycle回收到对象池。

追问:next()为什么不会ANR?无消息时nativePollOnce阻塞(释放CPU),有消息时epoll唤醒。ANR是消息处理时间过长(>5秒),不是next()阻塞。

Q7:AMS(ActivityManagerService)怎么管理Activity?

启动流程:startActivity → AMS检查权限 → 创建ActivityRecord → 通知App → 创建Activity → 调用生命周期。

任务栈:每个App有自己的任务栈。launchMode:standard(新建)、singleTop(栈顶复用)、singleTask(栈内复用)、singleInstance(独立栈)。

进程管理:AMS按优先级杀进程——前台(最高优先级)→ 可见 → 服务 → 后台 → 空(最先杀)。内存不足时从空进程开始回收。

追问:Activity被系统杀后怎么恢复?onSaveInstanceState保存到Bundle,重建时onCreate恢复。ViewModel+SavedStateHandle自动处理。

Q8:滴滴Framework面怎么准备?

重点复习:LocationManager原理(GPS/Network Provider+AGPS+融合定位)、SensorManager(传感器类型+数据滤波)、TelephonyManager(权限收紧+设备标识)、系统服务注册(ServiceManager+Binder+AIDL)、Handler/Looper/MessageQueue、AMS进程管理。

面试技巧:Framework面考底层理解——能讲清"LocationManager底层怎么和GPS芯片交互"、"Binder一次拷贝原理"。准备时读Android源码关键路径(frameworks/base/services/core)。


面试Tips:滴滴Framework面考底层——LocationManager和Binder机制是必考题。Handler/Looper/MessageQueue和AMS也高频。传感器和TelephonyManager经常问。能结合源码关键路径讲清楚加分明显。

下一篇进入小米初级Android工程师——Android基础、UI组件、数据存储、网络请求。


读过Framework源码的同学扣1,你觉得最难读懂的系统服务是哪个?

本系列连载中,关注不迷路,下一篇:小米初级Android工程师面试真题

系列简介:Android大厂面经连载,覆盖字节跳动、腾讯、阿里、美团等40+企业,从初级到架构师全岗位覆盖。每篇文章包含真实面试题+详细答案+代码示例,帮你拿到大厂Offer。