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