DeviceOwner VS DeviceAdmin
DeviceOwner, 设备所有者,Android5.0引入。同样的,DeviceOwner涵盖了所有DeviceAdmin用户的管理能力,是一类特殊的设备管理员,具有在设备上创建和移除辅助用户以及配置全局设置的额外能力。
DeviceOwner完善了行业用户的MDM(Mobile Device Manager)行业管理能力,主要能力如下:
设置网络时间同步, 设置后无法从Settings取消
用户管理, 创建用户、删除用户等
管理账号系统
设置Http代理
禁止状态栏
通知等待更新
禁止卸载应用
复用系统APP
获取wifi地址
android:name=
".DPMTestReceiver"
android:description=
"@string/app_name"
android:label=
"@string/app_name"
android:permission=
"android.permission.BIND_DEVICE_ADMIN"
>
<meta-data
android:name=
"android.app.device_admin"
android:resource=
"@xml/device_admin"
/>
<intent-filter>
<action
android:name=
"android.app.action.DEVICE_ADMIN_ENABLED"
/>
</intent-filter>
</receiver>
DPMTestReceiver
public
class
DPMTestReceiver
extends
DeviceAdminReceiver
{
private
static
final
String
TAG
=
"DPMTestReceiver"
;
@Override
public
void
onEnabled
(
Context
context
,
Intent
intent
)
{
Log
.
d
(
TAG
,
"onEnabled: "
+
intent
);
@Override
public
void
onDisabled
(
Context
context
,
Intent
intent
)
{
Log
.
d
(
TAG
,
"onDisabled: "
+
intent
);
MainActivity
public
class
MainActivity
extends
Activity
{
private
static
final
String
TAG
=
"LXG"
;
private
DevicePolicyManager
mDPM
;
private
ComponentName
mCN
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_main
);
mDPM
=
(
DevicePolicyManager
)
getSystemService
(
Context
.
DEVICE_POLICY_SERVICE
);
mCN
=
new
ComponentName
(
this
,
DPMTestReceiver
.
class
);
mLockedTaskPackages
.
add
(
"com.android.settings"
);
public
void
onClick
(
View
v
)
{
switch
(
v
.
getId
())
{
case
R
.
id
.
active_device_owner
:
enableDeviceManager
();
break
;
case
R
.
id
.
remove_device_owner
:
disableDeviceManager
();
break
;
default
:
* 激活设备管理器
public
void
enableDeviceManager
()
{
if
(!
mDPM
.
isAdminActive
(
mCN
))
{
Intent
intent
=
new
Intent
(
DevicePolicyManager
.
ACTION_ADD_DEVICE_ADMIN
);
intent
.
putExtra
(
DevicePolicyManager
.
EXTRA_DEVICE_ADMIN
,
mCN
);
intent
.
putExtra
(
DevicePolicyManager
.
EXTRA_ADD_EXPLANATION
,
"请求激活"
);
startActivity
(
intent
);
}
else
{
Toast
.
makeText
(
this
,
"设备已经激活,请勿重复激活"
,
Toast
.
LENGTH_SHORT
).
show
();
* 取消激活设备管理器
public
void
disableDeviceManager
()
{
mDPM
.
removeActiveAdmin
(
mCN
);
public
void
wipeData
(
int
flags
)
{
if
(
mDPM
!=
null
)
{
try
{
mDPM
.
wipeData
(
flags
);
}
catch
(
SecurityException
|
IllegalArgumentException
e
)
{
e
.
printStackTrace
();
Profile Owner
ProfileOwner 译为配置文件所有者,在Android5.0系统推出。ProfileOwner涵盖了所有DeviceAdmin用户的管理能力。Google为了细化行业领域的管理而推出了这一组API,也被称为Android for work,旨在让用户在体验上可以轻松的兼顾生活和工作,可以将你的个人信息和工作信息等进行分类,随时查看
具体功能如下
隐藏应用,可停用制定应用并且不再界面显示,除非调用相应API恢复可用,否则该应用永远无法运行。可以用来开发应用黑白名单功能。
禁止卸载应用,被设置为禁止卸载的应用将成为受保护应用,无法被用户卸载,除非取消保护。
复用系统APP
修改系统设置
修改用户图标
修改权限申请的策略
限制指定应用的某些功能
允许辅助服务
允许输入法服务
禁止蓝牙访问联系人
MainActivity
public
void
setProfileOwner
()
{
if
(
mDPM
!=
null
)
{
try
{
if
(
mDPM
.
isAdminActive
(
mAdminCN
))
{
if
(
mDPM
.
isProfileOwnerApp
(
getPackageName
()))
{
Toast
.
makeText
(
this
,
"配置管理已经激活"
,
Toast
.
LENGTH_SHORT
).
show
();
}
else
{
mDPM
.
setProfileOwner
(
mAdminCN
,
DEVICE_POLICY_TEST
,
UserHandle
.
myUserId
());
}
else
{
Toast
.
makeText
(
this
,
"请先激活设备管理器"
,
Toast
.
LENGTH_SHORT
).
show
();
}
catch
(
SecurityException
|
IllegalArgumentException
e
)
{
e
.
printStackTrace
();
public
void
clearProfileOwner
()
{
if
(
mDPM
!=
null
)
{
try
{
if
(
mDPM
.
isProfileOwnerApp
(
getPackageName
()))
{
mDPM
.
clearProfileOwner
(
mAdminCN
);
}
else
{
Toast
.
makeText
(
this
,
"配置管理已经清除"
,
Toast
.
LENGTH_SHORT
).
show
();
}
catch
(
SecurityException
|
IllegalArgumentException
e
)
{
e
.
printStackTrace
();
DevicePolicyManager
@SystemService
(
Context
.
DEVICE_POLICY_SERVICE
)
@RequiresFeature
(
PackageManager
.
FEATURE_DEVICE_ADMIN
)
public
class
DevicePolicyManager
{
* Return a list of all currently active device administrators' component
* names. If there are no administrators {@code null} may be
* returned.
public
@Nullable
List
<
ComponentName
>
getActiveAdmins
()
{
throwIfParentInstance
(
"getActiveAdmins"
);
return
getActiveAdminsAsUser
(
myUserId
());
* Returns the device owner package name, only if it's running on the calling user.
* <p>Bundled components should use {@code getDeviceOwnerComponentOnCallingUser()} for clarity.
* @hide
@SystemApi
@RequiresPermission
(
android
.
Manifest
.
permission
.
MANAGE_USERS
)
public
@Nullable
String
getDeviceOwner
()
{
throwIfParentInstance
(
"getDeviceOwner"
);
final
ComponentName
name
=
getDeviceOwnerComponentOnCallingUser
();
return
name
!=
null
?
name
.
getPackageName
()
:
null
;
@SystemApi
@RequiresPermission
(
android
.
Manifest
.
permission
.
MANAGE_USERS
)
public
boolean
isManagedKiosk
()
{
throwIfParentInstance
(
"isManagedKiosk"
);
if
(
mService
!=
null
)
{
try
{
return
mService
.
isManagedKiosk
();
}
catch
(
RemoteException
e
)
{
throw
e
.
rethrowFromSystemServer
();
return
false
;
* @hide
@UnsupportedAppUsage
public
void
setActiveAdmin
(
@NonNull
ComponentName
policyReceiver
,
boolean
refreshing
)
{
setActiveAdmin
(
policyReceiver
,
refreshing
,
myUserId
());
* @hide
* Sets the given package as the device owner.
* Same as {@link #setDeviceOwner(ComponentName, String)} but without setting a device owner name.
* @param who the component name to be registered as device owner.
* @return whether the package was successfully registered as the device owner.
* @throws IllegalArgumentException if the package name is null or invalid
* @throws IllegalStateException If the preconditions mentioned are not met.
public
boolean
setDeviceOwner
(
ComponentName
who
)
{
return
setDeviceOwner
(
who
,
null
);
public
boolean
setProfileOwner
(
@NonNull
ComponentName
admin
,
@Deprecated
String
ownerName
,
int
userHandle
)
throws
IllegalArgumentException
{
if
(
mService
!=
null
)
{
try
{
if
(
ownerName
==
null
)
{
ownerName
=
""
;
return
mService
.
setProfileOwner
(
admin
,
ownerName
,
userHandle
);
}
catch
(
RemoteException
re
)
{
throw
re
.
rethrowFromSystemServer
();
return
false
;
data/system/device_policies.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<policies
setup-complete=
"true"
provisioning-state=
"3"
>
<admin
name=
"com.example.android.deviceowner/com.example.android.deviceowner.DeviceOwnerReceiver"
>
<policies
flags=
"479"
/>
<strong-auth-unlock-timeout
value=
"0"
/>
<cross-profile-calendar-packages
/>
<cross-profile-packages
/>
</admin>
<lock-task-features
value=
"16"
/>
</policies>
data/system/device_owner_2.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<device-owner
package=
"com.example.android.deviceowner"
name=
""
component=
"com.example.android.deviceowner/com.example.android.deviceowner.DeviceOwnerReceiver"
userRestrictionsMigrated=
"true"
isPoOrganizationOwnedDevice=
"true"
/>
<device-owner-context
userId=
"0"
/>
</root>
IDevicePolicyManager
interface
IDevicePolicyManager
{
// 设置密码质量
void
setPasswordQuality
(
in
ComponentName
who
,
int
quality
,
boolean
parent
);
// 设置密码长度
void
setPasswordMinimumLength
(
in
ComponentName
who
,
int
length
,
boolean
parent
);
// 设置密码大小写,字母,数字,符号
void
setPasswordMinimumUpperCase
(
in
ComponentName
who
,
int
length
,
boolean
parent
);
void
setPasswordMinimumLowerCase
(
in
ComponentName
who
,
int
length
,
boolean
parent
);
void
setPasswordMinimumLetters
(
in
ComponentName
who
,
int
length
,
boolean
parent
);
void
setPasswordMinimumNumeric
(
in
ComponentName
who
,
int
length
,
boolean
parent
);
void
setPasswordMinimumSymbols
(
in
ComponentName
who
,
int
length
,
boolean
parent
);
void
setPasswordMinimumNonLetter
(
in
ComponentName
who
,
int
length
,
boolean
parent
);
PasswordMetrics
getPasswordMinimumMetrics
(
int
userHandle
);
void
setPasswordHistoryLength
(
in
ComponentName
who
,
int
length
,
boolean
parent
);
void
setPasswordExpirationTimeout
(
in
ComponentName
who
,
long
expiration
,
boolean
parent
);
long
getPasswordExpiration
(
in
ComponentName
who
,
int
userHandle
,
boolean
parent
);
boolean
isActivePasswordSufficient
(
int
userHandle
,
boolean
parent
);
boolean
isProfileActivePasswordSufficientForParent
(
int
userHandle
);
boolean
isPasswordSufficientAfterProfileUnification
(
int
userHandle
,
int
profileUser
);
int
getPasswordComplexity
(
boolean
parent
);
boolean
isUsingUnifiedPassword
(
in
ComponentName
admin
);
int
getCurrentFailedPasswordAttempts
(
int
userHandle
,
boolean
parent
);
int
getProfileWithMinimumFailedPasswordsForWipe
(
int
userHandle
,
boolean
parent
);
void
setMaximumFailedPasswordsForWipe
(
in
ComponentName
admin
,
int
num
,
boolean
parent
);
// 重置密码
boolean
resetPassword
(
String
password
,
int
flags
);
// 设置设备可以使用的时间
void
setMaximumTimeToLock
(
in
ComponentName
who
,
long
timeMs
,
boolean
parent
);
long
getMaximumTimeToLock
(
in
ComponentName
who
,
int
userHandle
,
boolean
parent
);
// 设置超时时间,超时后需要身份验证才能继续使用
void
setRequiredStrongAuthTimeout
(
in
ComponentName
who
,
long
timeMs
,
boolean
parent
);
long
getRequiredStrongAuthTimeout
(
in
ComponentName
who
,
int
userId
,
boolean
parent
);
// 立即锁定
void
lockNow
(
int
flags
,
boolean
parent
);
// 清除数据
void
wipeDataWithReason
(
int
flags
,
String
wipeReasonForUser
,
boolean
parent
);
// 设置恢复出厂设置的保护策略
void
setFactoryResetProtectionPolicy
(
in
ComponentName
who
,
in
FactoryResetProtectionPolicy
policy
);
FactoryResetProtectionPolicy
getFactoryResetProtectionPolicy
(
in
ComponentName
who
);
boolean
isFactoryResetProtectionPolicySupported
();
// 设置全局代理
ComponentName
setGlobalProxy
(
in
ComponentName
admin
,
String
proxySpec
,
String
exclusionList
);
ComponentName
getGlobalProxyAdmin
(
int
userHandle
);
void
setRecommendedGlobalProxy
(
in
ComponentName
admin
,
in
ProxyInfo
proxyInfo
);
// 设置存储加密
int
setStorageEncryption
(
in
ComponentName
who
,
boolean
encrypt
);
boolean
getStorageEncryption
(
in
ComponentName
who
,
int
userHandle
);
int
getStorageEncryptionStatus
(
in
String
callerPackage
,
int
userHandle
);
// 请求bugreport
boolean
requestBugreport
(
in
ComponentName
who
);
// 禁止使用摄像头
void
setCameraDisabled
(
in
ComponentName
who
,
boolean
disabled
,
boolean
parent
);
boolean
getCameraDisabled
(
in
ComponentName
who
,
int
userHandle
,
boolean
parent
);
// 禁止使用屏幕截图
void
setScreenCaptureDisabled
(
in
ComponentName
who
,
boolean
disabled
,
boolean
parent
);
boolean
getScreenCaptureDisabled
(
in
ComponentName
who
,
int
userHandle
,
boolean
parent
);
// 禁止在锁屏上显示指定内容
void
setKeyguardDisabledFeatures
(
in
ComponentName
who
,
int
which
,
boolean
parent
);
int
getKeyguardDisabledFeatures
(
in
ComponentName
who
,
int
userHandle
,
boolean
parent
);
// 激活设备管理器
void
setActiveAdmin
(
in
ComponentName
policyReceiver
,
boolean
refreshing
,
int
userHandle
);
boolean
isAdminActive
(
in
ComponentName
policyReceiver
,
int
userHandle
);
List
<
ComponentName
>
getActiveAdmins
(
int
userHandle
);
@UnsupportedAppUsage
// 应用是否可以被卸载
boolean
packageHasActiveAdmins
(
String
packageName
,
int
userHandle
);
void
getRemoveWarning
(
in
ComponentName
policyReceiver
,
in
RemoteCallback
result
,
int
userHandle
);
// 移除激活的设备管理器
void
removeActiveAdmin
(
in
ComponentName
policyReceiver
,
int
userHandle
);
void
forceRemoveActiveAdmin
(
in
ComponentName
policyReceiver
,
int
userHandle
);
// 检查是否已向管理员授予策略
boolean
hasGrantedPolicy
(
in
ComponentName
policyReceiver
,
int
usesPolicy
,
int
userHandle
);
// 报告密码变更
void
reportPasswordChanged
(
int
userId
);
// 报告错误的密码尝试
void
reportFailedPasswordAttempt
(
int
userHandle
);
// 报告成功的密码尝试
void
reportSuccessfulPasswordAttempt
(
int
userHandle
);
// 报告失败的生物密码尝试
void
reportFailedBiometricAttempt
(
int
userHandle
);
void
reportSuccessfulBiometricAttempt
(
int
userHandle
);
// 报告锁屏解锁
void
reportKeyguardDismissed
(
int
userHandle
);
// 报告锁屏锁定
void
reportKeyguardSecured
(
int
userHandle
);
// 设置设备拥有者
boolean
setDeviceOwner
(
in
ComponentName
who
,
String
ownerName
,
int
userId
);
ComponentName
getDeviceOwnerComponent
(
boolean
callingUserOnly
);
boolean
hasDeviceOwner
();
String
getDeviceOwnerName
();
// 清除设备owner
void
clearDeviceOwner
(
String
packageName
);
int
getDeviceOwnerUserId
();
// 设置配置信息拥有者
boolean
setProfileOwner
(
in
ComponentName
who
,
String
ownerName
,
int
userHandle
);
ComponentName
getProfileOwnerAsUser
(
int
userHandle
);
ComponentName
getProfileOwner
(
int
userHandle
);
ComponentName
getProfileOwnerOrDeviceOwnerSupervisionComponent
(
in
UserHandle
userHandle
);
String
getProfileOwnerName
(
int
userHandle
);
// 启用配置
void
setProfileEnabled
(
in
ComponentName
who
);
void
setProfileName
(
in
ComponentName
who
,
String
profileName
);
void
clearProfileOwner
(
in
ComponentName
who
);
// 是否开机向导已经完成
boolean
hasUserSetupCompleted
();
// 设备是否已经配置为具有托管配置文件的组织专用设备
boolean
isOrganizationOwnedDeviceWithManagedProfile
();
// 是否有读取设备标识符的权限
boolean
checkDeviceIdentifierAccess
(
in
String
packageName
,
int
pid
,
int
uid
);
// 设置在锁屏上显示的设备所有者信息
void
setDeviceOwnerLockScreenInfo
(
in
ComponentName
who
,
CharSequence
deviceOwnerInfo
);
CharSequence
getDeviceOwnerLockScreenInfo
();
// 禁用某个软件包
String
[]
setPackagesSuspended
(
in
ComponentName
admin
,
in
String
callerPackage
,
in
String
[]
packageNames
,
boolean
suspended
);
boolean
isPackageSuspended
(
in
ComponentName
admin
,
in
String
callerPackage
,
String
packageName
);
// 安装CA证书
boolean
installCaCert
(
in
ComponentName
admin
,
String
callerPackage
,
in
byte
[]
certBuffer
);
void
uninstallCaCerts
(
in
ComponentName
admin
,
String
callerPackage
,
in
String
[]
aliases
);
void
enforceCanManageCaCerts
(
in
ComponentName
admin
,
in
String
callerPackage
);
boolean
approveCaCert
(
in
String
alias
,
int
userHandle
,
boolean
approval
);
boolean
isCaCertApproved
(
in
String
alias
,
int
userHandle
);
boolean
installKeyPair
(
in
ComponentName
who
,
in
String
callerPackage
,
in
byte
[]
privKeyBuffer
,
in
byte
[]
certBuffer
,
in
byte
[]
certChainBuffer
,
String
alias
,
boolean
requestAccess
,
boolean
isUserSelectable
);
boolean
removeKeyPair
(
in
ComponentName
who
,
in
String
callerPackage
,
String
alias
);
boolean
generateKeyPair
(
in
ComponentName
who
,
in
String
callerPackage
,
in
String
algorithm
,
in
ParcelableKeyGenParameterSpec
keySpec
,
in
int
idAttestationFlags
,
out
KeymasterCertificateChain
attestationChain
);
boolean
setKeyPairCertificate
(
in
ComponentName
who
,
in
String
callerPackage
,
in
String
alias
,
in
byte
[]
certBuffer
,
in
byte
[]
certChainBuffer
,
boolean
isUserSelectable
);
void
choosePrivateKeyAlias
(
int
uid
,
in
Uri
uri
,
in
String
alias
,
IBinder
aliasCallback
);
// 向其他应用授予特权API的访问权限
void
setDelegatedScopes
(
in
ComponentName
who
,
in
String
delegatePackage
,
in
List
<
String
>
scopes
);
// 获取向某个应用授权的访问权限列表
List
<
String
>
getDelegatedScopes
(
in
ComponentName
who
,
String
delegatePackage
);
// 获取已经授予某个权限的应用列表
List
<
String
>
getDelegatePackages
(
in
ComponentName
who
,
String
scope
);
// 将需要签名权限授予三方应用
void
setCertInstallerPackage
(
in
ComponentName
who
,
String
installerPackage
);
String
getCertInstallerPackage
(
in
ComponentName
who
);
// 指定一组在VPN时能够直接访问网络的应用程序
boolean
setAlwaysOnVpnPackage
(
in
ComponentName
who
,
String
vpnPackage
,
boolean
lockdown
,
in
List
<
String
>
lockdownWhitelist
);
String
getAlwaysOnVpnPackage
(
in
ComponentName
who
);
String
getAlwaysOnVpnPackageForUser
(
int
userHandle
);
boolean
isAlwaysOnVpnLockdownEnabled
(
in
ComponentName
who
);
boolean
isAlwaysOnVpnLockdownEnabledForUser
(
int
userHandle
);
List
<
String
>
getAlwaysOnVpnLockdownWhitelist
(
in
ComponentName
who
);
// 设置默认首选项(默认桌面,电话,短信等)
void
addPersistentPreferredActivity
(
in
ComponentName
admin
,
in
IntentFilter
filter
,
in
ComponentName
activity
);
void
clearPackagePersistentPreferredActivities
(
in
ComponentName
admin
,
String
packageName
);
// 设置默认短信
void
setDefaultSmsApplication
(
in
ComponentName
admin
,
String
packageName
,
boolean
parent
);
// 给应用程序设置权限
void
setApplicationRestrictions
(
in
ComponentName
who
,
in
String
callerPackage
,
in
String
packageName
,
in
Bundle
settings
);
Bundle
getApplicationRestrictions
(
in
ComponentName
who
,
in
String
callerPackage
,
in
String
packageName
);
// 给应用授予管理软件包的权限
boolean
setApplicationRestrictionsManagingPackage
(
in
ComponentName
admin
,
in
String
packageName
);
String
getApplicationRestrictionsManagingPackage
(
in
ComponentName
admin
);
boolean
isCallerApplicationRestrictionsManagingPackage
(
in
String
callerPackage
);
// 给Provider设置权限
void
setRestrictionsProvider
(
in
ComponentName
who
,
in
ComponentName
provider
);
ComponentName
getRestrictionsProvider
(
int
userHandle
);
// 给用户设置权限
void
setUserRestriction
(
in
ComponentName
who
,
in
String
key
,
boolean
enable
,
boolean
parent
);
Bundle
getUserRestrictions
(
in
ComponentName
who
,
boolean
parent
);
void
addCrossProfileIntentFilter
(
in
ComponentName
admin
,
in
IntentFilter
filter
,
int
flags
);
void
clearCrossProfileIntentFilters
(
in
ComponentName
admin
);
// 无障碍服务
boolean
setPermittedAccessibilityServices
(
in
ComponentName
admin
,
in
List
packageList
);
List
getPermittedAccessibilityServices
(
in
ComponentName
admin
);
List
getPermittedAccessibilityServicesForUser
(
int
userId
);
boolean
isAccessibilityServicePermittedByAdmin
(
in
ComponentName
admin
,
String
packageName
,
int
userId
);
// 设置被允许的输入法
boolean
setPermittedInputMethods
(
in
ComponentName
admin
,
in
List
packageList
);
List
getPermittedInputMethods
(
in
ComponentName
admin
);
List
getPermittedInputMethodsForCurrentUser
();
boolean
isInputMethodPermittedByAdmin
(
in
ComponentName
admin
,
String
packageName
,
int
userId
);
// 设置被允许的通知监听
boolean
setPermittedCrossProfileNotificationListeners
(
in
ComponentName
admin
,
in
List
<
String
>
packageList
);
List
<
String
>
getPermittedCrossProfileNotificationListeners
(
in
ComponentName
admin
);
boolean
isNotificationListenerServicePermitted
(
in
String
packageName
,
int
userId
);
// Called by any app to display a support dialog when a feature was disabled by an admin.
// This returns an intent that can be used with {@link Context#startActivity(Intent)} to display the dialog.
// It will tell the user that the feature indicated by {@code restriction}was disabled by an admin, and include a link for more information.
Intent
createAdminSupportIntent
(
in
String
restriction
);
// 隐藏某个应用,将保留数据setApplicationHiddenSettingAsUser
boolean
setApplicationHidden
(
in
ComponentName
admin
,
in
String
callerPackage
,
in
String
packageName
,
boolean
hidden
,
boolean
parent
);
boolean
isApplicationHidden
(
in
ComponentName
admin
,
in
String
callerPackage
,
in
String
packageName
,
boolean
parent
);
// 创建和管理用户
UserHandle
createAndManageUser
(
in
ComponentName
who
,
in
String
name
,
in
ComponentName
profileOwner
,
in
PersistableBundle
adminExtras
,
in
int
flags
);
boolean
removeUser
(
in
ComponentName
who
,
in
UserHandle
userHandle
);
boolean
switchUser
(
in
ComponentName
who
,
in
UserHandle
userHandle
);
int
startUserInBackground
(
in
ComponentName
who
,
in
UserHandle
userHandle
);
int
stopUser
(
in
ComponentName
who
,
in
UserHandle
userHandle
);
int
logoutUser
(
in
ComponentName
who
);
List
<
UserHandle
>
getSecondaryUsers
(
in
ComponentName
who
);
// 启用系统应用
void
enableSystemApp
(
in
ComponentName
admin
,
in
String
callerPackage
,
in
String
packageName
);
int
enableSystemAppWithIntent
(
in
ComponentName
admin
,
in
String
callerPackage
,
in
Intent
intent
);
// 安装已经存在的包
boolean
installExistingPackage
(
in
ComponentName
admin
,
in
String
callerPackage
,
in
String
packageName
);
// 禁用账户管理
void
setAccountManagementDisabled
(
in
ComponentName
who
,
in
String
accountType
,
in
boolean
disabled
,
in
boolean
parent
);
String
[]
getAccountTypesWithManagementDisabled
();
String
[]
getAccountTypesWithManagementDisabledAsUser
(
int
userId
,
in
boolean
parent
);
void
setSecondaryLockscreenEnabled
(
in
ComponentName
who
,
boolean
enabled
);
boolean
isSecondaryLockscreenEnabled
(
in
UserHandle
userHandle
);
// 设置可以进入任务锁定的包
void
setLockTaskPackages
(
in
ComponentName
who
,
in
String
[]
packages
);
String
[]
getLockTaskPackages
(
in
ComponentName
who
);
boolean
isLockTaskPermitted
(
in
String
pkg
);
void
setLockTaskFeatures
(
in
ComponentName
who
,
int
flags
);
int
getLockTaskFeatures
(
in
ComponentName
who
);
// 设置系统数据库
void
setGlobalSetting
(
in
ComponentName
who
,
in
String
setting
,
in
String
value
);
void
setSystemSetting
(
in
ComponentName
who
,
in
String
setting
,
in
String
value
);
void
setSecureSetting
(
in
ComponentName
who
,
in
String
setting
,
in
String
value
);
// 锁定网络配置
void
setConfiguredNetworksLockdownState
(
in
ComponentName
who
,
boolean
lockdown
);
boolean
hasLockdownAdminConfiguredNetworks
(
in
ComponentName
who
);
// 启用位置信息
void
setLocationEnabled
(
in
ComponentName
who
,
boolean
locationEnabled
);
// 设置时间和时区
boolean
setTime
(
in
ComponentName
who
,
long
millis
);
boolean
setTimeZone
(
in
ComponentName
who
,
String
timeZone
);
// 设置静音模式
void
setMasterVolumeMuted
(
in
ComponentName
admin
,
boolean
on
);
boolean
isMasterVolumeMuted
(
in
ComponentName
admin
);
void
notifyLockTaskModeChanged
(
boolean
isEnabled
,
String
pkg
,
int
userId
);
// 设置是否允许卸载软件包
void
setUninstallBlocked
(
in
ComponentName
admin
,
in
String
callerPackage
,
in
String
packageName
,
boolean
uninstallBlocked
);
boolean
isUninstallBlocked
(
in
ComponentName
admin
,
in
String
packageName
);
void
setCrossProfileCallerIdDisabled
(
in
ComponentName
who
,
boolean
disabled
);
boolean
getCrossProfileCallerIdDisabled
(
in
ComponentName
who
);
boolean
getCrossProfileCallerIdDisabledForUser
(
int
userId
);
void
setCrossProfileContactsSearchDisabled
(
in
ComponentName
who
,
boolean
disabled
);
boolean
getCrossProfileContactsSearchDisabled
(
in
ComponentName
who
);
boolean
getCrossProfileContactsSearchDisabledForUser
(
int
userId
);
void
startManagedQuickContact
(
String
lookupKey
,
long
contactId
,
boolean
isContactIdIgnored
,
long
directoryId
,
in
Intent
originalIntent
);
void
setBluetoothContactSharingDisabled
(
in
ComponentName
who
,
boolean
disabled
);
boolean
getBluetoothContactSharingDisabled
(
in
ComponentName
who
);
boolean
getBluetoothContactSharingDisabledForUser
(
int
userId
);
void
setTrustAgentConfiguration
(
in
ComponentName
admin
,
in
ComponentName
agent
,
in
PersistableBundle
args
,
boolean
parent
);
List
<
PersistableBundle
>
getTrustAgentConfiguration
(
in
ComponentName
admin
,
in
ComponentName
agent
,
int
userId
,
boolean
parent
);
boolean
addCrossProfileWidgetProvider
(
in
ComponentName
admin
,
String
packageName
);
boolean
removeCrossProfileWidgetProvider
(
in
ComponentName
admin
,
String
packageName
);
List
<
String
>
getCrossProfileWidgetProviders
(
in
ComponentName
admin
);
void
setAutoTimeRequired
(
in
ComponentName
who
,
boolean
required
);
boolean
getAutoTimeRequired
();
void
setAutoTimeEnabled
(
in
ComponentName
who
,
boolean
enabled
);
boolean
getAutoTimeEnabled
(
in
ComponentName
who
);
void
setAutoTimeZoneEnabled
(
in
ComponentName
who
,
boolean
enabled
);
boolean
getAutoTimeZoneEnabled
(
in
ComponentName
who
);
void
setForceEphemeralUsers
(
in
ComponentName
who
,
boolean
forceEpehemeralUsers
);
boolean
getForceEphemeralUsers
(
in
ComponentName
who
);
boolean
isRemovingAdmin
(
in
ComponentName
adminReceiver
,
int
userHandle
);
void
setUserIcon
(
in
ComponentName
admin
,
in
Bitmap
icon
);
void
setSystemUpdatePolicy
(
in
ComponentName
who
,
in
SystemUpdatePolicy
policy
);
SystemUpdatePolicy
getSystemUpdatePolicy
();
void
clearSystemUpdatePolicyFreezePeriodRecord
();
// 禁用锁屏状态栏
boolean
setKeyguardDisabled
(
in
ComponentName
admin
,
boolean
disabled
);
boolean
setStatusBarDisabled
(
in
ComponentName
who
,
boolean
disabled
);
boolean
getDoNotAskCredentialsOnBoot
();
void
notifyPendingSystemUpdate
(
in
SystemUpdateInfo
info
);
SystemUpdateInfo
getPendingSystemUpdate
(
in
ComponentName
admin
);
void
setPermissionPolicy
(
in
ComponentName
admin
,
in
String
callerPackage
,
int
policy
);
int
getPermissionPolicy
(
in
ComponentName
admin
);
void
setPermissionGrantState
(
in
ComponentName
admin
,
in
String
callerPackage
,
String
packageName
,
String
permission
,
int
grantState
,
in
RemoteCallback
resultReceiver
);
int
getPermissionGrantState
(
in
ComponentName
admin
,
in
String
callerPackage
,
String
packageName
,
String
permission
);
boolean
isProvisioningAllowed
(
String
action
,
String
packageName
);
int
checkProvisioningPreCondition
(
String
action
,
String
packageName
);
void
setKeepUninstalledPackages
(
in
ComponentName
admin
,
in
String
callerPackage
,
in
List
<
String
>
packageList
);
List
<
String
>
getKeepUninstalledPackages
(
in
ComponentName
admin
,
in
String
callerPackage
);
boolean
isManagedProfile
(
in
ComponentName
admin
);
boolean
isSystemOnlyUser
(
in
ComponentName
admin
);
// 获取MAC地址
String
getWifiMacAddress
(
in
ComponentName
admin
);
// 重启设备
void
reboot
(
in
ComponentName
admin
);
void
setShortSupportMessage
(
in
ComponentName
admin
,
in
CharSequence
message
);
CharSequence
getShortSupportMessage
(
in
ComponentName
admin
);
void
setLongSupportMessage
(
in
ComponentName
admin
,
in
CharSequence
message
);
CharSequence
getLongSupportMessage
(
in
ComponentName
admin
);
CharSequence
getShortSupportMessageForUser
(
in
ComponentName
admin
,
int
userHandle
);
CharSequence
getLongSupportMessageForUser
(
in
ComponentName
admin
,
int
userHandle
);
boolean
isSeparateProfileChallengeAllowed
(
int
userHandle
);
void
setOrganizationColor
(
in
ComponentName
admin
,
in
int
color
);
void
setOrganizationColorForUser
(
in
int
color
,
in
int
userId
);
int
getOrganizationColor
(
in
ComponentName
admin
);
int
getOrganizationColorForUser
(
int
userHandle
);
void
setOrganizationName
(
in
ComponentName
admin
,
in
CharSequence
title
);
CharSequence
getOrganizationName
(
in
ComponentName
admin
);
CharSequence
getDeviceOwnerOrganizationName
();
CharSequence
getOrganizationNameForUser
(
int
userHandle
);
int
getUserProvisioningState
();
void
setUserProvisioningState
(
int
state
,
int
userHandle
);
void
setAffiliationIds
(
in
ComponentName
admin
,
in
List
<
String
>
ids
);
List
<
String
>
getAffiliationIds
(
in
ComponentName
admin
);
boolean
isAffiliatedUser
();
void
setSecurityLoggingEnabled
(
in
ComponentName
admin
,
boolean
enabled
);
boolean
isSecurityLoggingEnabled
(
in
ComponentName
admin
);
ParceledListSlice
retrieveSecurityLogs
(
in
ComponentName
admin
);
ParceledListSlice
retrievePreRebootSecurityLogs
(
in
ComponentName
admin
);
long
forceNetworkLogs
();
long
forceSecurityLogs
();
boolean
isUninstallInQueue
(
String
packageName
);
void
uninstallPackageWithActiveAdmins
(
String
packageName
);
boolean
isDeviceProvisioned
();
boolean
isDeviceProvisioningConfigApplied
();
void
setDeviceProvisioningConfigApplied
();
void
forceUpdateUserSetupComplete
();
// 启用备份服务
void
setBackupServiceEnabled
(
in
ComponentName
admin
,
boolean
enabled
);
boolean
isBackupServiceEnabled
(
in
ComponentName
admin
);
void
setNetworkLoggingEnabled
(
in
ComponentName
admin
,
in
String
packageName
,
boolean
enabled
);
boolean
isNetworkLoggingEnabled
(
in
ComponentName
admin
,
in
String
packageName
);
List
<
NetworkEvent
>
retrieveNetworkLogs
(
in
ComponentName
admin
,
in
String
packageName
,
long
batchToken
);
boolean
bindDeviceAdminServiceAsUser
(
in
ComponentName
admin
,
IApplicationThread
caller
,
IBinder
token
,
in
Intent
service
,
IServiceConnection
connection
,
int
flags
,
int
targetUserId
);
List
<
UserHandle
>
getBindDeviceAdminTargetUsers
(
in
ComponentName
admin
);
boolean
isEphemeralUser
(
in
ComponentName
admin
);
long
getLastSecurityLogRetrievalTime
();
long
getLastBugReportRequestTime
();
long
getLastNetworkLogRetrievalTime
();
boolean
setResetPasswordToken
(
in
ComponentName
admin
,
in
byte
[]
token
);
boolean
clearResetPasswordToken
(
in
ComponentName
admin
);
boolean
isResetPasswordTokenActive
(
in
ComponentName
admin
);
boolean
resetPasswordWithToken
(
in
ComponentName
admin
,
String
password
,
in
byte
[]
token
,
int
flags
);
boolean
isCurrentInputMethodSetByOwner
();
StringParceledListSlice
getOwnerInstalledCaCerts
(
in
UserHandle
user
);
// 清除用户数据
void
clearApplicationUserData
(
in
ComponentName
admin
,
in
String
packageName
,
in
IPackageDataObserver
callback
);
void
setLogoutEnabled
(
in
ComponentName
admin
,
boolean
enabled
);
boolean
isLogoutEnabled
();
List
<
String
>
getDisallowedSystemApps
(
in
ComponentName
admin
,
int
userId
,
String
provisioningAction
);
void
transferOwnership
(
in
ComponentName
admin
,
in
ComponentName
target
,
in
PersistableBundle
bundle
);
PersistableBundle
getTransferOwnershipBundle
();
void
setStartUserSessionMessage
(
in
ComponentName
admin
,
in
CharSequence
startUserSessionMessage
);
void
setEndUserSessionMessage
(
in
ComponentName
admin
,
in
CharSequence
endUserSessionMessage
);
CharSequence
getStartUserSessionMessage
(
in
ComponentName
admin
);
CharSequence
getEndUserSessionMessage
(
in
ComponentName
admin
);
List
<
String
>
setMeteredDataDisabledPackages
(
in
ComponentName
admin
,
in
List
<
String
>
packageNames
);
List
<
String
>
getMeteredDataDisabledPackages
(
in
ComponentName
admin
);
int
addOverrideApn
(
in
ComponentName
admin
,
in
ApnSetting
apnSetting
);
boolean
updateOverrideApn
(
in
ComponentName
admin
,
int
apnId
,
in
ApnSetting
apnSetting
);
boolean
removeOverrideApn
(
in
ComponentName
admin
,
int
apnId
);
List
<
ApnSetting
>
getOverrideApns
(
in
ComponentName
admin
);
void
setOverrideApnsEnabled
(
in
ComponentName
admin
,
boolean
enabled
);
boolean
isOverrideApnEnabled
(
in
ComponentName
admin
);
boolean
isMeteredDataDisabledPackageForUser
(
in
ComponentName
admin
,
String
packageName
,
int
userId
);
int
setGlobalPrivateDns
(
in
ComponentName
admin
,
int
mode
,
in
String
privateDnsHost
);
int
getGlobalPrivateDnsMode
(
in
ComponentName
admin
);
String
getGlobalPrivateDnsHost
(
in
ComponentName
admin
);
void
markProfileOwnerOnOrganizationOwnedDevice
(
in
ComponentName
who
,
int
userId
);
void
installUpdateFromFile
(
in
ComponentName
admin
,
in
ParcelFileDescriptor
updateFileDescriptor
,
in
StartInstallingUpdateCallback
listener
);
void
setCrossProfileCalendarPackages
(
in
ComponentName
admin
,
in
List
<
String
>
packageNames
);
List
<
String
>
getCrossProfileCalendarPackages
(
in
ComponentName
admin
);
boolean
isPackageAllowedToAccessCalendarForUser
(
String
packageName
,
int
userHandle
);
List
<
String
>
getCrossProfileCalendarPackagesForUser
(
int
userHandle
);
void
setCrossProfilePackages
(
in
ComponentName
admin
,
in
List
<
String
>
packageNames
);
List
<
String
>
getCrossProfilePackages
(
in
ComponentName
admin
);
List
<
String
>
getAllCrossProfilePackages
();
List
<
String
>
getDefaultCrossProfilePackages
();
boolean
isManagedKiosk
();
boolean
isUnattendedManagedKiosk
();
boolean
startViewCalendarEventInManagedProfile
(
String
packageName
,
long
eventId
,
long
start
,
long
end
,
boolean
allDay
,
int
flags
);
boolean
setKeyGrantForApp
(
in
ComponentName
admin
,
String
callerPackage
,
String
alias
,
String
packageName
,
boolean
hasGrant
);
void
setUserControlDisabledPackages
(
in
ComponentName
admin
,
in
List
<
String
>
packages
);
List
<
String
>
getUserControlDisabledPackages
(
in
ComponentName
admin
);
void
setCommonCriteriaModeEnabled
(
in
ComponentName
admin
,
boolean
enabled
);
boolean
isCommonCriteriaModeEnabled
(
in
ComponentName
admin
);
int
getPersonalAppsSuspendedReasons
(
in
ComponentName
admin
);
void
setPersonalAppsSuspended
(
in
ComponentName
admin
,
boolean
suspended
);
long
getManagedProfileMaximumTimeOff
(
in
ComponentName
admin
);
void
setManagedProfileMaximumTimeOff
(
in
ComponentName
admin
,
long
timeoutMs
);
boolean
canProfileOwnerResetPasswordWhenLocked
(
in
int
userId
);
DevicePolicyManagerService
public
class
DevicePolicyManagerService
extends
BaseIDevicePolicyManager
{
* Instantiates the service.
public
DevicePolicyManagerService
(
Context
context
)
{
this
(
new
Injector
(
context
));
@VisibleForTesting
DevicePolicyManagerService
(
Injector
injector
)
{
mInjector
=
injector
;
mContext
=
Objects
.
requireNonNull
(
injector
.
mContext
);
mHandler
=
new
Handler
(
Objects
.
requireNonNull
(
injector
.
getMyLooper
()));
mConstantsObserver
=
new
DevicePolicyConstantsObserver
(
mHandler
);
mConstantsObserver
.
register
();
mConstants
=
loadConstants
();
mOwners
=
Objects
.
requireNonNull
(
injector
.
newOwners
());
mUserManager
=
Objects
.
requireNonNull
(
injector
.
getUserManager
());
mUserManagerInternal
=
Objects
.
requireNonNull
(
injector
.
getUserManagerInternal
());
mUsageStatsManagerInternal
=
Objects
.
requireNonNull
(
injector
.
getUsageStatsManagerInternal
());
mIPackageManager
=
Objects
.
requireNonNull
(
injector
.
getIPackageManager
());
mIPlatformCompat
=
Objects
.
requireNonNull
(
injector
.
getIPlatformCompat
());
mIPermissionManager
=
Objects
.
requireNonNull
(
injector
.
getIPermissionManager
());
mTelephonyManager
=
Objects
.
requireNonNull
(
injector
.
getTelephonyManager
());
mLocalService
=
new
LocalService
();
mLockPatternUtils
=
injector
.
newLockPatternUtils
();
mLockSettingsInternal
=
injector
.
getLockSettingsInternal
();
// TODO: why does SecurityLogMonitor need to be created even when mHasFeature == false?
mSecurityLogMonitor
=
new
SecurityLogMonitor
(
this
);
mHasFeature
=
mInjector
.
hasFeature
();
mIsWatch
=
mInjector
.
getPackageManager
()
.
hasSystemFeature
(
PackageManager
.
FEATURE_WATCH
);
mHasTelephonyFeature
=
mInjector
.
getPackageManager
()
.
hasSystemFeature
(
PackageManager
.
FEATURE_TELEPHONY
);
mBackgroundHandler
=
BackgroundThread
.
getHandler
();
// Needed when mHasFeature == false, because it controls the certificate warning text.
mCertificateMonitor
=
new
CertificateMonitor
(
this
,
mInjector
,
mBackgroundHandler
);
mDeviceAdminServiceController
=
new
DeviceAdminServiceController
(
this
,
mConstants
);
mOverlayPackagesProvider
=
new
OverlayPackagesProvider
(
mContext
);
mTransferOwnershipMetadataManager
=
mInjector
.
newTransferOwnershipMetadataManager
();
if
(!
mHasFeature
)
{
// Skip the rest of the initialization
mSetupContentObserver
=
null
;
return
;
IntentFilter
filter
=
new
IntentFilter
();
filter
.
addAction
(
Intent
.
ACTION_BOOT_COMPLETED
);
filter
.
addAction
(
ACTION_EXPIRED_PASSWORD_NOTIFICATION
);
filter
.
addAction
(
ACTION_TURN_PROFILE_ON_NOTIFICATION
);
filter
.
addAction
(
ACTION_PROFILE_OFF_DEADLINE
);
filter
.
addAction
(
Intent
.
ACTION_USER_ADDED
);
filter
.
addAction
(
Intent
.
ACTION_USER_REMOVED
);
filter
.
addAction
(
Intent
.
ACTION_USER_STARTED
);
filter
.
addAction
(
Intent
.
ACTION_USER_STOPPED
);
filter
.
addAction
(
Intent
.
ACTION_USER_SWITCHED
);
filter
.
addAction
(
Intent
.
ACTION_USER_UNLOCKED
);
filter
.
addAction
(
Intent
.
ACTION_MANAGED_PROFILE_UNAVAILABLE
);
filter
.
setPriority
(
IntentFilter
.
SYSTEM_HIGH_PRIORITY
);
mContext
.
registerReceiverAsUser
(
mReceiver
,
UserHandle
.
ALL
,
filter
,
null
,
mHandler
);
filter
=
new
IntentFilter
();
filter
.
addAction
(
Intent
.
ACTION_PACKAGE_CHANGED
);
filter
.
addAction
(
Intent
.
ACTION_PACKAGE_REMOVED
);
filter
.
addAction
(
Intent
.
ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE
);
filter
.
addAction
(
Intent
.
ACTION_PACKAGE_ADDED
);
filter
.
addDataScheme
(
"package"
);
mContext
.
registerReceiverAsUser
(
mReceiver
,
UserHandle
.
ALL
,
filter
,
null
,
mHandler
);
filter
=
new
IntentFilter
();
filter
.
addAction
(
Intent
.
ACTION_MANAGED_PROFILE_ADDED
);
filter
.
addAction
(
Intent
.
ACTION_TIME_CHANGED
);
filter
.
addAction
(
Intent
.
ACTION_DATE_CHANGED
);
mContext
.
registerReceiverAsUser
(
mReceiver
,
UserHandle
.
ALL
,
filter
,
null
,
mHandler
);
LocalServices
.
addService
(
DevicePolicyManagerInternal
.
class
,
mLocalService
);
mSetupContentObserver
=
new
SetupContentObserver
(
mHandler
);
mUserManagerInternal
.
addUserRestrictionsListener
(
new
RestrictionsListener
(
mContext
));
loadOwners
();
dumpsys device_policy
qssi:/ $ dumpsys device_policy
Current Device Policy Manager state:
Device Owner:
admin=ComponentInfo{com.example.android.deviceowner/com.example.android.deviceowner.DeviceOwnerReceiver}
name=
package=com.example.android.deviceowner
isOrganizationOwnedDevice=true
User ID: 0
Enabled Device Admins (User 0, provisioningState: 3):
com.example.android.deviceowner/.DeviceOwnerReceiver:
uid=10163
testOnlyAdmin=false
policies:
wipe-data
reset-password
limit-password
watch-login
force-lock
expire-password
encrypted-storage
disable-camera
passwordQuality=0x0
minimumPasswordLength=0
passwordHistoryLength=0
minimumPasswordUpperCase=0
minimumPasswordLowerCase=0
minimumPasswordLetters=1
minimumPasswordNumeric=1
minimumPasswordSymbols=1
minimumPasswordNonLetter=0
maximumTimeToUnlock=0
strongAuthUnlockTimeout=0
maximumFailedPasswordsForWipe=0
specifiesGlobalProxy=false
passwordExpirationTimeout=0
passwordExpirationDate=0
encryptionRequested=false
disableCamera=false
disableCallerId=false
disableContactsSearch=false
disableBluetoothContactSharing=true
disableScreenCapture=false
requireAutoTime=false
forceEphemeralUsers=false
isNetworkLoggingEnabled=false
disabledKeyguardFeatures=0
crossProfileWidgetProviders=null
organizationColor=-16746133
userRestrictions:
defaultEnabledRestrictionsAlreadySet={}
isParent=false
mCrossProfileCalendarPackages=[]
mCrossProfilePackages=[]
mSuspendPersonalApps=false
mProfileMaximumTimeOffMillis=0
mProfileOffDeadline=0
mAlwaysOnVpnPackage=null
mAlwaysOnVpnLockdown=false
mCommonCriteriaMode=false
mPasswordOwner=-1
mUserControlDisabledPackages=[]
mAppsSuspended=false
Constants:
DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC: 3600
DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE: 2.0
DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC: 86400
DAS_DIED_SERVICE_STABLE_CONNECTION_THRESHOLD_SEC: 120
Stats:
LockGuard.guard(): count=846, total=5.6ms, avg=0.007ms, max calls/s=96 max dur/s=0.5ms max time=0.1ms
Encryption Status: per-user
Device policy cache:
Screen capture disabled: {0=false}
Password quality: {0=0}
Device state cache:
Device provisioned: true
adb shell dpm set-device-owner com.sscience.deviceowner/.MyDeviceAdminReceiver
qssi:/ $ dpm
usage: dpm [subcommand] [options]
usage: dpm set-active-admin [ --user <USER_ID> | current ] <COMPONENT>
usage: dpm set-device-owner [ --user <USER_ID> | current *EXPERIMENTAL* ] [ --name <NAME> ] <COMPONENT>
usage: dpm set-profile-owner [ --user <USER_ID> | current ] [ --name <NAME> ] <COMPONENT>
usage: dpm remove-active-admin [ --user <USER_ID> | current ] [ --name <NAME> ] <COMPONENT>
dpm set-active-admin: Sets the given component as active admin for an existing user.
dpm set-device-owner: Sets the given component as active admin, and its package as device owner.
dpm set-profile-owner: Sets the given component as active admin and profile owner for an existing user.
dpm remove-active-admin: Disables an active admin, the admin must have declared android:testOnly in the application in its manifest. This will also remove device and profile owners.
dpm clear-freeze-period-record: clears framework-maintained record of past freeze periods that the device went through. For use during feature development to prevent triggering restriction on setting freeze periods.
dpm force-network-logs: makes all network logs available to the DPC and triggers DeviceAdminReceiver.onNetworkLogsAvailable() if needed.
dpm force-security-logs: makes all security logs available to the DPC and triggers DeviceAdminReceiver.onSecurityLogsAvailable() if needed.
usage: dpm mark-profile-owner-on-organization-owned-device: [ --user <USER_ID> | current ] <COMPONENT>