源码中Doze白名单被移除的4种情况

1.adb shell命令移除:adb shell dumpsys deviceidle whitelist -xxx

调用接口:DeviceIdleController:removePowerSaveWhitelistAppInternal

2.应用卸载事件:Intent.ACTION_PACKAGE_REMOVED

调用接口:DeviceIdleController:removePowerSaveWhitelistAppInternal

3.应用组件发生变化&使用配套设备配对服务(CompanionDeviceManager )&无后台运行权限会触发Doze名单移除

调用接口:

PackageMonitor:Intent.ACTION_PACKAGE_ADDED&Intent.EXTRA_REPLACING/Intent.ACTION_PACKAGE_CHANGED

CompanionDeviceManagerService:onPackageModifiedInternal->

updateSpecialAccessPermissionForAssociatedPackage->updateSpecialAccessPermissionAsSystem

PowerWhitelistManager:removeFromWhitelist

PowerExemptionManager:removeFromPermanentAllowList

IDeviceIdleController:removePowerSaveWhitelistApp

DeviceIdleController:removePowerSaveWhitelistAppInternal

调试代码:

    private void onPackageModifiedInternal(@UserIdInt int userId, @NonNull String packageName) {
        /*if (DEBUG) */Log.i(TAG, "onPackageModified() u" + userId + "/" + packageName);
        // huazhi.su add for test doze white list
        if ("com.tencent.mm".equals(packageName)) {
            String MAC_ADDRESS = "AA:BB:CC:DD:FF:EE";
            AssociationInfo info =
                    new AssociationInfo(
                            /* id= */ 10888,
                            /* userId= */ userId,
                            "com.tencent.mm",
                            MacAddress.fromString(MAC_ADDRESS),
                            "displayName_test",
                            "deviceProfile_test",
                            /* AssociatedDevice*/ null,
                            /* selfManaged= */ false,
                            /* notifyOnDeviceNearby= */ false,
                            /* revoked */ false,
                            /* timeApprovedMs= */ 0,
                            /* lastTimeConnectedMs= */ 0,
                            /* systemDataSyncFlags= */ -1);
            mAssociationStore.addAssociation(info);
        }
        // huazhi.su add for test for test doze white list

        final List<AssociationInfo> associationsForPackage =
                mAssociationStore.getAssociationsForPackage(userId, packageName);
        for (AssociationInfo association : associationsForPackage) {
            Log.i(TAG, "onPackageModified() association:" + association);
            updateSpecialAccessPermissionForAssociatedPackage(association);
        }

        mCompanionAppController.onPackagesChanged(userId);
    }

复现步骤: 

复现步骤:
// 禁用组件
adb shell pm disable com.tencent.mm/androidx.work.impl.background.systemjob.SystemJobService
// 恢复组件
adb shell pm enable com.tencent.mm/androidx.work.impl.background.systemjob.SystemJobService
 
 
移除RUN_IN_BACKGROUND权限
cmd appops set com.tencent.mm RUN_IN_BACKGROUND ignore

恢复RUN_IN_BACKGROUND权限
cmd appops set com.tencent.mm RUN_IN_BACKGROUND allow

运行堆栈

2024-08-08 14:09:27.132  2152-2199  CDM_Compan...gerService system_process                       I  onPackageModified() u0/com.tencent.mm
2024-08-08 14:09:27.135  2152-2199  CDM_Compan...gerService system_process                       I  updateSpecialAccessPermissionForAssociatedPackage pkg=com.tencent.mm,callingPid=2152,myPid=2152
2024-08-08 14:09:27.135  2152-2199  CDM_Compan...gerService system_process                       W  com.tencent.mm updateSpecialAccessPermissionAsSystem.
2024-08-08 14:09:27.140  2152-2199  CDM_Compan...gerService system_process                       I  onPackageModified() association:Association{mId=10888, mUserId=0, mPackageName='com.tencent.mm', mDeviceMacAddress=aa:bb:cc:dd:ff:ee, mDisplayName='displayName_test', mDeviceProfile='deviceProfile_test', mSelfManaged=false, mAssociatedDevice=null, mNotifyOnDeviceNearby=false, mRevoked=false, mTimeApprovedMs=Thu Jan 01 08:00:00 GMT+08:00 1970, mLastTimeConnectedMs=Thu Jan 01 08:00:00 GMT+08:00 1970, mSystemDataSyncFlags=-1}
2024-08-08 14:09:27.140  2152-2199  CDM_Compan...gerService system_process                       I  updateSpecialAccessPermissionForAssociatedPackage pkg=com.tencent.mm,callingPid=2152,myPid=2152
2024-08-08 14:09:27.141  2152-2199  CDM_Compan...gerService system_process                       W  com.tencent.mm updateSpecialAccessPermissionAsSystem.

