AOSP - 如何使用根访问权限运行可执行文件?



我正在构建一个基于Android的"嵌入式"系统,目前我正在尝试实现音频模块固件的更新。
有一个二进制文件可以做到这一点,但问题是它需要根访问权限才能做到这一点(否则它无法访问 GPIO)。
所以现在的问题已经转移到给可执行文件(只是那个可执行文件,不能做完全root)root访问权限。
我已经在这里呆了几天,尝试了很多事情,但没有成功。
我已经尝试过的事情:

  • https://stackoverflow.com/a/13892057/3801327(我这样做了,但仍然没有根。我认为这是因为自Android 4.3以来没有setuid/setgid程序)
  • 在某处阅读可以创建系统服务(调用该服务)并在那里运行需要 root 的代码。按照本指南创建了系统服务,但事实证明它没有root访问权限。

我已经没有想法或东西可以尝试了。我还能做什么?

编辑
我无法使二进制文件以 root 身份运行,但能够在从init.rc启动后运行 shell 脚本,其中有 root 访问权限,并导出/更改我需要的特定 gpio 的权限。这使得以后无需root访问权限即可访问它。

Alex Cohn 的回答 https://stackoverflow.com/a/44456378/215266 是正确的,但这里有更多细节。

初始化进程以根用户身份运行,可以生成其他根进程。您可以使用默认情况下禁用的一次性服务,并通过将系统属性设置为某个值(如1)来启动。

例如在 https://android.googlesource.com/device/google/marlin/+/refs/heads/android10-mainline-a-release/init.common.rc:

service vendor.power_sh /vendor/bin/init.power.sh
class main
user root
group root system
disabled
oneshot
on property:sys.boot_completed=1
start vendor.power_sh

由 init 启动的程序不是 Android 服务,它们是传统的命令行应用程序。上面的例子是一个shell脚本,但如果你愿意,你可以使用C/C++或Java。例如,am命令主要是编写的Java,如果您这样做adb shell cat /system/bin/am您将看到:

#!/system/bin/sh
if [ "$1" != "instrument" ] ; then
cmd activity "$@"
else
base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.android.commands.am.Am "$@"
fi

Am代码的来源在这里,你可以看到它有一个传统的main方法:https://android.googlesource.com/platform/frameworks/base/+/742a67127366c376fdf188ff99ba30b27d3bf90c/cmds/am/src/com/android/commands/am/Am.java

您可以从init.rc启动您的应用程序、服务或可执行文件。

最新更新