网络策略流程

网络策略在设备启动和UID状态变化时调整,尤其是DataSaver功能开启时。流程涉及DataSaverController接口、PolicyManager、NetworkPolicyManagerService和NetworkManagementService。点击DataSaver开关,策略更新通过updateRulesForDataUsageRestrictionsUL()处理背景数据限制;监听UID状态变化,根据新状态更新应用处理,并在NetworkManagementService中判断是否限制网络访问。整个流程在不同入口后汇聚于相同处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络策略会在开机的时候进行初始化,以及会在uid状态发生变化后作出改变。开启DataSaver功能也会作出策略上的变化。

这几种变化只是前面的入口不同,最后执行策略更新的方法是相同的。

在此仅分析了开启DataSaver功能和UID状态发生变化后的流程。

流程图大致如下

1. 从点击QS,开启DataSaver功能为入口

DataSaver.java#handleClick()

@Override
protected void handleClick() {
    if (mState.value
            || Prefs.getBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, false)) {
        // Do it right away.
        toggleDataSaver();
        return;
    }
    // Shows dialog first
    SystemUIDialog dialog = new SystemUIDialog(mContext);
    dialog.setTitle(com.android.internal.R.string.data_saver_enable_title);
    dialog.setMessage(com.android.internal.R.string.data_saver_description);
    dialog.setPositiveButton(com.android.internal.R.string.data_saver_enable_button,
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    toggleDataSaver();
                }
            });
    dialog.setNegativeButton(com.android.internal.R.string.cancel, null);
    dialog.setShowForAllUsers(true);
    dialog.show();
    Prefs.putBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, true);
}

点击开关会触发 toggleDataSaver()方法

private void toggleDataSaver() {
    mState.value = !mDataSaverController.isDataSaverEnabled();
    mDataSaverController.setDataSaverEnabled(mState.value);
    refreshState(mState.value); // 这里是去刷新UI
}

mDataSaverController是DataSaverController对象,其是一个接口,会走到实现类DataSaverControllerImpl中

DataSaverControllerImpl.java#setDataSaverEnabled()
public void setDataSaverEnabled(boolean enabled) {
    mPolicyManager.setRestrictBackground(enabled);
    try {
        // 这里会去通知接口回调
        mPolicyListener.onRestrictBackgroundChanged(enabled);
    } catch (RemoteException e) {
    }
}

mPolicyManager是PolicyManager对象,其会通过Binder执行到NetworkPolicyManagerService中

NetworkPolicyManagerService.java#setRestrictBackground()
@Override
public void setRestrictBackground(boolean restrictBackground) {
    Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "setRestrictBackground");
    try {
        mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
        final long token = Binder.clearCallingIdentity();
        try {
            maybeRefreshTrustedTime();
            synchronized (mUidRulesFirstLock) {
                if (restrictBackground == mRestrictBackground) {
                    // Ideally, UI should never allow this scenario...
                    Slog.w(TAG, "setRestrictBackground: already " + restrictBackground);
                    return;
                }
		// 会去设置后台一些网络访问的规则
                setRestrictBackgroundUL(restrictBackground);
            }
        } finally {
            Binder.restoreCallingIdentity(token);
        }
        mHandler.obtainMessage(MSG_RESTRICT_BACKGROUND_CHANGED, restrictBackground ? 1 : 0, 0)
                .sendToTarget();
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
    }
}
NetworkPolicyManagerService#setRestrictBackgroundUL()
private void setRestrictBackgroundUL(boolean restrictBackground) {
    Slog.d(TAG, "setRestrictBackgroundUL(): " + restrictBackground);
    final boolean oldRestrictBackground = mRestrictBackground;
    mRestrictBackground = restrictBackground;
    // Must whitelist foreground apps before turning data saver mode on.
    // TODO: there is no need to iterate through all apps here, just those in the foreground,
    // so it could call AM to get the UIDs of such apps, and iterate through them instead.
    // 先去根据白名单和黑名单更新每个应用的网络访问规则
    updateRulesForRestrictBackgroundUL();
    try {
        if (!mNetworkManager.setDataSaverModeEnabled(mRestrictBackground)) {
            Slog.e(TAG, "Could not change Data Saver Mode on NMS to " + mRestri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值