最近我见过一个有趣的应用程序 - Photo Wonder。
卸载此应用程序时,它会显示一个Web调查页面,询问应用程序卸载的原因。现在,这是问题所在。
据我所知,在删除应用程序后,系统会广播ACTION_PAKAGE_REMOVED
意图。
但这个有趣的应用程序能够显示我的网页,虽然官方文档说
“正在安装的软件包不会收到此Intent。”
无论如何,我可以找到一个检查应用程序某种状态的进程。
现在问题就在这里。本机应用程序可以从android系统捕获广播的意图吗? 如果有可能,请告诉我如何! : - (
答案 0 :(得分:23)
我相信我已经了解了他们是如何做到的。这是拼图的各个部分。
任何Android应用程序都可以通过调用Runtime.exec()
函数来启动进程。
Runtime.getRuntime().exec("chmod 755 '/data/data/my.app/files'/native_code");
执行此代码行后,会产生另一个进程。此过程在与应用程序本身相同的linux用户下运行。
当用户打开设置 - >应用 - >我的应用程序并按“强制停止”按钮,主要应用程序进程被终止,但主持原生程序的进程(见上文) )仍在运行。我个人认为这是一个安全问题,我将把它报告给AOSP。
这样的原生程序可以无限运行,什么都不做 - 只是睡觉。但是在进入睡眠状态之前,它会注册一个终止信号处理程序,当进程即将被系统终止时,将会调用该处理程序。
int main(void) {
signal(SIGTERM, termination_handler);
while(1) {
sleep(10);
}
}
void termination_handler(int sig) {
// handle termination signal here
}
现在你应该已经知道最后一块是什么了,对吗?我的本机termination_handler应该能够启动浏览器。我没有在代码中尝试这个,但我认为这是可能的,因为我可以使用adb shell
执行此操作
adb shell am start -a android.intent.action.VIEW -d http://www.google.com
现在回到关于Dolphin Browser如何做到这一点的问题。安装应用程序并至少启动一次。一旦启动,它将使用上述原则注册本机卸载观察程序。要查看它,请连接到设备并打开adb shell
。然后调用ps
查看进程列表。您将看到两个类似于以下的过程
u0_a109 315 ... mobi.mgeek.TunnyBrowser
u0_a109 371 ... /data/data/mobi.mgeek.TunnyBrowser/files/watch_server
正如您所看到的,它启动了一个watch_server本机程序,它是apk文件的一部分。现在打开Dolphin Browser的App info
页面,然后按"Force Stop"
。切换回终端并再次呼叫ps
。您将看到没有mobi.mgeek.TunnyBrowser进程,但watch_server仍在运行。
顺便说一下,只有观察者服务器一直运行,这种方法才有效。至 确保它始终处于运行状态,两个应用程序都需要“在启动时运行” 许可,他们开始观察者。
现在,当您卸载应用程序时,Android会停止属于此应用程序的所有进程。 Watcher收到终止信号并打开带有预定义URL的浏览器,然后关闭。
我可能在某些细节上看起来有点不同,但这个黑客背后的主要概念必须如所描述的那样。
答案 1 :(得分:2)
可能有一个棘手的事情,例如该应用程序也有观察者服务。
您可以检查该应用使用的权限是否包含INSTALL和UNINSTALL权限。
如何运作:
而不是可能有2个应用包的单个应用。
当您安装它时,此应用也会安装一些正在观看您的应用状态的服务
当您尝试卸载该应用程序时,将调用系统广播,该系统广播由该服务处理,并将检查您的软件包是否存在于已安装的应用程序中。
只要此服务发现您的包不在列表中,它就会调用具有操作视图的意图,并使用网址来打开争斗。