Android Device Policy Administration - litonghui/TechBlog GitHub Wiki
最近看到一篇关于设备管理器 Android Device Policy Administration Tutorial 文章,认真拜读一下,结合最近研究学习《Android Security Internals》 书中的相关设备管理介绍,学习总结如下:
在Android 2.2 系统以上引入Device Administration API,应用程序可以执行系统级别功能。如果应用程序被激活为设备管理程序,将拥有设备安全设置,不能被卸载。被授予特殊的权限,例如:锁屏、设置密码、设置存储设备加密、删除所有数据等等。
- limit-password 设置密码规则,允许长度和字符
- watch-login 监视屏幕解锁尝试次数,输入密码次数,次数过多锁定手机或删除所有数据
- reset-password 更改屏幕解锁密码
- force-lock 锁屏,控制锁屏方式和时间
- wipe-data 删除所有数据,恢复出厂设置时候,系统会在不发出警告情况下删除手机上的数据
- expire-password 设置锁屏密码的有效期,控制系统强制用户更改锁屏密码频率
- encrypted-storage 设置存储设备加密,要求对存储的应用数据进行加密
- disable-camera 停用相机,禁止使用所有设备相机
- disable-keyguard-features 锁屏时警用某些功能
- set-global-proxy 设置设备全局代理,请设置在启动政策的情况下使用设备全局代理。只有第一设备管理员才可设置有效的全局代理
设备管理器API 中允许如上操作,它内部实现方式,类似于许多公共AndroidAPIs,DevicePolicyManager 公开一部函数,作为底层系统服务,称为DevicePolicyManagerService,相似许多系统服务,DevicePolicyManagerService 以系统用户启动运行在系统进程中,同时享有很多Android 特殊权限。同时又区别于很多系统服务,它被授予确定特殊权限,例如在第三方软件修改锁屏密码,不需要申请特殊系统权限 。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.deviceadmin">
--snip--
<receiver android:name=".MyDeviceAdminReceiver"
android:label="@string/device_admin"
android:description="@string/device_admin_description"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data android:name="android.app.device_admin"
android:resource="@xml/device_admin_policy" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
--snip--
</manifest>
Android SDK 提供一个系统广播android.app.admin.DeviceAdminReceiver 用户继承,定义回调方法用于重写,onEnabled()、onDisabled()通知管理设备是否可用。isAdminActive() 方法判断是否激活为设备管理应用。设备激活为管理管理不能自己实现,系统弹出一个页面用户请求确认。对于已经激活为设备管理可以调用removeActiveAdmin()取消以激活的设备。
public class MyDeviceAdminReceiver extends DeviceAdminReceiver {
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
public void onEnabled(Context context, Intent intent) {
}