2024-08-08 14:09:27.137  2152-2199  DeviceIdleController    system_process                       I  removePowerSaveWhitelistApp pkg=com.tencent.mm,callingPid=2152,myPid=2152
2024-08-08 14:09:27.140  2152-2199  DeviceIdle...lerSkyImpl system_process                       D  removePowerSaveWhitelistAppEvent:pkgName=com.tencent.mm,callerPid:2152,callerUid:1000,callerProcessName:not found,strackTrace:com.android.server.DeviceIdleController$BinderService.removePowerSaveWhitelistApp:2076 android.os.PowerExemptionManager.removeFromPermanentAllowList:601 android.os.PowerWhitelistManager.removeFromWhitelist:445 com.android.server.companion.CompanionDeviceManagerService.updateSpecialAccessPermissionAsSystem:1278 com.android.server.companion.CompanionDeviceManagerService.lambda$updateSpecialAccessPermissionForAssociatedPackage$6:1263 com.android.server.companion.CompanionDeviceManagerService.$r8$lambda$tlRMCjgVf49EEwSP3re3BN5N6Cs:0 com.android.server.companion.CompanionDeviceManagerService$$ExternalSyntheticLambda1.runOrThrow:0 android.os.Binder.withCleanCallingIdentity:437 com.android.server.companion.CompanionDeviceManagerService.updateSpecialAccessPermissionForAssociatedPackage:1263 com.android.server.companion.CompanionDeviceManagerService.onPackageModifiedInternal:548 ,reason:appSettingsEvent:pid=2152,uid=1000,callerProcessName:not found
2024-08-08 14:09:27.140  2152-2199  DeviceIdleController    system_process                       I  removePowerSaveWhitelistApp return for isDefaulWhitelistApp
2024-08-08 14:09:27.141  2152-2199  DeviceIdleController    system_process                       I  removePowerSaveWhitelistApp pkg=com.tencent.mm,callingPid=2152,myPid=2152
2024-08-08 14:09:27.152  2152-2199  DeviceIdle...lerSkyImpl system_process                       D  removePowerSaveWhitelistAppEvent:pkgName=com.tencent.mm,callerPid:2152,callerUid:1000,callerProcessName:not found,strackTrace:com.android.server.DeviceIdleController$BinderService.removePowerSaveWhitelistApp:2076 android.os.PowerExemptionManager.removeF

4.Setting界面手动移除

调用接口:

PowerAllowlistBackend:removeApp

IDeviceIdleController:removePowerSaveWhitelistApp

DeviceIdleController:removePowerSaveWhitelistAppInternal

日志: 

日志:
07-25 13:57:56.450  2084 17675 I wm_create_activity: [0,2731207,1116,com.android.settings/.applications.InstalledAppDetails,android.settings.APPLICATION_DETAILS_SETTINGS,NULL,package:,272662528]
07-25 13:57:59.507  4052  4052 D BatteryOptimizeUtils: refresh com.tencent.mm state, allowlisted = false, mode = 0
DeviceIdleController: removePowerSaveWhitelistApp pkg=com.tencent.mm,callingPid=4578,myPid=2084
2024-07-25 13:59:49.497 power_m_doze_white_list_abnormal,pkg_name:com.tencent.mm,caller_pid:2084,caller_uid:1000,caller_process_name:not found,caller_strack_trace:com.android.server.DeviceIdleController.removePowerSaveWhitelistAppInternal:2875 com.android.server.DeviceIdleController$BinderService.removePowerSaveWhitelistApp:2080 android.os.IDeviceIdleController$Stub.onTransact:288 android.os.Binder.execTransactInternal:1345 android.os.Binder.execTransact:1276 <bottom of call stack> <bottom of call stack> <bottom of call stack> <bottom of call stack> <bottom of call stack> ,reason:appSettingsEvent:pid=2084,uid=1000,callerProcessName:not found


例如settings 中删除doze白名单,验证是正确的, 堆栈可以调查谁删除了doze白名单
DeviceIdleController: removePowerSaveWhitelistApp pkg=com.tencent.mm,callingPid=4578,myPid=2084
 
comm:ndroid.settings, pid:4578,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值