上回分析到了/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上password输错的时候会调用到。 这个设备管理器的作用貌似要能够猜到了。

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,窥豹一斑吧。

最新文章

  1. java中Color类的简单总结
  2. struts2拦截器
  3. ASP.NET中实现Session的负载均衡
  4. jQuery 一些小技巧
  5. Linux下的字符集问题
  6. ylbtech-dbs:ylbtech-7,welfareSystem(福利发放系统)
  7. ZOJ 3329 【概率DP】
  8. Android Non-UI to UI Thread Communications(Part 3 of 5)
  9. == Rickard Oberg &amp; TheServerSide
  10. IntelliJ IDEA 添加jar包的三种方式
  11. 信用卡/借记卡充值p2p平台
  12. 解决,Incorrect table definition; there can be only one auto column and it must be defined as a key
  13. excel表格的特殊需求引发的Java思考
  14. celery的使用
  15. 计算理论:NFA转DFA的两种方法
  16. LNMP架构部署
  17. 唐纳德 高德纳给年轻人的建议 Donald Knuth - My advice to young people
  18. Codevs 3990 [中国剩余定理]
  19. eShopOnContainers 知多少[8]:Ordering microservice
  20. 20155326刘美岑 《网络对抗》Exp1 PC平台逆向破解

热门文章

  1. 【BZOJ 3997】 3997: [TJOI2015]组合数学 (DP| 最小链覆盖=最大点独立集)
  2. 【8.30校内测试】【找规律模拟】【DP】【二分+贪心】
  3. [转] Eclipse的Tomcat插件安装
  4. HDU 5671 Matrix 水题
  5. CDOJ 1307 ABCDE 前缀和优化dp
  6. 《C# to IL》第三章 选择和循环
  7. 01-03-01【Nhibernate (版本3.3.1.4000) 出入江湖】id标签的unsaved-value属性
  8. IPC low/medium/high density 什么意思?
  9. 定制NSLog便于打印调试
  10. struts2 action通配符