一:背景
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

最低0.47元/天 解锁文章
3224

被折叠的 条评论
为什么被折叠?



