Android:本机代码可以从Android系统获得广播意图吗?

MoT*_*TSF 10 android native-code android-intent

最近我见过一个有趣的应用程序 - Photo Wonder.卸载此应用程序时,它会显示一个Web调查页面,询问应用程序卸载的原因.现在,这是问题所在.据我所知,在删除应用程序后,系统会广播ACTION_PAKAGE_REMOVED意图.但这个有趣的应用程序能够显示我的网页,虽然官方文档说 "正在安装的软件包没有收到此意图." 无论如何,我可以找到一个检查应用程序某种状态的进程.

现在问题就在这里.本机应用程序可以从android系统捕获广播的意图吗?如果有可能,请告诉我如何!:-(

ser*_*nka 24

我相信我已经了解了他们是如何做到这一点的.这是拼图的部分.

  1. 任何Android应用程序都可以通过调用Runtime.exec()函数来启动进程.

    Runtime.getRuntime().exec("chmod 755 '/data/data/my.app/files'/native_code");
    
    Run Code Online (Sandbox Code Playgroud)

    在执行这行代码之后,会产生另一个进程.此过程在与应用程序本身相同的linux用户下运行.

  2. 当用户打开设置 - >应用程序 - >我的应用程序并按"强制停止"按钮时,主应用程序进程将被终止,托管本机程序(参见上文)的进程仍会运行.我个人认为这是一个安全问题,我将把它报告给AOSP.

  3. 这样的原生程序可以无限运行,什么都不做 - 只是睡觉.但是在进入睡眠状态之前,它会注册一个终止信号处理程序,当进程即将被系统终止时,将会调用该处理程序.

    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)
  4. 现在你应该已经知道最后一块是什么了,对吗?我的本机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的浏览器,然后关闭.

我可能在某些细节上看起来有点不同,但这个黑客背后的主要概念必须如所述.