2012-04-18 242 views
2

我有一个由本地部分和更高层组成的应用程序。授予应用程序的root权限

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

作为我之前发布的文章,我添加了一段代码,取自Bluez Utils(hidd.c)。

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

这段代码已经被NDK编译为.so了。

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

一些有经验的开发人员(谢谢你)提到 错误发生,因为这个应用程序没有足够的权限。

它 “不应该” 是这样的

工艺过程=调用Runtime.getRuntime()EXEC( “ス”)。

我认为这意味着您拥有系统权限,但您的 应用程序不适用。 (让我知道如果我错了)

有什么办法来授予应用程序具有root权限?

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

关于下述

山姆

+0

猜不到.. 你可以做到这一点,只有在根植设备。 – 2012-04-18 06:29:48

+0

嗨,是的,我的手机已经完全扎根。 – Sam 2012-04-18 07:09:34

+0

你试过我的解决方案吗? – 2012-04-19 04:48:17

回答

1

我想我可以帮助你。

在这里,我们gooo ...

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特权的新进程。所以使用这个过程你可以做任何根操作。有一些特定的语法需要遵循。上面的例子显示了这一点。

所以你可以做的一件事是建立代码的绑定部分作为一个单独的可执行文件,并将其放置在system/bin或通常可执行文件保存的位置。假设可执行文件的名称是bind123然后代替

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

在上面的代码与

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

更换。

这应该工作。可能一旦这个工作正常,我们可以尝试将它与应用程序集成,而不依赖于可执行文件。我希望我不会让你困惑。如果清楚一些清晰,请让我知道....所有最好的...

+0

我稍后再说。我似乎理解你的概念,但是,正如你所提到的,如何将它与我的应用程序集成以获得根权限对我来说仍然是未知的。 watever,我会先尝试你的方法。 – Sam 2012-04-19 09:28:52

+0

好的。我所知道的。应用程序始终默认在用户模式下运行。即使在普通的linux中,也是这样的。当您执行su时,会创建一个具有UID 0的新进程。这意味着它是一个具有root previlages的内核进程。使用这个过程,执行特权任务。我们在Android应用中尝试使用的是同样的东西。如果你想让你的整个应用程序拥有root权限,我不认为有可用的支持。 – 2012-04-20 05:08:49

+0

嗨happy2Help,在我的情况下,bind()是系统调用,我希望我可以用它来与我的蓝牙进行交互。但是,当我的代码执行bind()时,该错误表示权限被拒绝。在文档中,它将此错误解释为“该进程没有适当的权限来将local_address绑定到由socket_descriptor指向的套接字(例如,如果socket_descriptor是一个地址族为AF_INET的套接字,并且sockaddr_in结构(指向to by local_address)指定了一个限制使用的端口) – Sam 2012-04-23 01:35:37

0

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

+0

这段代码是为蓝牙实现的。不适用于互联网目的。 – Sam 2012-04-18 07:10:34