首页 > 代码库 > 关于android的设备管理器-DevicePolicyManager(二)

关于android的设备管理器-DevicePolicyManager(二)

        上回分析到了/data/system/device_policies.xml这个文件是在package change事件发生的时候变化的,那么来看看它的内容。根据以往的经验,在/data/system下面的几个文件(packages.xml  packages.list)都是PackageManager扫面各个package的Manifest文件生成的,估计这文件也差不多吧。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<policies>
<admin name="com.bgsoft.securitycamera/com.bgsoft.securitycamera.AdminReceiver">
<policies flags="2" />
</admin>
<active-password quality="65536" length="5" uppercase="0" lowercase="0" letters="0" numeric="0" symbols="0" nonletter="0" />
</policies>

在我安装了SecurityCamera这个apk以后,这个文件变成了这样,多出了一个admin的片段,描述的东西看起来确实是SecurityCamera相关的东西,那再来看看它的Manifest文件吧。

        <receiver 
			android:label="@string/labelValue" 
			android:name=".AdminReceiver" 
			android:permission="android.permission.BIND_DEVICE_ADMIN" 
			android:description="@string/description">   
		<meta-data android:name="android.app.device_admin" android:resource="@xml/lockourscreen" />
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>
可以发现有个receiver的段和前文提到的东东是相关的,AdminReceiver 这个东西看来是具体的实现部分,需要具体研究。

查看代码发现它是DeviceAdminReceiver的子类,是一个广播接收器,但是很奇怪,做为一个广播接收器,在Manifest中没有注册,也没有在代码中动态的注册,那它是怎么接收到它想要的action事件的,很奇怪。只能在代码中再寻找谁用到了它呢.

   this.componentName = new ComponentName(this, AdminReceiver.class);
......
  private void startDeviceManager()  {    Intent localIntent = new Intent("android.app.action.ADD_DEVICE_ADMIN");    localIntent.putExtra("android.app.extra.DEVICE_ADMIN", this.componentName);    localIntent.putExtra("android.app.extra.ADD_EXPLANATION", "防盗拍照助手");    startActivityForResult(localIntent, 0);  }
OK,就这里了。但是问题来了,挖.. 不是不是,这是在干什么呢? 寻遍Android的源代码,发现Setting能处理这个Intent。

I/ActivityManager( 3138): START u0 {cmp=com.android.settings/.DeviceAdminAdd (has extras)} from pid 24508

BYW:这种log看了这么多,才明白原来cmp是component。

不废话,看DeviceAdminAdd ,代码较多,不贴了主要分析,就是这个Activity在处理这个Action的是候会弹出一个框,问你是否确认激活这个 设备管理器。

如果ok的话就会调用setActiveAdmin,这个就是前文中提到的那个setActiveAdmin,把这个设置成active的。那是不是激活了就能收到广播了呢。还有这个管理器到底有什么用的问题还是没解决。

还是得继续研究。 那线索只能是去分析前文提到的List了,前文只看了如果add,却没关注这个list到底是做什么用的,失误。

查找出了一堆使用的地方,调个典型的来看看.

    void sendAdminCommandLocked(String action, int reqPolicy, int userHandle) {
        final DevicePolicyData policy = getUserData(userHandle);
        final int count = policy.mAdminList.size();
        if (count > 0) {
            for (int i = 0; i < count; i++) {
                ActiveAdmin admin = policy.mAdminList.get(i);
                if (admin.info.usesPolicy(reqPolicy)) {
                    sendAdminCommandLocked(admin, action);
                }
            }
        }
    }
遍历这个list,要知道这个list可都是active的admin了,发给他们消息,对了,有门,这就是它收到广播的方式吗?看看谁调用了这个方法。找个典型,发现在keyguard上密码输错的时候会调用到。 这个设备管理器的作用貌似要可以猜到了。

admin.info.usesPolicy(reqPolicy)

可以看出有很多policy可以被使用,

USES_POLICY_LIMIT_PASSWORD

USES_POLICY_WATCH_LOGIN

。。。。

后来还google原来是与应用的某个xml对应,就是Manifest里面的meta-data

<meta-data android:name="android.app.device_admin" android:resource="@xml/lockourscreen" />
<?xml version="1.0" encoding="utf-8"?>
<device-admin
  xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <watch-login />
    </uses-policies>
</device-admin>
Ok,窥豹一斑吧。











关于android的设备管理器-DevicePolicyManager(二)