通过几个职位去之后,我想通了,我可以与下面的代码行(用于调试第二行)发送的意图:
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 shell am broadcast -a android.intent.action.MIKE_ACCESSED
注意! 我不使用NDK。 我在后报告的代码段是在Android框架一个代码的一部分的变形例。 特别是,它是Android服务的一个组成部分。 我与AOSP工作和修改源代码的一部分。
正如我记得,你不能直接在您的应用程序由于是Android 5.0版本的权限检查执行am命令。
这两种情况是不同的。 从外壳程序执行命令有壳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它与外壳的UID和GID比较少的权限执行。
所以,你会失败的代码结束。 您可以优化您的设计,从Java代码发送此意图。 如果你坚持你的JNI做的,更好的解决方案可能会调用自己的一个静态无效的方法Application
。 这样一来,你就不必担心Context
这是不是在JNI大部分时间访问。
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);
}
}
1)禁用SELinux(设置在允许模式)2)修改ActivityManagerNative.java绕过用户id检查
请享用 :)