AOSP - 如何获得具有 root 访问权限的可执行文件 运行?
AOSP - How to have an executable run with root access?
我正在构建一个"embedded"系统,基于Android,目前我正在尝试实现更新音频模块的固件。
有一个二进制文件可以执行此操作,但要注意的是它需要 root 访问权限才能执行此操作(否则无法访问 GPIO)。
所以现在的问题已经转移到给可执行文件(而且只是那个可执行文件,不能完全root)root访问权限。
我已经做了几天了,尝试了很多东西,但都没有成功。
我已经尝试过的事情:
- ( I did this, but still no root. I'm thinking its because of No setuid/setgid programs on since Android 4.3)
- 在某处阅读,您可以创建一个系统服务,您可以调用该服务,并且那里有需要 root 运行 的代码。按照this guide创建了一个系统服务,结果发现它没有root权限。
我 运行 没有想法或事情可以尝试。我还可以做些什么 ?
编辑
我无法将二进制 运行 作为 root,但能够 运行 从 init.rc 启动后的 shell 脚本,那里有 root 访问权限,并且 export/change 我需要的特定 gpio 的权限。这使得以后无需根访问就可以访问它。
您可以从 init.rc.
启动您的应用、服务或可执行文件
Alex Cohn 的回答 是正确的,但这里有更多详细信息。
init 进程以 root 身份运行,并且可以产生其他 root 进程。您可以使用默认情况下禁用并通过将系统 属性 设置为某个值(例如 1
.
来启动的 oneshot 服务
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 [ "" != "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
我正在构建一个"embedded"系统,基于Android,目前我正在尝试实现更新音频模块的固件。
有一个二进制文件可以执行此操作,但要注意的是它需要 root 访问权限才能执行此操作(否则无法访问 GPIO)。
所以现在的问题已经转移到给可执行文件(而且只是那个可执行文件,不能完全root)root访问权限。
我已经做了几天了,尝试了很多东西,但都没有成功。
我已经尝试过的事情:
- ( I did this, but still no root. I'm thinking its because of No setuid/setgid programs on since Android 4.3)
- 在某处阅读,您可以创建一个系统服务,您可以调用该服务,并且那里有需要 root 运行 的代码。按照this guide创建了一个系统服务,结果发现它没有root权限。
我 运行 没有想法或事情可以尝试。我还可以做些什么 ?
编辑
我无法将二进制 运行 作为 root,但能够 运行 从 init.rc 启动后的 shell 脚本,那里有 root 访问权限,并且 export/change 我需要的特定 gpio 的权限。这使得以后无需根访问就可以访问它。
您可以从 init.rc.
启动您的应用、服务或可执行文件Alex Cohn 的回答
init 进程以 root 身份运行,并且可以产生其他 root 进程。您可以使用默认情况下禁用并通过将系统 属性 设置为某个值(例如 1
.
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 [ "" != "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