Android 将root权限授予应用程序
我有一个应用程序,其中包括本地部分和高级部分 层 因此,需要授予它root权限才能运行某些 本机函数 正如我之前发布的文章一样,我添加了一段取自Bluez的代码 Utils(hidd.c)Android 将root权限授予应用程序,android,bluetooth,android-ndk,sdp,Android,Bluetooth,Android Ndk,Sdp,我有一个应用程序,其中包括本地部分和高级部分 层 因此,需要授予它root权限才能运行某些 本机函数 正如我之前发布的文章一样,我添加了一段取自Bluez的代码 Utils(hidd.c) if(bind(sk,(struct sockaddr*)&addr,sizeof(addr))=1024。您只需要在文件中获得权限。我想我可以帮您解决这个问题 我们在这里 void gainRoot() { Process chperm; try { chperm=Runti
if(bind(sk,(struct sockaddr*)&addr,sizeof(addr))<0{
关闭(sk);
返回-1;
}
代码由NDK构建成一个.so
不幸的是,它一直返回-1,errno是13,这意味着
拒绝许可
一些有经验的开发人员(这里谢谢)提到
发生错误是因为此应用程序没有足够的权限
它“不应该”是这样的
Process Process=Runtime.getRuntime().exec(“su”)
我认为这意味着您拥有系统许可,但您的
应用程序没有。
(如果我错了,请告诉我)
有没有办法授予应用程序根权限
如有任何回复/线索/提示,将不胜感激
问候-
Sam您不需要root就可以绑定到端口>=1024。您只需要在文件中获得权限。我想我可以帮您解决这个问题 我们在这里
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();
在上述代码中
这应该行得通。可能一旦这项工作开始,我们就可以尝试将其与应用程序集成,而不依赖于可执行文件。我希望我没有把你弄糊涂。如果需要澄清,请告诉我。。。。祝你一切顺利……我想不会。。您只能在根设备上执行此操作。嗨,是的,我的手机已完全根化。嗨,happy2Help,您的方法看起来很酷。我稍后会尝试,并让你知道它是否有效。非常感谢。这段代码是为蓝牙实现的。不是为了上网。我稍后会简短地讲一下。我似乎理解您的概念,但是的,正如您所提到的,如何将其与我的应用程序集成以获得根权限对我来说仍然是未知的。沃特,我先试试你的方法。据我所知。默认情况下,应用程序始终以用户模式运行。即使在普通的linux中,也是这样。执行su时,将使用UID 0创建一个新进程。这意味着它是一个具有根前缀的内核进程。使用此过程,将执行特权任务。同样的事情,我们正在尝试在这里的Android应用程序。如果您希望您的整个应用程序都具有root权限,我认为没有这种支持。您好,happy2Help,在我的例子中,bind()是一个系统调用,我希望可以使用它与我的蓝牙进行交互。但是,当我的代码执行到bind()时,错误表示权限被拒绝。在文档中,它将此错误解释为“进程没有适当的权限将本地_地址绑定到套接字_描述符所指向的套接字(例如,如果套接字_描述符是地址族为AF_INET的套接字,并且结构中的sockaddr_(由本地_地址指向)指定了一个限制使用的端口)。您提到“您可以做的是将代码的绑定部分构建为单独的可执行文件,并将其放置在system/bin中“。我不太清楚如何实施它。你能更具体地解释一下吗?一些真正让我困惑的是,相同的代码在某些手机上确实有效,但有些手机却不行。这就是为什么我认为这个问题应该得到解决。如果你有任何线索,请告诉我更多。感谢您抽出时间参加讨论。嗨。假设您想要执行helloworld程序并在android上执行它,您将如何执行?1) 在pc上编写程序。2)使用交叉编译器(您可以使用NDK)构建可执行文件3)将可执行文件(ARM二进制文件)推送到/system/bin内的平台(Android手机)或4)进入shell(adb shell),5)运行可执行文件(./myExe)这应该打印helloworld。用同样的方法代替helloworld,执行绑定操作并从应用程序进程调用应用程序。首先,让我们确定这是可行的。然后我们可以找到更通用的解决方案。。希望它清楚。。。。
os.writeBytes("bind123\n");
os.flush();