我正在构建一个"嵌入式"系统,基于Android,目前我正在尝试更新音频模块的固件
有一个二进制文件可以做到这一点,但问题是它需要root访问才能执行它(否则它无法访问GPIO)。
所以问题现在已转移到提供可执行文件(只是那个可执行文件,不能完全root)root访问权限。
我已经在这里待了几天,尝试过很多东西,但都没有成功
我已经尝试过的事情:
我的想法或事情已经用尽了。我还可以做些什么 ?
修改
我无法以root身份运行二进制文件,但能够从 init.rc 启动后运行shell脚本,其中有root访问权限,并导出/更改特定gpio的权限我需要。这样就可以在以后无需root权限的情况下访问它。
答案 0 :(得分:2)
亚历克斯·科恩(Alex Cohn)的答案https://stackoverflow.com/a/44456378/215266是正确的,但是这里有更多详细信息。
init进程以root身份运行,并且可以生成其他root进程。您可以使用oneshot服务,该服务默认情况下处于禁用状态,并且可以通过将系统属性设置为某个值(例如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 [ "$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 :(得分:-1)
您可以从init.rc启动您的应用,服务或可执行文件。