AOSP - 如何让可执行文件以 root 权限运行?

4
我正在构建一个基于Android的“嵌入式”系统,目前正试图实现音频模块固件更新。已经有一个二进制文件可以执行此操作,但问题是它需要root权限才能运行(否则无法访问GPIO)。因此,现在的问题转化为如何给予该可执行文件(仅此可执行文件,不得完全获得root权限)root权限。我已经尝试了几天,并尝试了一些方法,但没有成功。我已经尝试过以下方法: 我已经没有任何想法或尝试方法,还能做什么?
编辑: 我没有成功使二进制文件以root身份运行,但是我能够在init.rc中从启动后运行shell脚本,那里有root权限,并导出/更改我需要的特定gpio的权限,这使得以后无需root访问即可访问该文件。

1
我不是一个 Linux 专家,但你是否尝试过通过 init.rc 文件将可执行文件(chown)的所有者更改为 root 呢? - IIIIIIIIIIIIIIIIIIIIII
检查第一个要点。将条目添加到android_filesystem_config.h中使根成为所有者。对其执行ls -l命令返回:"-rwsr-sr-x root root"。 - Rick Sanchez
2个回答

2
亚历克斯·科恩的回答https://dev59.com/BqLia4cB1Zd3GeqPjXMX#44456378是正确的,但以下是更多细节。
init进程以root身份运行并可以生成其他root进程。您可以使用默认情况下禁用的oneshot服务,并通过将系统属性设置为某个值(例如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


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

我在文档中找不到如何启动应用程序的任何信息。而且可执行文件必须在操作系统启动后使用,现在运行它没有意义。那只剩下服务了?这是常规的Java系统服务吗?因为根据我的问题链接,我知道如何在Java端制作系统服务,但不知道在本地端该怎么做?谢谢 ): - Rick Sanchez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接