【问题标题】:Android : can native code get broadcast intent from android system? [duplicate]Android:本机代码可以从 android 系统获取广播意图吗? [复制]
【发布时间】:2014-02-12 07:04:45
【问题描述】:

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

现在问题来了。原生应用可以捕捉到来自安卓系统的广播意图吗? 如果可能的话,请告诉我怎么做! :-(

【问题讨论】:

  • 顺便说一句,Google Play 中有两个同名的应用程序。你指的是哪一个?
  • @DavidWasser 这是一个非常好的链接。对于OP,该问题的答案可能会对您有所帮助。这是答案的链接:stackoverflow.com/a/18816716/2431281
  • @Keale 谢谢。不幸的是,这从 4.0 开始就不能可靠地工作了,因为 ACTION_QUERY_PACKAGE_RESTART 并不总是被广播。见stackoverflow.com/questions/20699640/…
  • @beworker 我找到了其他应用程序。你可以看到与海豚浏览器相同的操作(你需要至少运行一次浏览器。)

标签: android android-intent native-code


【解决方案1】:

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

  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. 现在你应该已经知道最后一块是什么了吧?我的本机终止处理程序应该能够启动浏览器。我没有在代码中尝试过,但我认为这是可能的,因为我可以使用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 文件的一部分。现在打开海豚浏览器的App info 页面并按"Force Stop"。切换回终端并再次拨打ps。您将看到不再有 mobi.mgeek.TunnyBrowser 进程,但 watch_server 仍在运行。

顺便说一下,这种方法只有在观察服务器一直运行时才有效。到 确保它始终处于启动状态,两个应用程序都需要“在启动时运行” 权限,他们在哪里开始他们的观察者。

现在,当您卸载该应用时,Android 会停止属于该应用的所有进程。 Watcher 接收到终止信号并使用预定义的 URL 打开浏览器,然后关闭。

在某些细节上我可能看起来有点不同,但这个 hack 背后的主要概念必须与描述的一样。

【讨论】:

  • 感谢您非常详细和精彩的解释 ;-)
  • 如何在我的android项目中使用本机代码?请帮我解决这个问题
【解决方案2】:

可能会有一个棘手的问题,例如该应用程序也有观察者服务。

您可以检查该应用使用的权限可能包含安装和卸载权限。

它是如何工作的:

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

  2. 当你安装它时,这个应用程序也会安装一些服务来监视你的应用程序状态

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

  4. 一旦此服务发现您的包不在列表中,它就会调用带有操作视图的意图并使用 Web url 打开浏览器。

【讨论】:

  • 不,这是不可能的。首先,一个 APK 只能包含一个应用程序。当一个应用程序被卸载时,它的所有组件都被卸载(这包括任何服务、内容提供者等)。系统广播ACTION_PACKAGE_REMOVED是在应用被删除后发出的,所以这个应用是没有办法得到的。其次,非系统应用程序永远不会被授予INSTALL_PACKAGES 的权限,因此第三方应用程序不可能安装另一个应用程序而无需用户实际确认此安装。
  • 它可以通过仅使用将由您的应用程序安装的不同包的服务来实现,现在您有两个不同的应用程序(1 个监控服务和 1 个应用程序)具有不同的包,当您卸载应用程序时服务将保留,因为它具有不同的包名称。 :)
  • @dineshsharma 你真的试过你解释的吗?
  • 好吧,那么我会支持你的答案;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多