我有一个由原生部分和更高部分组成的应用程序 层
因此,需要授予root权限才能运行某些权限 本地功能。
正如我之前发布的文章,我添加了一段从Bluez获取的代码 utils的(hidd.c)。
if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
close(sk);
return -1;
}
代码已经被NDK构建为.so。
不幸的是,它一直返回-1而errno是13,这意味着 权限被拒绝。
一些有经验的开发人员(谢谢你在这里)提到了这一点 发生错误,因为此应用程序没有足够的权限。
它“不应该”像是
Process process = Runtime.getRuntime()。exec(“su”);
我认为这意味着你拥有系统许可但是你的 申请不是。 (如果我错了,请告诉我)
有没有办法授予应用程序拥有root权限?
任何回复/线索/提示都将受到高度赞赏。
问候 -
萨姆
答案 0 :(得分: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();
在上面的代码中。
这应该有效。可能一旦这个工作,我们可以尝试将它与应用程序集成,而不依赖于可执行文件。我希望我不要混淆你。如果有一些清晰度是neede,请告诉我....最好的......
答案 1 :(得分:0)
您不需要root绑定到端口&gt; = 1024。您只需INTERNET个文件中的ApplicationManifest.xml权限。