知道我的应用程序是否已卸载

Know if my app is uninstalled

经过大量研究,我得出的结论是无法跟踪卸载,因为 "Package Removed" 操作不会广播到除卸载应用之外的所有应用。

然后我找到了一种跟踪卸载的方法。我通过 发送 GCM 并在响应中收到 "Not Registered" 错误 (GCM 为卸载应用程序的设备给出 "Not Registered" 错误)保存了所有卸载用户信息。

所以现在,当我安装 Opera Max 应用程序并卸载它时,它打开了一个要求 "Uninstall Survey" 的网页。他们怎么能那样做?

有关示例代码,请参阅 these slides from Droidcon 2015 where some guys reverse-engineered how Opera Max is doing that, and see this GitHub repository

当我卸载 Opera Max 时,我无法重现此行为,但我相信他们的技术遵循以下原则:

  • 他们以某种方式注册了一个事件处理程序,如果安装该应用程序的目录消失,该事件处理程序将发送一个 Intent
  • 该事件处理程序在应用程序卸载后仍然存在
  • 当目录消失时,意图会触发 - 当然他们现在不能 运行 他们自己的代码(因为它已被卸载),但他们可以将您定向到任何浏览器中的网页

我尝试此操作时没有安装任何其他 Opera 应用程序 - 如果您有第二个您也控制的应用程序尚未卸载,那么每个应用程序都可以轻松监控另一个应用程序的卸载.

我 运行 正在使用 Lollipop - 也许 Android 的最新版本已经关闭了一个安全漏洞。