Android 15 CarService源码05-SystemInterface
背景¶
上一篇内容稍微复杂,可能会让大家觉得有些累,其实我写起来也挺费劲的。这篇就简单一些,以后我们会尽量交替写一些难度适中的内容。
加上在进程起来后就初始化了 SystemInterface
,之前有些朋友也问我这个 SystemInterface
到底是怎么回事?那我们这次就选择分析 SystemInterface
吧。
类图¶
省略,后续补充。
简介¶
// packages/services/Car/service/src/com/android/car/systeminterface/SystemStateInterface.java
/**
* 该类包含了CarService与Android OS API之间的所有不同包装接口的引用。
*/
public class SystemInterface implements ActivityManagerInterface,
DisplayInterface, IOInterface, StorageMonitoringInterface,
SystemStateInterface, TimeInterface,
WakeLockInterface {
}
SystemInterface
类通过实现多个接口,成为一个多功能的系统接口类,能够处理与Android系统的多种交互。
初始化¶
在前面的 Android 15 CarService源码02-服务初始化 中提到,在构建一个 ICarImpl
对象时,会同时创建一个系统接口实例。
// packages/services/Car/service/src/com/android/car/CarServiceImpl.java
mICarImpl = new ICarImpl.Builder()
.setServiceContext(this)
.setBuiltInContext(getBuiltinPackageContext())
.setVehicle(mVehicle)
.setSystemInterface(SystemInterface.Builder.defaultSystemInterface(this).build())
.setVehicleInterfaceName(mVehicleInterfaceName)
.build();
我们看一下这句:
SystemInterface.Builder.defaultSystemInterface()¶
// packages/services/Car/service/src/com/android/car/systeminterface/SystemStateInterface.java
public class SystemInterface implements ActivityManagerInterface,
DisplayInterface, IOInterface, StorageMonitoringInterface,
SystemStateInterface, TimeInterface,
WakeLockInterface {
/**
* SystemInterface的构建器类,用于创建SystemInterface实例
*/
public final static class Builder {
// 各种接口的实例变量
private ActivityManagerInterface mActivityManagerInterface;
private DisplayInterface mDisplayInterface;
private IOInterface mIOInterface;
private StorageMonitoringInterface mStorageMonitoringInterface;
private SystemStateInterface mSystemStateInterface;
private TimeInterface mTimeInterface;
private WakeLockInterface mWakeLockInterface;
// 私有构造函数,防止外部直接实例化
private Builder() {}
/**
* 创建一个新的Builder实例
* @return 新的Builder对象
*/
public static Builder newSystemInterface() {
return new Builder();
}
/**
* 创建一个具有默认实现的Builder实例
* @param context 上下文对象,不能为null
* @return 配置了默认实现的Builder对象
*/
public static Builder defaultSystemInterface(Context context) {
// 确保context不为null
Objects.requireNonNull(context);
// 创建新的Builder实例
Builder builder = newSystemInterface();
// 配置ActivityManagerInterface的默认实现
builder.withActivityManagerInterface(new ActivityManagerInterface.DefaultImpl(context));
// 配置WakeLockInterface的默认实现
builder.withWakeLockInterface(new WakeLockInterface.DefaultImpl(context));
// 配置DisplayInterface的默认实现,依赖于WakeLockInterface
builder.withDisplayInterface(new DisplayInterface.DefaultImpl(context,
builder.mWakeLockInterface));
// 配置IOInterface的默认实现
builder.withIOInterface(new IOInterface.DefaultImpl());
// 配置StorageMonitoringInterface的默认实现
builder.withStorageMonitoringInterface(new StorageMonitoringInterface.DefaultImpl());
// 配置SystemStateInterface的默认实现
builder.withSystemStateInterface(new SystemStateInterface.DefaultImpl(context));
// 配置TimeInterface的默认实现并返回Builder
return builder.withTimeInterface(new TimeInterface.DefaultImpl());
}
// 以下方法用于设置各个接口的实现,并返回Builder自身以支持链式调用
public Builder withActivityManagerInterface(ActivityManagerInterface
activityManagerInterface) {
mActivityManagerInterface = activityManagerInterface;
return this;
}
public Builder withDisplayInterface(DisplayInterface displayInterface) {
mDisplayInterface = displayInterface;
return this;
}
public Builder withIOInterface(IOInterface ioInterface) {
mIOInterface = ioInterface;
return this;
}
public Builder withStorageMonitoringInterface(StorageMonitoringInterface
storageMonitoringInterface) {
mStorageMonitoringInterface = storageMonitoringInterface;
return this;
}
public Builder withSystemStateInterface(SystemStateInterface systemStateInterface) {
mSystemStateInterface = systemStateInterface;
return this;
}
public Builder withTimeInterface(TimeInterface timeInterface) {
mTimeInterface = timeInterface;
return this;
}
public Builder withWakeLockInterface(WakeLockInterface wakeLockInterface) {
mWakeLockInterface = wakeLockInterface;
return this;
}
}
}
Builder
是一个静态内部类,用于创建SystemInterface
的实例。Builder
的构造方法是私有的,防止外部直接实例化。只能通过静态方法newSystemInterface()
和defaultSystemInterface(Context context)
来创建实例。
SystemInterface.Builder.build()¶
// packages/services/Car/service/src/com/android/car/systeminterface/SystemStateInterface.java
public class SystemInterface implements ActivityManagerInterface,
DisplayInterface, IOInterface, StorageMonitoringInterface,
SystemStateInterface, TimeInterface,
WakeLockInterface {
// 各种接口的私有成员变量,用于保存接口的具体实现
private final ActivityManagerInterface mActivityManagerInterface;
private final DisplayInterface mDisplayInterface;
private final IOInterface mIOInterface;
private final StorageMonitoringInterface mStorageMonitoringInterface;
private final SystemStateInterface mSystemStateInterface;
private final TimeInterface mTimeInterface;
private final WakeLockInterface mWakeLockInterface;
/**
* SystemInterface的构造函数,初始化所有接口的实现
*
* @param activityManagerInterface 活动管理器接口的实现
* @param displayInterface 显示接口的实现
* @param ioInterface IO接口的实现
* @param storageMonitoringInterface 存储监控接口的实现
* @param systemStateInterface 系统状态接口的实现
* @param timeInterface 时间接口的实现
* @param wakeLockInterface 唤醒锁接口的实现
*/
SystemInterface(ActivityManagerInterface activityManagerInterface,
DisplayInterface displayInterface,
IOInterface ioInterface,
StorageMonitoringInterface storageMonitoringInterface,
SystemStateInterface systemStateInterface,
TimeInterface timeInterface,
WakeLockInterface wakeLockInterface) {
// 初始化各个接口的实现
mActivityManagerInterface = activityManagerInterface;
mDisplayInterface = displayInterface;
mIOInterface = ioInterface;
mStorageMonitoringInterface = storageMonitoringInterface;
mSystemStateInterface = systemStateInterface;
mTimeInterface = timeInterface;
mWakeLockInterface = wakeLockInterface;
}
// 获取活动管理器接口的实现
public ActivityManagerInterface getActivityManagerInterface() {
return mActivityManagerInterface;
}
// 获取显示接口的实现
public DisplayInterface getDisplayInterface() {
return mDisplayInterface;
}
// 获取IO接口的实现
public IOInterface getIOInterface() {
return mIOInterface;
}
// 获取系统状态接口的实现
public SystemStateInterface getSystemStateInterface() {
return mSystemStateInterface;
}
// 获取时间接口的实现
public TimeInterface getTimeInterface() {
return mTimeInterface;
}
// 获取唤醒锁接口的实现
public WakeLockInterface getWakeLockInterface() {
return mWakeLockInterface;
}
/**
* SystemInterface的构建器类,用于创建SystemInterface实例
*/
public final static class Builder {
// 各种接口的成员变量,用于保存接口的具体实现
private ActivityManagerInterface mActivityManagerInterface;
private DisplayInterface mDisplayInterface;
private IOInterface mIOInterface;
private StorageMonitoringInterface mStorageMonitoringInterface;
private SystemStateInterface mSystemStateInterface;
private TimeInterface mTimeInterface;
private WakeLockInterface mWakeLockInterface;
/**
* 构建SystemInterface实例
*
* @return 配置好的SystemInterface对象
* @throws NullPointerException 如果任何接口实现为null
*/
public SystemInterface build() {
// 使用非空检查确保所有接口都有实现
return new SystemInterface(Objects.requireNonNull(mActivityManagerInterface),
Objects.requireNonNull(mDisplayInterface),
Objects.requireNonNull(mIOInterface),
Objects.requireNonNull(mStorageMonitoringInterface),
Objects.requireNonNull(mSystemStateInterface),
Objects.requireNonNull(mTimeInterface),
Objects.requireNonNull(mWakeLockInterface));
}
}
}
build()
方法用于创建SystemInterface
实例。在创建实例时,使用Objects.requireNonNull()
方法确保所有接口实现都不为null
,否则会抛出NullPointerException
。
我们回到 SystemInterface.Builder.defaultSystemInterface() 一个一个分析其初始化过程。
ActivityManagerInterface.DefaultImpl¶
// packages/services/Car/service/src/com/android/car/systeminterface/ActivityManagerInterface.java
/**
* 抽象活动管理器操作的接口
*/
public interface ActivityManagerInterface {
/**
* ActivityManagerInterface的默认实现
*/
class DefaultImpl implements ActivityManagerInterface {
// 上下文对象,用于访问系统资源和服务
private final Context mContext;
/**
* 构造函数,初始化DefaultImpl实例
*
* @param context 上下文对象,不能为null
*/
DefaultImpl(Context context) {
// 将传入的上下文对象赋值给成员变量mContext
mContext = context;
}
}
}
很简单构造函数接受一个Context
对象作为参数,并将其赋值给成员变量mContext
。
WakeLockInterface.DefaultImpl¶
// packages/services/Car/service/src/com/android/car/systeminterface/WakeLockInterface.java
/**
* 抽象唤醒锁操作的接口
*/
public interface WakeLockInterface {
/**
* WakeLockInterface的默认实现
*/
class DefaultImpl implements WakeLockInterface {
// 日志标签,用于日志输出
private static final String TAG = WakeLockInterface.class.getSimpleName();
// 上下文对象,用于访问系统服务
private final Context mContext;
// 锁对象,用于同步
private final Object mLock = new Object();
// 用于存储每个显示器的唤醒锁对(全唤醒锁和部分唤醒锁)
@GuardedBy("mLock")
private final SparseArray<Pair</* Full */WakeLock, /* Partial */WakeLock>>
mPerDisplayWakeLocks = new SparseArray<>();
/**
* 构造函数,初始化DefaultImpl实例
*
* @param context 上下文对象,不能为null
*/
DefaultImpl(Context context) {
// 将传入的上下文对象赋值给成员变量mContext
mContext = context;
// 获取DisplayManager服务
DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
// 注册显示监听器
displayManager.registerDisplayListener(mDisplayListener, /* handler= */ null);
// 为每个显示器创建唤醒锁对
for (Display display : displayManager.getDisplays()) {
int displayId = display.getDisplayId();
Pair<WakeLock, WakeLock> wakeLockPair = createWakeLockPair(displayId);
// 同步存储唤醒锁对
synchronized (mLock) {
mPerDisplayWakeLocks.put(displayId, wakeLockPair);
}
}
}
/**
* 创建一个唤醒锁对(全唤醒锁和部分唤醒锁)
*
* @param displayId 显示器ID
* @return 唤醒锁对
*/
private Pair<WakeLock, WakeLock> createWakeLockPair(int displayId) {
// 构建唤醒锁的标签
StringBuilder tag = new StringBuilder(CarLog.TAG_POWER).append(":")
.append(displayId);
// 创建全唤醒锁
WakeLock fullWakeLock = PowerManagerHelper.newWakeLock(mContext,
PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
tag.toString(), displayId);
// 创建部分唤醒锁
WakeLock partialWakeLock = PowerManagerHelper.newWakeLock(mContext,
PowerManager.PARTIAL_WAKE_LOCK, tag.toString(), displayId);
// 输出日志信息
Slogf.d(TAG, "createWakeLockPair displayId=%d", displayId);
// 返回唤醒锁对
return Pair.create(fullWakeLock, partialWakeLock);
}
}
}
构造函数接受一个Context
对象作为参数,并将其赋值给成员变量mContext
。获取DisplayManager
服务并注册显示监听器。为每个显示器创建唤醒锁对,并将其存储在mPerDisplayWakeLocks
中。
createWakeLockPair()
方法用于为指定的显示器ID创建一个唤醒锁对,包括全唤醒锁和部分唤醒锁。这个是干什么的暂时不清楚,留个疑问。
DisplayInterface.DefaultImpl¶
// packages/services/Car/service/src/com/android/car/systeminterface/DisplayInterface.java
/**
* 抽象显示操作的接口
*/
public interface DisplayInterface {
/**
* 显示操作的默认实现
*/
class DefaultImpl implements DisplayInterface {
// 无效的显示亮度值常量
private static final int INVALID_DISPLAY_BRIGHTNESS = -1;
// 上下文对象,用于访问系统服务
private final Context mContext;
// 显示管理器,用于管理显示设备
private final DisplayManager mDisplayManager;
// 锁对象,用于同步
private final Object mLock = new Object();
// 最大背光亮度
private final int mMaximumBacklight;
// 最小背光亮度
private final int mMinimumBacklight;
// 唤醒锁接口,用于管理唤醒锁
private final WakeLockInterface mWakeLockInterface;
// 用于存储每个显示器的状态(开/关)
@GuardedBy("mLock")
private final SparseBooleanArray mDisplayStateSet = new SparseBooleanArray();
// 用于存储每个显示器的亮度值
@GuardedBy("mLock")
private final SparseIntArray mDisplayBrightnessSet = new SparseIntArray();
// 用户管理器,用于管理用户信息
private final UserManager mUserManager;
/**
* 构造函数,初始化DefaultImpl实例
*
* @param context 上下文对象,不能为null
* @param wakeLockInterface 唤醒锁接口的实现
*/
DefaultImpl(Context context, WakeLockInterface wakeLockInterface) {
// 将传入的上下文对象赋值给成员变量mContext
mContext = context;
// 获取DisplayManager服务
mDisplayManager = context.getSystemService(DisplayManager.class);
// 获取最大和最小屏幕亮度设置
mMaximumBacklight = PowerManagerHelper.getMaximumScreenBrightnessSetting(context);
mMinimumBacklight = PowerManagerHelper.getMinimumScreenBrightnessSetting(context);
// 将传入的唤醒锁接口赋值给成员变量mWakeLockInterface
mWakeLockInterface = wakeLockInterface;
// 同步初始化显示器状态和亮度
synchronized (mLock) {
for (Display display : mDisplayManager.getDisplays()) {
int displayId = display.getDisplayId();
// 初始化显示器状态
mDisplayStateSet.put(displayId, isDisplayOn(displayId));
// 初始化显示器亮度为无效值
mDisplayBrightnessSet.put(displayId, INVALID_DISPLAY_BRIGHTNESS);
}
}
// 获取UserManager服务
mUserManager = context.getSystemService(UserManager.class);
}
}
}
构造函数接收一个 Context
对象和一个 WakeLockInterface
对象作为参数。通过 Context
初始化显示管理器 mDisplayManager
、最大亮度 mMaximumBacklight
和最小亮度 mMinimumBacklight
,以及唤醒锁接口 mWakeLockInterface
。同时,通过同步机制初始化每个显示器的状态 mDisplayStateSet
和亮度 mDisplayBrightnessSet
,并获取用户管理器服务 mUserManager
。
IOInterface.DefaultImpl¶
// packages/services/Car/service/src/com/android/car/systeminterface/IOInterface.java
/**
* 抽象I/O操作的接口
*/
public interface IOInterface {
/**
* IOInterface的默认实现
*/
class DefaultImpl implements IOInterface {
// 用于存储系统车载目录的File对象
private final File mSystemCarDir;
/**
* 构造函数,初始化DefaultImpl实例
*/
DefaultImpl() {
// 初始化mSystemCarDir为系统车载目录的路径
mSystemCarDir = new File("/data/system/car");
}
}
}
直接初始化mSystemCarDir
为/data/system/car
路径的File
对象。这表示该实现默认将I/O操作指向系统的车载目录。
StorageMonitoringInterface.DefaultImpl¶
// packages/services/Car/service/src/com/android/car/systeminterface/StorageMonitoringInterface.java
/**
* 抽象存储监控操作的接口
*/
@ExcludeFromCodeCoverageGeneratedReport(reason = BOILERPLATE_CODE)
public interface StorageMonitoringInterface {
/**
* 获取闪存磨损信息提供者的默认实现
*
* @param lifetimePath 生命周期路径
* @param eolPath 使用寿命终止路径
* @return WearInformationProvider数组,包含不同的磨损信息提供者
*/
default WearInformationProvider[] getFlashWearInformationProviders(
String lifetimePath, String eolPath) {
return new WearInformationProvider[] {
// eMMC磨损信息提供者
new EMmcWearInformationProvider(
new File(lifetimePath), new File(eolPath)),
// UFS磨损信息提供者
new UfsWearInformationProvider(),
// 健康服务磨损信息提供者
new HealthServiceWearInfoProvider()
};
}
/**
* 获取UID I/O统计信息提供者的默认实现
*
* @return UidIoStatsProvider实例
*/
default UidIoStatsProvider getUidIoStatsProvider() {
return new ProcfsUidIoStatsProvider();
}
/**
* 获取生命周期写入信息提供者的默认实现
*
* @return LifetimeWriteInfoProvider实例
*/
default LifetimeWriteInfoProvider getLifetimeWriteInfoProvider() {
return new SysfsLifetimeWriteInfoProvider();
}
/**
* StorageMonitoringInterface的默认实现
*/
class DefaultImpl implements StorageMonitoringInterface {}
}
DefaultImpl
是StorageMonitoringInterface
的一个静态内部类,提供了接口的默认实现。也就是说该类没有额外的方法或成员变量,直接继承接口的默认方法实现。
三个默认的方法可参考代码中的注释。
SystemStateInterface.DefaultImpl¶
// packages/services/Car/service/src/com/android/car/systeminterface/SystemStateInterface.java
/**
* 抽象系统状态(如启动、休眠等)操作的接口
*/
public interface SystemStateInterface {
/**
* 内部使用的默认实现
*/
@VisibleForTesting
class DefaultImpl implements SystemStateInterface {
// 上下文对象,用于访问系统资源和服务
private final Context mContext;
/**
* 构造函数,初始化DefaultImpl实例
*
* @param context 上下文对象,不能为null
*/
@VisibleForTesting
public DefaultImpl(Context context) {
// 将传入的上下文对象赋值给成员变量mContext
mContext = context;
}
}
}
构造函数接受一个Context
对象作为参数,并将其赋值给成员变量mContext
。
TimeInterface.DefaultImpl¶
// packages/services/Car/service/src/com/android/car/systeminterface/TimeInterface.java
/**
* 抽象时间操作的接口
*/
public interface TimeInterface {
/**
* TimeInterface的默认实现
*/
class DefaultImpl implements TimeInterface {
// 当前类没有定义构造函数
}
}
如何使用¶
结合前面 SystemInterface.Builder.defaultSystemInterface() 和 SystemInterface.Builder.build() 的分析,我们知道了 SystemInterface
成员变量 mActivityManagerInterface
其实就是 ActivityManagerInterface.DefaultImpl
,其他成像变量类似。
所有通过 SystemInterface
就可以调到真正的实现接口了。
SystemInterface.sendBroadcastAsUser()¶
public class SystemInterface implements ActivityManagerInterface,
DisplayInterface, IOInterface, StorageMonitoringInterface,
SystemStateInterface, TimeInterface,
WakeLockInterface {
private final ActivityManagerInterface mActivityManagerInterface;
@Override
public void sendBroadcastAsUser(Intent intent, UserHandle user) {
mActivityManagerInterface.sendBroadcastAsUser(intent, user);
}
}
ActivityManagerInterface.DefaultImpl.sendBroadcastAsUser()¶
public interface ActivityManagerInterface {
void sendBroadcastAsUser(Intent intent, UserHandle user);
class DefaultImpl implements ActivityManagerInterface {
private final Context mContext;
DefaultImpl(Context context) {
mContext = context;
}
@Override
public void sendBroadcastAsUser(@RequiresPermission Intent intent, UserHandle user) {
mContext.sendBroadcastAsUser(intent, user);
}
}
}
由于其他接口的实现方式类似且相对简单,因此在此不再赘述详细分析。