Android系统服务之PinnerService

一:背景

    PinnerService作为Android系统服务之一,用于将特定的文件或者应用程序固定到内存中,以提高应用启动速度和系统性能。下面来看下其工作原理。

二:工作原理

2.1 启动

PinnerService的启动和其他系统服务的启动一样,也是在SystemServer中启动的

private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    ...
    t.traceBegin("PinnerService");
    mSystemServiceManager.startService(PinnerService.class);
    t.traceEnd();
    ...
}

2.2 初始化

  • 有三类应用是可能被pin到内存中的(camera、home、Assistant),如果需要pin应用,就把对应应用的key放入mPinKeys中
  • 监听应用变化、监听uid变化、监听用户是否设置完成
  • pin特定文件
  • pin特定应用
    PinnerService(Context context, Injector injector) {
        ...
        //初始化参数
        mConfiguredToPinCamera = context.getResources().getBoolean(
                com.android.internal.R.bool.config_pinnerCameraApp);
        mConfiguredHomePinBytes = context.getResources().getInteger(
                com.android.internal.R.integer.config_pinnerHomePinBytes);
        mConfiguredToPinAssistant = context.getResources().getBoolean(
                com.android.internal.R.bool.config_pinnerAssistantApp);
        mConfiguredWebviewPinBytes = context.getResources().getInteger(
                com.android.internal.R.integer.config_pinnerWebviewPinBytes);
        //初始化可能需要pin的应用的key
        mPinKeys = createPinKeys();
        mPinnerHandler = new PinnerHandler(BackgroundThread.get().getLooper());
        ...
        //注册广播监听应用变化
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
        filter.addDataScheme("package");
        mContext.registerReceiver(mBroadcastReceiver, filter);
        //监听uid变化
        registerUidListener();
        //监听用户设置完成,以便pin桌面应用
        registerUserSetupCompleteListener();

        ...
    }

    public void onStart() {
        ...
        //pin特定文件
        mPinnerHandler.obtainMessage(PinnerHandler.PIN_ONSTART_MSG).sendToTarget();
        //pin特定应用
        sendPinAppsMessage(UserHandle.USER_SYSTEM);
    }

    private ArraySet<Integer> createPinKeys() {
        ArraySet<Integer> pinKeys = new ArraySet<>();
        //是否需要pin camera应用
        boolean shouldPinCamera = mConfiguredToPinCamera
                && mDeviceConfigInterface.getBoolean(DeviceConfig.NAMESPACE_RUNTIME_NATIVE_BOOT,
                        "pin_camera",
                        SystemProperties.getBoolean("pinner.pin_camera", true));
        if (shouldPinCamera) {
            pinKeys.add(KEY_CAM
### Pinnerservice 的定义及其工作流程 PinnerserviceAndroid 系统中用于优化应用启动性能的一个服务。它的主要功能是通过将特定的文件(如 odex 或 vdex 文件)固定到内存中,减少这些文件在运行时被频繁加载和解析的时间,从而提升应用启动速度和系统整体性能[^4]。 #### 1. Pinnerservice 的定义 PinnerserviceAndroid 系统中的一个系统服务,属于 SystemServer 启动的服务之一[^3]。它通过预先加载并固定某些关键文件(例如 odex 和 vdex 文件)到内存中,确保这些文件在需要时能够快速访问,避免因磁盘 I/O 操作而导致的性能瓶颈。 #### 2. Pinnerservice 的工作流程 Pinnerservice 的工作流程主要包括以下几个方面: - **配置读取** 在 Pinnerservice 启动时,会从系统属性中读取相关的配置信息,决定是否使用 pinlist.meta 文件或直接固定整个 odex/vdex 文件。这些配置包括 `pinner.use_pinlist` 和 `pinner.whole_odex`,分别控制是否使用 pinlist.meta 文件以及是否固定整个 odex 文件[^4]。 - **文件固定** 根据配置,Pinnerservice 会选择性地将指定的应用程序相关文件(如 odex 或 vdex 文件)固定到内存中。这一步通常通过 mmap 系统调用实现,将文件映射到内存,并设置为不可换出的状态,以确保文件始终驻留在物理内存中。 - **动态调整** Pinnerservice 还可以根据系统的运行状态动态调整固定的文件集合。例如,当系统内存不足时,可以释放部分不常用的文件,以释放内存资源。 - **与其他服务的协作** Pinnerservice 的工作与 JobScheduler 等其他系统服务可能存在协作关系。例如,在执行某些作业时,可能会触发 Pinnerservice 对特定文件进行固定,以确保作业执行期间的性能稳定性[^2]。 ```python # 示例代码:Pinnerservice 配置读取逻辑 import os def load_pinner_config(): use_pinlist = os.getenv("pinner.use_pinlist", "true").lower() == "true" whole_odex = os.getenv("pinner.whole_odex", "true").lower() == "true" return use_pinlist, whole_odex use_pinlist, whole_odex = load_pinner_config() print(f"Use Pinlist: {use_pinlist}, Whole Odex: {whole_odex}") ``` #### 3. Pinnerservice 的意义 Pinnerservice 的引入显著改善了 Android 系统中应用启动的性能,特别是在设备内存有限的情况下。通过减少磁盘 I/O 操作,Pinnerservice 能够降低应用启动延迟,提升用户体验。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值