【问题标题】:Grant the root privilege to the application授予应用程序 root 权限
【发布时间】:2012-04-29 13:00:36
【问题描述】:

我有一个应用程序,它由本机部分和更高版本组成 层。

因此,它需要被授予root权限才能运行一些 本机函数。

正如我之前发布的文章,我添加了一段取自 Bluez 的代码 实用程序(hidd.c)。

if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    close(sk);
    return -1;
   }

代码已由 NDK 构建为 .so。

不幸的是,它一直返回 -1 并且 errno 是 13 这意味着 权限被拒绝。

一些经验丰富的开发人员(在此感谢您)提到了 发生错误是因为此应用程序没有足够的权限。

它“不应该”类似于

进程进程 = Runtime.getRuntime().exec("su");

我认为这意味着您拥有系统权限,但您的 应用程序没有。 (如果我错了请告诉我)

有什么方法可以授予应用程序拥有root权限?

任何回复/线索/提示将不胜感激。

问候-

山姆

【问题讨论】:

  • 猜猜不是......你只能在有根设备上做到这一点。
  • 嗨,是的,我的手机已经完全root了。
  • 嗨happy2Help,你的方法看起来很酷。我稍后会尝试,让你知道它是否有效。谢谢!

标签: android bluetooth android-ndk sdp


【解决方案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();
    }
}

这是我通常用来更改根文件权限的功能。

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

因此,您可以做的一件事是将代码的绑定部分构建为单独的可执行文件,并将其放置在 system/bin 或通常保存可执行文件的位置。假设可执行文件的名称是 bind123 然后而不是

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

替换为

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

在上面的代码中。

这应该可以。可能一旦它工作了,我们可以尝试将它与应用程序集成,而不依赖于可执行文件。我希望我没有让你感到困惑。如果需要明确一点,请告诉我ww....一切顺利...

【讨论】:

  • 稍后我会简短介绍。我似乎理解你的概念,但是是的,正如你所提到的,如何将它与我的应用程序集成以获得 root 权限对我来说仍然是未知的。水,我先试试你的方法。
  • 好的。据我所知。默认情况下,应用程序始终以用户模式运行。即使在普通 linux 中也是如此。当您执行 su 时,将使用 UID 0 创建一个新进程。这意味着它是一个具有 root 权限的内核进程。使用此过程,可以执行特权任务。我们在 Android App 中尝试做的事情是一样的。如果您希望您的整个应用程序应该具有 root 权限,我认为没有可用的支持。
  • 嗨happy2Help,就我而言,bind() 是我希望可以使用它与我的蓝牙交互的系统调用。但是,当我的代码执行到 bind() 时,错误表明权限被拒绝。在文档中,它将此错误解释为“进程没有适当的权限将local_address绑定到socket_descriptor指向的套接字(例如,如果socket_descriptor是一个地址族为AF_INET的套接字,并且sockaddr_in结构(指向to by local_address) 指定了一个我们限制使用的端口)。
  • 您提到“您可以做的是将代码的绑定部分构建为单独的可执行文件并将其放在 system/bin 中”。我对如何实现它还不够清楚。你能更具体地解释一下吗?有些真正让我感到困惑的是,相同的代码在某些手机上确实有效,但有些则不行。这就是为什么我认为这个问题应该得到解决。如果您有任何线索,请告诉更多。感谢您抽出宝贵时间加入本次讨论。
  • 嗨。假设你想执行helloworld程序并在android上执行,你会怎么做? 1)在你的电脑上编写程序。 2)使用交叉编译器(您可以使用 NDK)构建可执行文件 3)将可执行文件(ARM 二进制)推送到 /system/bin 内的平台(Android 手机)或 4)进入 shell(adb shell),5 ) 运行可执行文件(./myExe) 这应该打印 helloworld。以同样的方式代替 helloworld,您执行绑定操作并从应用程序进程调用应用程序。首先让我们确保这可行。然后我们可以寻找一个更通用的解决方案..希望它清楚....
【解决方案2】:

您不需要 root 绑定到端口 >=1024。您只需要在您的ApplicationManifest.xml 文件中拥有INTERNET 权限。

【讨论】:

  • 这段代码是为蓝牙实现的。不用于互联网目的。
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多