跳转至

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(this).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 {}
}

DefaultImplStorageMonitoringInterface的一个静态内部类,提供了接口的默认实现。也就是说该类没有额外的方法或成员变量,直接继承接口的默认方法实现。

三个默认的方法可参考代码中的注释。

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);  
        }  
    }  
}

由于其他接口的实现方式类似且相对简单,因此在此不再赘述详细分析。

评论