7

我不想做广告,但我的应用程序行为的示例应用程序是 ESET 防病毒软件。

我的应用程序要求的一项功能是卸载需要密码。我将我的应用程序添加到设备管理列表中,现在无法卸载它。但是您可以将应用程序停用为管理设备。当您转到“设置”>“位置和安全”>“选择设备管理员”并尝试停用 ESET Security 时,它会启动正在等待密码并且您的手机已锁定的活动(我猜来自 DeviceAdminReceiver.onDisableRequested())。Home 键、返回键甚至 SwitchOff 键都没有反应=>

Home,Back,SwitchOff和Camera按钮怎么可能没有反应?

编辑 - 删除了第二个问题(在我从手机中取出电池后 - ESET 也不是设备管理员)

谢谢你的想法。

4

1 回答 1

2

好的,抱歉 ESET,但这个功能看起来很有趣,所以我看了一下反编译的源 :)

基本工作流程如下:

  • com.eset.ems.antitheft.receiver.AdminReceiver的子类DeviceAdminReceiver已注册广播操作DEVICE_ADMIN_ENABLED,并且DEVICE_ADMIN_DISABLED
  • 当设备管理员被禁用时com.eset.ems.antitheft.receiver.AdminReceiver.onDisabled()被调用
  • com.eset.ems.antitheft.LockActivity是从AdminReceiver.onDisabled()
  • LockActivity显示com.eset.ems.antitheft.LockingDialog最阻碍魔法发生的地方

至于 Home 和其他按钮块防病毒软件,请执行以下技巧 - 它使用Android 内部的ActivityManagerNative。为了保持LockActivity在所有其他活动的顶部,它启动了一个线程,该线程不断调用ActivityManagerNative.moveTaskToFront()任务LockActivityID。在 API 级别 10 之前,反射用于访问隐藏moveTaskToFront()ActivityManager类,而在 API 10 之后,它只使用ActivityManagerNativeAndroid 代码库中的代码来访问它。也LockActivity多次LockingDialog调用ActivityManagerNative.closeSystemDialogs()方法。这样做可能是为了取消长按电源按钮后出现的系统对话框。

至于停止执行DeviceAdminReceiver.onDisableRequested实际上我在代码中没有注意到它有什么特别之处。它仅在禁用设备管理员后才开始活动,仅此而已。在我取出电池后,我的手机设备管理员被禁用。

于 2013-04-09T17:49:25.207 回答