权限提升:在Android设备上执行diag_mdlog命令解决方案

6次阅读
没有评论

解决方案:关于Android设备上执行diag_mdlog命令的问题

问题背景

用户遇到了执行 diag_mdlog 命令时遇到权限访问被拒绝的错误。命令尝试在 /sdcard/abc 目录下创建文件和日志,但因权限不足而失败。具体表现为运行脚本或直接使用 su -c 执行命令时均无法成功。

问题分析

  1. 用户尝试通过各种方式执行该命令并给出详细日志信息。
  2. 从提供的日志可以看出,当用户尝试以 su 身份运行命令时遇到了权限问题。
  3. 命令未在 Termux 中执行成功,且需要进一步了解 Android 系统如何利用挂载命名空间控制存储的访问权限。

解决方案概述

为了确保命令在 App 内能够正确执行而不受限于当前应用的权限限制,建议以下步骤:

  1. 创建自定义 init 脚本:通过创建一个可以管理 diag_mdlog 的自定义 init 脚本来启动和停止该服务,从而实现权限的提升,并确保命令能够在系统级别上被执行。
  2. 创建 App 内控制机制:为应用程序添加控件来启用或禁用与上述 init 脚本相关联的功能。

详细步骤

  1. 创建 Init Shell Script
  2. 创建一个 shell 脚本,该脚本将 diag_mdlog 服务设置为后台运行,例如:

    sh
    #!/system/bin/sh
    /vendor/bin/diag_mdlog -o /sdcard/oem_logs -f /sdcard/Test.cfg &

  3. 提升 App 控制权限的代码

  4. 在 Android 应用中,允许获取设备的 root 权限。注意,在大多数安全配置的应用内执行 su 命令需要确保应用拥有足够的信任和权限。
  5. 使用以下伪代码示范如何从应用程序内部执行命令:

    java
    try {
    Process proc = Runtime.getRuntime().exec("su -c '/init.d/your_diag_mdlog_script.sh'");
    int result = proc.waitFor();
    if (result == 0) {
    // 命令成功
    } else {
    // 命令失败,捕获和处理错误代码
    }
    } catch (IOException e) {
    e.printStackTrace();
    } catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    e.printStackTrace();
    }

  6. 创建和初始化 Prop文件

  7. 通过向 build.prop 指定特定的属性来控制自定义服务的状态,例如:

    diag_mdlog_enabled=false

  8. 在 Init System 中管理脚本

  9. 编写一个实际的 init 脚本来根据 diag_mdlog_enabled 系统属性决定是否启动或停止 diag_mdlog。确保该脚本可从系统中调用,例如 /system/etc/init.d/10 DIAG_Log.sh

  10. 管理脚本执行

  11. 当用户启用或禁用 diag_mdlog 服务时在应用程序代码内更新上述属性值,并重新启动相应的 init 脚本以应用更改。

通过按照上述建议步骤操作,可以实现从 Android 应用程序调用具有提升权限的 shell 命令来执行特定任务。务必确保所有修改都符合设备的安全和合规性要求,且在开发过程中严格遵循相关的权限管理规定。

正文完