Java 访问/dev/diag所需的权限

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

我试图使用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: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策略中允许不受信任的应用?或者应用程序域标签就足够了?怎么做@哈米德沙图