系统Doze白名单常用接口

  1. 获取Doze白名单列表:DeviceIdleController.getUserPowerWhitelist
  2. 是否Doze白名单:DeviceIdleController.isPowerSaveWhitelistApp
  3. Doze白名单变化广播:PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED
  4. 设置Doze白名单:DeviceIdleController.addPowerSaveWhitelistApp
package com.android.server.doze;

import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.IDeviceIdleController;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.util.ArrayMap;

import com.android.server.LocalServices;
import com.android.server.usage.AppStandbyConfig;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class UserWhiteList {

    public static final String TAG = "UserWhiteList";
    private static final ArrayMap<String, IWhiteListChangedListener> mListeners = new ArrayMap<>();
    private final IDeviceIdleController mDeviceIdleController;
    private final UsageStatsManagerInternal mUsageStatsService;
    private static final List<String> mWhiteAllList = new ArrayList<>();
    //监听的回调:
    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (null == intent) {
                return;
            }

            switch (intent.getAction()) {
                case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED:
                    synchronized (mListeners) {
                        onUserWhiteListChanged();
                        for (Map.Entry<String, IWhiteListChangedListener> entity : mListeners.entrySet()) {
                            IWhiteListChangedListener lsr = entity.getValue();
                            if (lsr != null) {
                                lsr.onUserWhiteListChanged();
                            }
                        }

                        List<String> dozeWhiteList = getUserPowerWhitelist(true);
                        if (null != dozeWhiteList) {
                            String dozeWhiteListInfo = "ACTION_POWER_SAVE_WHITELIST_CHANGED " +
                                    "onUserWhiteListChanged " + dozeWhiteList;
                            PowerLog.getInstance().writePowerFeatureLog(dozeWhiteListInfo);
                        }
                    }
                    break;
                case Intent.ACTION_PACKAGE_ADDED:
                    final String packageName = intent.getData().getEncodedSchemeSpecificPart();
                    if (null == packageName) {
                        break;
                    }

                    // keep pre doze config while app update event
                    if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                        break;
                    }

                    // add app to doze white list while app install event
                    if (AppStandbyConfig.isDozePkgWhiteList(packageName)
                            && !isPowerSaveWhitelistApp(packageName)) {
                        addPowerSaveWhitelistApp(packageName);
                        String whiteAppInfo = "ACTION_PACKAGE_ADDED " +
                                "addPowerSaveWhitelistApp " + "packageName:" + packageName;
                        Nslog.d(TAG_DOZE, TAG, whiteAppInfo);
                        PowerLog.getInstance().writePowerFeatureLog(whiteAppInfo);
                    }
                    break;
                default:
                    break;
            }
        }
    };

    public UserWhiteList(Context context, Handler handler) {
        mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
                ServiceManager.getService("deviceidle"));
        mUsageStatsService = LocalServices.getService(UsageStatsManagerInternal.class);
        IntentFilter intentFilter = new IntentFilter(
                PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
        context.registerReceiver(mBroadcastReceiver, intentFilter,
                null, handler);

        intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        intentFilter.addDataScheme("package");

        context.registerReceiver(mBroadcastReceiver, intentFilter,
                null, handler);
        Nslog.d(TAG_DOZE, TAG, "registerReceiver success");
    }

    public void registerWhiteListChangedListener(String feature, IWhiteListChangedListener listener) {
        synchronized (mListeners) {
            if (listener != null && feature != null) {
                mListeners.put(feature, listener);
            }
        }
    }

    public void onUserWhiteListChanged() {
        List<String> whitelist = getUserPowerWhitelist(true);
        mWhiteAllList.clear();
        mWhiteAllList.addAll(whitelist);
    }

    public List<String> getUserPowerWhitelist() {
        return mWhiteAllList;
    }

    /**
     * 获取所有白名单包名
     */
    public List<String> getUserPowerWhitelist(boolean all) {
        List<String> whitelistPkgs = new ArrayList<>();
        try {
            String[] pkgs = mDeviceIdleController.getUserPowerWhitelist();
            for (int i = 0; i < pkgs.length; i++) {
                if (!all && AppStandbyConfig.isDozePkgWhiteList(pkgs[i])) {
                    continue;
                }
                whitelistPkgs.add(pkgs[i]);
            }
        } catch (RemoteException e) {
            Nslog.d(TAG_DOZE, TAG, e.toString());
        }
        return whitelistPkgs;
    }

    /**
     * 判断是否白名单
     */
    public boolean isPowerSaveWhitelistApp(String pkg) {
        boolean isWhite = false;
        try {
            isWhite = mDeviceIdleController.isPowerSaveWhitelistApp(pkg);
        } catch (RemoteException e) {
            Nslog.d(TAG_DOZE, TAG, e.toString());
        }
        return isWhite;
    }

    /**
     * 获取白名单大小, setting可使用这个方法
     */
    public int getAppIdUserWhitelistSize() {
        try {
            int[] uids = mDeviceIdleController.getAppIdUserWhitelist();
            return uids.length;
        } catch (RemoteException e) {
            Nslog.d(TAG_DOZE, TAG, e.toString());
        }
        return 0;
    }

    public List<String> getRunningAppBuckets(List<String> run) {
        if (run == null) {
            return null;
        }
        List<String> list = new ArrayList<>();
        for (int i = 0; i < run.size(); i++) {
            int bucket = -1;
            if (null != mUsageStatsService) {
                bucket = mUsageStatsService.getAppStandbyBucket(run.get(i), 0, SystemClock.elapsedRealtime());
            }
            if (bucket == UsageStatsManager.STANDBY_BUCKET_RESTRICTED) {
                list.add(run.get(i));
            }
        }
        return list;
    }


    public boolean isInRestrictedPackage(String pkg) {
        boolean isRestricted = (UsageStatsManager.STANDBY_BUCKET_RESTRICTED <= getAppBucket(pkg));
        return isRestricted;
    }

    public int getAppBucket(String pkg) {
        int bucket = -1;
        if (null != mUsageStatsService) {
            bucket = mUsageStatsService.getAppStandbyBucket(pkg, 0, SystemClock.elapsedRealtime());
        }
        return bucket;
    }

    private void addPowerSaveWhitelistApp(String pkgName) {
        try {
            if (null == mDeviceIdleController) {
                return;
            }

            mDeviceIdleController.addPowerSaveWhitelistApp(pkgName);
        } catch (RemoteException e) {
            Nslog.d(TAG_DOZE, TAG, e.toString());
        }
    }

}

