Java 访问/dev/diag所需的权限
我试图使用JNI作为Java 访问/dev/diag所需的权限,java,android,android-ndk,android-permissions,root,Java,Android,Android Ndk,Android Permissions,Root,我试图使用JNI作为open(“/dev/diag”,O_RDWR | O|u LARGEFILE | O|u NONBLOCK”)打开/dev/diag但返回错误号:13权限被拒绝 应该做些什么才能使这项工作成功 使用命令检查/dev/diag的所有权时,它返回crw rw rw-system qcom_diag 244,0 2015-01-14 01:47 diag 当尝试使用命令id时,我得到uid=0(root)gid=0(root)groups=0(root)context=u:r:i
open(“/dev/diag”,O_RDWR | O|u LARGEFILE | O|u NONBLOCK”)打开/dev/diag代码>但返回错误号:13权限被拒绝
应该做些什么才能使这项工作成功
使用命令检查/dev/diag的所有权时,它返回crw rw rw-system qcom_diag 244,0 2015-01-14 01:47 diag
当尝试使用命令id
时,我得到uid=0(root)gid=0(root)groups=0(root)context=u:r:init:s0
所以我认为问题与所有权有关
更新:基于@HamidShatu答案
我试图将SELinux设置为允许,但运气不佳
我尝试了命令su 0 setemforce 0
如果立即使用getemforce
命令进行检查,则在执行命令时返回OK
我甚至试图更改prop.build:该文件不存在,而是一个prop.build.bak,因此我复制了它,将SELinux修改为0而不是1,并在没有.bak扩展名的情况下推送它。甚至我也检查了修改prop.build的外部应用程序,其中SELinux设置为0,但是当使用getenforce命令检查时,它仍然返回强制
以下是dmesg的摘录:
[18177.676603] [0: servicemanager: 743] avc: received setenforce notice (enforcing=1)
[18182.768070] [1: servicemanager: 743] avc: received setenforce notice (enforcing=1)
[18183.231867] [0: init: 1] avc: received setenforce notice (enforcing=1)
[18183.232006] [0: init: 1] avc: received setenforce notice (enforcing=1)
我甚至试图通过添加到清单中使应用程序作为系统应用程序运行:android:sharedUserId=“android.uid.system”
提示:我正在使用play store中的应用程序,这些应用程序可以成功访问/dev/diag。要了解/分析您的问题,也许我们可以先查看您在此处发布的内容
我试图使用JNI作为open(“/dev/diag”,O|RDWR | O|u大文件| O|u非块”)打开/dev/diag
代码>但返回错误号:13权限被拒绝
根据我的经验,errno:13权限被拒绝
表明您的代码存在一些SELinux违规行为
当使用命令检查/dev/diag
的所有权时,它返回crw rw rw-system qcom\u diag 244,0 2015-01-14 01:47 diag
,当尝试使用命令id
时,我得到uid=0(root)gid=0(root)groups=0(root)context=u:r:init:s0
这一部分清楚地表明/dev/diag
目录属于高通公司。根据Android Treble的架构,有3个主要分区属于:
Android系统(谷歌/AOSP)
供应商(芯片制造商)&
OEM(设备制造商)
因此,根据您的分析,/dev/diag
属于供应商分区
所以我认为问题与所有权有关
这个问题的答案几乎是:是的
应该做些什么才能使这项工作成功
您需要添加SELinux权限才能执行此操作。
正如crw rw rw-system qcom\u diag 244,0 2015-01-14 01:47 diag
行建议的那样,您需要添加SELinux权限,以便从system
访问qcom\u diag
这里有一点是,任何类型的diag
权限只在Debug构建中授予,而不是在User构建中授予。因为在User构建中为diag
授予SELinux权限会引起安全问题。它可以通过在日志中打印重要信息来泄漏这些信息。经过几天的努力,我终于能够通过执行以下操作绕过这个问题:
- 我没有将C代码用作共享库,而在共享库中努力打开/dev/diag,而是使用Cmake将其作为可执行的C(.C文件应该有一个主函数),如下所示:
cmake_minimum_required(VERSION 3.4.1)
file(GLOB SRC_FILES
src/main/cpp/*.c)
add_executable(
mylib.so
${SRC_FILES}
)
- 在Java中创建一个新命令,该命令可以使用根权限执行mylib,如下所示:
new String[]{"su", "-c", "exec " + context.getApplicationInfo().nativeLibraryDir + "/" + "mylib.so"}
- 使用process builder执行该命令
process = new ProcessBuilder(command)
.start();
可执行文件能够使用open(“/dev/diag”,O_RDWR | O|u LARGEFILE | O|u NONBLOCK)代码>没有错误 @MRDRAG我在对这个问题的评论中提出了一些要求。你能回答这些问题吗?另外,请尽量更清楚地解释你的目的,让别人更容易理解你的要求。谢谢你的回答。我已经根据你的回答更新了我的问题。如何添加SELinux权限使其生效@是否需要在SELinux策略中允许不受信任的应用?或者应用程序域标签就足够了?怎么做@哈米德沙图