【问题标题】:Sending an intent from c++ to java in Android 5.0.1_r1在 Android 5.0.1_r1 中将意图从 c++ 发送到 java
【发布时间】:2015-03-07 02:42:26
【问题描述】:

在浏览了几篇帖子后,我发现我可以使用以下代码行发送意图(第二行用于调试):

int ret = system("am broadcast -a android.intent.action.MIKE_ACCESSED --user 0"); 

__android_log_print(ANDROID_LOG_DEBUG, "gxp18", "Shell command returned %i", ret);

不幸的是,这总是返回(无论系统中使用什么命令(“...”)):

Shell 命令返回 32512

有趣的是,我可以通过 adb 成功发送意图:

adb shell am broadcast -a android.intent.action.MIKE_ACCESSED

注意!我没有使用 NDK。我在帖子中报告的那段代码是对 Android Framework 中部分代码的修改。特别是,它是其中一项 Android 服务的一部分。我正在使用 AOSP 并修改部分源代码。

【问题讨论】:

  • 我正在破解 android 框架中的一些系统服务,我需要将意图从 c++ 发送到 java。还有其他想法如何在用 c++ 编写的一部分代码和用 java 编写的另一部分代码之间发出这种信号吗?
  • “黑客”。你真的应该在 Android 的 API 中使用Intents。从 Android 的 NDK(JNI) 或 Android 的 SDK(Java) 发送 Intent 不会对您尝试做的事情产生影响,因为它来自相同的 PID。请参阅@alijandro 的回答。
  • 好的。不知道你想表达什么。您能提出解决方案吗?
  • 您使用的是 Android NDK 吗?您是在创建要在 Android 上运行的二进制文件,还是将 JNI 添加到 Android 应用程序? Adb Shell 之所以有效,是因为它具有正确的权限。
  • @JaredBurrows 我没有使用 NDK。我在帖子中报告的那段代码是对 Android Framework 中部分代码的修改。特别是,它是其中一项 Android 服务的一部分。我正在使用 AOSP 并修改部分源代码。谢谢。

标签: java android c++ android-intent system-calls


【解决方案1】:

1) 禁用 SELinux(设置为 Permissive 模式) 2)修改ActivityManagerNative.java绕过userId检查

享受:)

【讨论】:

    【解决方案2】:

    我记得,由于 Android 5.0 版本的权限检查,您不能直接在您的应用中执行 am 命令。

    这两种情况是不同的。从 shell 执行的命令有 shell UID 和 GID,如下所示。

    uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:shell:s0
    

    您在代码中使用system() 调用执行的命令是使用您应用的UID 和GID 执行的,与shell UID 和GID 相比,它们的权限更少。

    因此,您将以失败的代码结束。您可以优化您的设计以从您的 Java 代码中发送此意图。如果你坚持在你的 JNI 中做,一个更好的解决方案可能是在你自己的Application 中调用一个静态 void 方法。这样,您就不必担心大部分时间在 JNI 中无法访问的 Context

    public class MyApplication extends Application {
    
       private static Context context;
    
       @Override
       public void onCreate() {
           super.onCreate();
           context = this;
        }
    
        public static void sendIntent() {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("http://www.google.com"));
            context.startActivity(intent);
        }
    }
    

    【讨论】:

    • 感谢 alijandro。我真的需要将意图从 c++ 发送到 java。我正在破解android框架中的一些系统服务,我需要一种方法来从用c++编写的方法调用用java编写的方法。我没有很大的灵活性
    • 我在问题中报告的代码是 Android 框架中服务的一部分。我正在更改源代码。它不是应用程序的一部分。很可能甚至对映射到系统服务的进程也有权限。如何更改这些权限并允许我的代码执行命令?
    • @GiuseppePetracca 如果您也在进行框架级编程,请尝试从am 挖掘代码。同时,您的服务是否是com/android/server 的一部分,如果是,那么在com/android/server 包下有很多启动活动的示例。
    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多