将根权限授予应用程序。

3
我有一个应用程序,它由本地部分和更高的层组成。
因此,为了运行一些本地函数,它需要被授予根权限。
如我之前发布的文章所述,我添加了从Bluez Utils(hidd.c)中获取的一段代码。
if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    close(sk);
    return -1;
   }

该代码已经通过NDK编译为.so。不幸的是,它一直返回-1,并且errno为13,这意味着权限被拒绝。一些经验丰富的开发人员(在这里感谢)提到,错误发生是因为该应用程序没有足够的权限。我认为这并不像“su”进程,这意味着您拥有系统权限,但您的应用程序没有。 (如果我错了,请告诉我)。有什么办法授予应用程序root权限吗?非常感谢任何答复/线索/提示。敬礼- Sam

猜测不是这样的... 你只能在已经root的设备上这样做。 - Its not blank
嗨,是的,我的手机已经完全获取了 root 权限。 - Sam
嗨,happy2Help,你的方法看起来很酷。我稍后会尝试一下并告诉你它是否有效。谢谢! - Sam
2个回答

1

我认为我可以帮助你解决这个问题。

我们开始吧...

void gainRoot()
{
    Process chperm;
    try {
        chperm=Runtime.getRuntime().exec("su");
          DataOutputStream os = 
              new DataOutputStream(chperm.getOutputStream());
            os.writeBytes("chmod 777 /dev/video0\n");
            os.flush();

            os.writeBytes("exit\n");
            os.flush();

            chperm.waitFor();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

这是我通常用来更改root文件权限的函数。

当您执行su时,将创建一个具有root特权的新进程。因此,使用此进程可以执行任何root操作。需要遵循一些特定的语法。如上面的示例所示。

因此,您可以构建代码的绑定部分作为单独的可执行文件,并将其放置在system/bin内或通常放置可执行文件的位置。假设可执行文件的名称为bind123,则不要使用

            os.writeBytes("chmod 777 /dev/video0\n");
            os.flush();

将其替换为

            os.writeBytes("bind123\n");
            os.flush();

在上述代码中。
这应该可以工作。一旦这个工作了,我们可以尝试将其与应用程序集成,而不依赖于可执行文件。希望我没有让你感到困惑。如果需要更清晰的解释,请告诉我...祝你好运...

好的。据我所知,应用程序默认总是在用户模式下运行。即使在普通的Linux中也是如此。当您执行su时,将创建一个具有UID 0的新进程。这意味着它是一个具有根特权的内核进程。使用此进程执行特权任务。我们在Android应用程序中尝试做同样的事情。如果您希望整个应用程序都具有root权限,我认为没有这种支持可用。 - Sandeep
嗨,happy2Help,在我的情况下,bind()是我希望可以用它与我的蓝牙交互的系统调用。然而,当我的代码执行到bind()时,错误指示权限被拒绝。在文档中,它将此错误解释为“进程没有适当的特权将local_address绑定到socket_descriptor指向的套接字上(例如,如果socket_descriptor是一个具有AF_INET地址族的套接字,并且由local_address指向的sockaddr_in结构指定了一个被限制使用的端口)”。 - Sam
你提到了“你可以将代码的绑定部分构建为一个单独的可执行文件,并将其放置在system/bin中”。我对如何实现它不是很清楚。你能更具体地解释一下吗?有些让我困惑的是,同样的代码在某些手机上可以工作,但在某些手机上却不能。这就是为什么我认为这个问题应该得到解决。如果你有任何线索,请多多告知。感谢你的时间并加入这个讨论。 - Sam
你好。假设你想在Android上执行helloworld程序,你该如何操作呢? 1)在你的电脑上编写程序。 2)使用交叉编译器(可以使用NDK)构建可执行文件。 3)将可执行文件(ARM二进制文件)推送到平台(Android手机)内的/system/bin目录中,或者 4)进入shell(adb shell), 5)运行可执行文件(./myExe) 这样应该就会打印出helloworld。以同样的方式,您可以执行绑定操作并从应用程序过程中调用应用程序。 首先确保这个方法可行。然后我们可以为更通用的解决方案而努力。希望清楚明了。 - Sandeep
谢谢happy2Help。你真的很热心。我明白了你的解释。现在清楚多了。 - Sam
显示剩余3条评论

0

这段代码是为蓝牙实现而编写的,不用于互联网目的。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接