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

时间:2014-01-22 09:44:26

标签: android android-intent native-code

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

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

2 个答案:

答案 0 :(得分:23)

我相信我已经了解了他们是如何做到的。这是拼图的各个部分。

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

    Runtime.getRuntime().exec("chmod 755 '/data/data/my.app/files'/native_code");
    

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

  2. 当用户打开设置 - >应用 - >我的应用程序并按“强制停止”按钮,主要应用程序进程被终止,主持原生程序的进程(见上文) )仍在运行。我个人认为这是一个安全问题,我将把它报告给AOSP。

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

    int main(void) {
        signal(SIGTERM, termination_handler);
        while(1) {
            sleep(10);
        }
    }
    
    void termination_handler(int sig) {
       // handle termination signal here
    }
    
  4. 现在你应该已经知道最后一块是什么了,对吗?我的本机termination_handler应该能够启动浏览器。我没有在代码中尝试这个,但我认为这是可能的,因为我可以使用adb shell执行此操作

    adb shell am start -a android.intent.action.VIEW -d http://www.google.com
    
  5. 现在回到关于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权限。

如何运作:

  1. 而不是可能有2个应用包的单个应用。

  2. 当您安装它时,此应用也会安装一些正在观看您的应用状态的服务

  3. 当您尝试卸载该应用程序时,将调用系统广播,该系统广播由该服务处理,并将检查您的软件包是否存在于已安装的应用程序中。

  4. 只要此服务发现您的包不在列表中,它就会调用具有操作视图的意图,并使用网址来打开争斗。