相关推荐

  1. 系统Doze名单接口

    2024-07-13 04:52:03       21 阅读
  2. zookeeper接口

    2024-07-13 04:52:03       49 阅读
  3. Android 8.1 默认应用加入系统名单

    2024-07-13 04:52:03       52 阅读
  4. 服务器名单

    2024-07-13 04:52:03       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 04:52:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 04:52:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 04:52:03       58 阅读
  4. Python语言-面向对象

    2024-07-13 04:52:03       69 阅读

热门阅读

  1. 小试epoll

    2024-07-13 04:52:03       26 阅读
  2. HTTP模块

    2024-07-13 04:52:03       23 阅读
  3. git diff,stash,submodule,format-patch

    2024-07-13 04:52:03       27 阅读
  4. linux系统安全加固

    2024-07-13 04:52:03       19 阅读
  5. ACE之ACE_Time_Value

    2024-07-13 04:52:03       23 阅读
  6. 力扣 150题 逆波兰表达式求值 记录

    2024-07-13 04:52:03       30 阅读
  7. cin和getline的区别

    2024-07-13 04:52:03       22 阅读
  8. STM32F103RC使用HAL库配置USART进行数据收发

    2024-07-13 04:52:03       27 阅读
  9. 07-7.5.3 处理冲突的方法

    2024-07-13 04:52:03       24 阅读
  10. Vue的import什么时候用大括号

    2024-07-13 04:52:03       22 阅读
  11. Spring Boot 框架知识汇总

    2024-07-13 04:52:03       25 阅读
  12. SpringBoot源码阅读(11)——后处理器2

    2024-07-13 04:52:03       23 阅读
  13. redis的发布与订阅

    2024-07-13 04:52:03       24 阅读
  14. Vue Router 4:构建高效单页面应用的路由管理

    2024-07-13 04:52:03       24 阅读
  15. c++【入门】病狗问题

    2024-07-13 04:52:03       21 阅读