【问题标题】:How to show an Activity BEFORE my app is uninstalled (Android) [duplicate]如何在卸载我的应用程序之前显示活动(Android)[重复]
【发布时间】:2012-04-30 10:49:41
【问题描述】:

我虽然不可能,但我注意到 NQ Mobile Security 能够在我单击卸载后和调用 PackageUninstaller 之前显示一条消息。 我想在我的应用中复制这种行为。

我尝试了一个监听“android.intent.action.DELETE”意图的活动,如下所示: How to know my app is uninstalled from the device...?

但是当我要卸载我的应用程序时,会弹出选择器,要求选择我的应用程序或软件包卸载程序。我怎样才能避免这种情况?

是否有其他方法可以拦截您的应用程序 UNINSTALL 事件? (在回答不可能之前,请尝试卸载 NQ Mobile Security 看看会发生什么。在我的 Android 2.3.4 上,它显示一个漂亮的屏幕,说没有安全应用程序不安全)。

【问题讨论】:

  • 您的设备是植根的还是只是库存/未修改的零售设备?
  • 顺便问一下,当您点击“NQ Mobile Security”的卸载时显示的信息是什么?它与“设备策略”或“设备管理员”有什么关系吗?
  • @scorpiodawg 没有没有根。它是未经修改的零售设备。我已经编辑了问题并添加了图像,它是如何卸载的,你能接受编辑吗?
  • 看来我无法接受修改。所有者/原始海报可能必须这样做......

标签: android android-activity uninstallation


【解决方案1】:

我注意到 NQ Mobile Security 能够在我单击卸载后和调用 PackageUninstaller 之前显示一条消息

他们一定是在利用 Android 中的一些安全漏洞。我会研究它,看看我能不能把它修好。应用程序不应在卸载时获得控制权。

感谢您指出这一点!

是否有其他方法可以拦截您的应用程序 UNINSTALL 事件?

我当然希望不会。

【讨论】:

  • 如果应用程序在卸载时启动ActivityIntentService,会有什么问题/安全威胁?
  • @TedHopp 礼貌地说,合法的应用程序永远不会这样做,而恶意的应用程序可能会造成许多其他危害。但完全阻止此类功能可能对某些寻求丰富用户体验的合法应用非常有害。
  • @CommonsWare 你的研究有进展吗?
  • @AlexanderMironov:是的。如果您向我证明您是从事 Android 项目的 Google 员工,我将很乐意为您提供详细信息。我已将这些详细信息提交给 Android 安全团队。
  • 这甚至不是一个真正的答案;它似乎更像是一个评论。不仅如此,您实际上还试图让人们更难做到这一点!而且我看不出如何防止这种情况更安全,因为应用程序仍然可以在其他各个时间点运行恶意代码。当用户必须在您的应用中使用专门的卸载部分时,这很烦人。
【解决方案2】:

他们可能要求用户在不知情的情况下授予他们非常关键的权限。查看此应用的“权限”标签(截至 2012 年 6 月 15 日):https://play.google.com/store/apps/details?id=com.nqmobile.antivirus20&hl=en

这个应用程序获得的权限列表令人毛骨悚然。除其他事项外:

SYSTEM TOOLS RETRIEVE RUNNING APPS 允许应用检索 有关当前和最近运行的任务的信息。恶意应用 可能会发现有关其他应用的私人信息。

更改/拦截网络设置和流量 允许应用更改网络设置 并拦截和检查所有网络流量,例如 更改任何 APN 的代理和端口。恶意应用程序可能会监控, 在您不知情的情况下重定向或修改网络数据包。

防止平板电脑处于睡眠状态 防止手机处于睡眠状态 允许该应用 防止平板电脑进入睡眠状态。允许应用阻止 手机不睡觉。

更改您的 UI 设置 更改当前配置,例如区域设置或整体字体 尺寸。 修改全局系统设置 允许应用修改 系统的设置数据。恶意应用程序可能会破坏您的系统 配置。

DISPLAY SYSTEM-LEVEL ALERTS 允许应用显示 系统警报窗口。恶意应用可能会占据整个屏幕。

装载和卸载文件系统 允许应用装载和卸载 用于可移动存储的文件系统。

更改网络连接允许 更改网络连接状态的应用程序。

CHANGE WI-FI STATE 允许应用连接和断开 Wi-Fi 访问 点,并更改配置的 Wi-Fi 网络。

-- 更新--

我还发现,如果要求 Android 包管理器删除一个包,它几乎只会删除它。 唯一它在这样做之前执行的检查是正在删除的包当前是否已注册为具有活动的设备管理员:

    try {
        if (dpm != null && dpm.packageHasActiveAdmins(packageName)) {
            Slog.w(TAG, "Not removing package " + packageName + ": has active device admin");
            return PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER;
        }
    } catch (RemoteException e) {
    }
    

参见 AOSP 源 here 中 PackageManagerService 的第 6900 行。

为此,应用程序必须由用户显式注册为设备管理员。在此处查看有关设备管理的说明:http://developer.android.com/training/enterprise/device-management-policy.html

【讨论】:

  • 好的,你给出了一个很好的指导,Can user give permission to run an Activity while application is uninstalled?
  • 见我上面的更新。我认为如果您将您的应用程序注册为“设备管理员”,那么您可以在这里做一些事情。否则它似乎没有(即据我所知,操作系统没有这样的规定)
  • Device Administration 所需的权限是"android.permission.BIND_DEVICE_ADMIN。看起来不是应用程序要求它?
  • 我已将我的应用程序注册为设备管理员...如何在卸载应用程序之前使用您的上述更新调用活动??
  • 我已经开始了一个关于同一主题的新问题,看看stackoverflow.com/questions/11062780/…
【解决方案3】:

我很确定他们正在监视 LogCat 以在 Activity Manager 调用 PackageUninstaller 时进行拦截。我认为他们终止了任务并开始了自己的活动。 它非常聪明,但肯定是在利用 Android 中的安全漏洞。

【讨论】:

【解决方案4】:

Opera Max 是一款具有类似功能的应用 - 卸载后会打开网页。

他们是怎么做到的?

通过使用 libevent,从本机代码,他们观察 /data/data/com.opera.max 目录被删除,然后发布好的旧动作。当它发生时查看广播。

安装他们的应用程序,运行它,然后在根设备上从 adb shell 删除 /data/data/com.opera.max 目录

更新:我创建了一个示例应用程序来展示它是如何工作的。顺便说一句,它不适用于最近的(我认为是 KitKat+)Android 版本:https://github.com/pelotasplus/ActionAfterUninstall

【讨论】:

  • 嗨,它适用于 android 5 吗?我不能让它工作。
  • 不,它没有。请参阅我答案末尾的更新。这只是一个 hack。
  • 没有办法做到这一点?我搜索了两天,但没有找到答案。
【解决方案5】:

根据https://stackoverflow.com/a/26829978/1317564,这里有一些示例代码:https://github.com/zzljob/android-uninstall-feedback/blob/master/library/jni/feedback-uninstall.c。这实际上不会阻止卸载的发生,但确实提供了一种捕获它并采取一些措施的方法。老实说,我很惊讶这在 Android 中有效,并且该团队可能在最近的版本中填补了空白。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2013-06-15
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多