Android系统设备管理剖析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android系统设备管理剖析
简介
从Android 2.2 SDK起提供了一个可管理和操作设备的API叫DevicePolicyManager,使用这个API你可以接管手机的一些应用权限,这里以android 4.0.4为例从应用层和系统两方面来说明设备管理的工作原理,并总结相关设备管理的可行性。
1、应用层
使用Android的设备管理功能需要实现广播监听、权限清单、设备操作代码三部分。
1.1、广播监听
1.1.1、设备管理器列表
Android系统设置部分的的设备管理列表来自APK配置AndroidMinifest.xml文件注册的设备管理监听,见源码
packages\apps\Settings\src\com\android\settings\DeviceAdminSettings.java的updateList void updateList() {
...
mAvailableAdmins.clear();
List<ResolveInfo> avail =
getActivity().getPackageManager().queryBroadcastReceivers(
new
Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
PackageManager.GET_META_DATA);
int count = avail == null ? 0 : avail.size();
for (int i=0; i<count; i++) {
ResolveInfo ri = avail.get(i);
try {
DeviceAdminInfo dpi = new
DeviceAdminInfo(getActivity(), ri);
if (dpi.isVisible() ||
mActiveAdmins.contains(dpi.getComponent())) {
mAvailableAdmins.add(dpi);
}
} catch (XmlPullParserException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
} catch (IOException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
}
}
getListView().setAdapter(new PolicyListAdapter());
1.1.2、实现广播监听类UMDeviceAdmin
public class UMDeviceAdmin extends DeviceAdminReceiver { private static final String TAG = "UMDeviceAdmin";
public void onDisabled(Context context, Intent intent) { super.onDisabled(context, intent);
ULog.D(TAG, "DeviceAdmin disabled");
ClientRepairActivity.startActivity(context);
}
public void onEnabled(Context context, Intent intent) { super.onEnabled(context, intent);
ULog.D(TAG, "DeviceAdmin enabled");
}
public void onPasswordChanged(Context context, Intent intent) { super.onPasswordChanged(context, intent);
ULog.D(TAG, "Password changed");
}
public void onReceive(Context context, Intent intent) { super.onReceive(context, intent);
}
}
1.1.3、在AndroidManifest.xml中注册广播监听UMDeviceAdmin
<receiver android:name="com.unistrong.mdm.receiver.UMDeviceAdmin" android:description="@string/mi_device_admin_description"
android:label="@string/mi_device_admin"
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>
1.2、权限清单
<?xml version="1.0"encoding="utf-8"?>
<device-admin
xmlns:android="/apk/res/android">
<uses-policies>
<limit-password/>
<watch-login/>
<reset-password/>
<force-lock/>
<wipe-data/>
<encrypted-storage/>
<expire-password/>
<disable-camera/>
</uses-policies>
</device-admin>
1.3、操作
见官方文档相关接口:
/intl/zh-cn/reference/android/app/admin/DevicePolicyManager.html
2、系统层
系统层的支持是实现Android设备管理程序的基础,设备策略管理服务是应用程序具备操作设备管理设功能的核心。
2..1 设备管理配置文件device_policies.xml
device_policies.xml结构如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<policies>
<admin
name="com.unistrong.mdm/com.unistrong.mdm.receiver.UMDeviceAdmin"> <policies flags="479" />
</admin>
<admin name="com.mobileiron/com.mobileiron.receiver.MIDeviceAdmin">
<policies flags="479" />
</admin>
<active-password quality="65536" length="4" uppercase="0" lowercase="0" letters="0" numeric="0" symbols="0" nonletter="0" />
</policies>
admin name:对应设备管理程序监听器
policies flags:对应权限清单的<uses-policies>,如479=111011111b表示支持除USES_POLICY_SETS_GLOBAL_PROXY之外的所有用户策略权限,具体可参见frameworks\base\core\java\android\app\admin\DeviceAdminInfo.java 中的
public boolean usesPolicy(int policyIdent) {
return (mUsesPolicies & (1<<policyIdent)) != 0;
}
active-password之类的表示具体的用户策略
当存在任何一个激活的设备管理程序的时候device_policies.xml存在,否则文件不存在,设备管理程序激活过程中在此文件登记其监听器和相关权限,具体过程见设备管理激活。
2.2、设备管理服务DevicePolicyManagerService
源码路径frameworks\base\services\java\com\android\server\DevicePolicyManagerService.java
DevicePolicyManagerService是android系统启动时启动的系统服务之一,DevicePolicyManager 提供的设备管理操作接口均在这里实现。
DevicePolicyManagerService启动时即加载device_policies.xml,见接口systemReady,得到设备管理监听器列表和用户设备管理策略(DeviceAdminInfo中定义,如
USES_POLICY_LIMIT_PASSWORD、USES_POLICY_WATCH_LOGIN等)。
2.3、设备管理激活
设备管理的激活在设置(setting.apk)中实现,参见源码
packages\apps\Settings\src\com\android\settings\DeviceAdminAdd.java
中的
mActionButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) {
if (mAdding) {
try {
mDPM.setActiveAdmin(mDeviceAdmin.getComponent(), mRefreshing) ...
});
激活调用DevicePolicyManagerService的setActiveAdmin,将指定应用程序设备管理监听器添加到活动的设备管理监听器列表中并更新(添加到)用户策略管理配置文件
device_policies.xml
2.4、取消设备管理激活
同上调用DevicePolicyManagerService的removeActiveAdmin,将当前设备管理监听器从活动的设备管理监听器列表中移除并更新(移除从)用户策略管理配置文件
device_policies.xml,当所有设备管理监听都取消激活时删除device_policies.xml 3、总结
1、实现的设备管理执行的设备管理策略是以用户策略的形式存在,并保存在用户策略配置文件中;
2、实现设备管理自动激活的前提是在系统data\system目录下内置具相应设备管理广播监听和相关权限的device_policies.xml文件。
3、因为DevicePolicyManagerService中只提供USES_POLICY_DISABLE_CAMERA唯一一个
disable用户策略,且此策略在Android 4.0–4.0.2 Ice Cream Sandwich (API level 14)提供,所以
在android 4.0.4以前版本WIFI、蓝牙、GPS、出厂默认设置、共享WIFI、USB调试、USB存储的禁用无法实现,需要定制OS实现。