Answers:
环顾我的Android文件系统时,我发现确实有一个/etc/init.d/
目录。在那儿偷看之后,发现/etc/init.d/20userinit
以下几行:
if [ -e /data/local/userinit.sh ];
then
log -p -i -t userinit "Executing /data/local/userinit.sh";
busybux chmod +x /data/local/userinit.sh;
logwrapper /system/bin/sh /data/local/userinit.sh;
setprop cm.userinit.active 1;
fi;
当然,这正是我所需要的,我在计算机上编写了以下脚本,然后将其推送到设备上:
#!/system/bin/sh
dropbear -s -g
(通过推送至设备scp userinit.sh phone:/data/local/userinit.sh
,请注意:))
重新启动设备,然后运行ps | grep "[d]ropbear"
,并且确实可以运行。太酷了!
/data/init.sh
在启动时运行,如果您具有root用户,则可以根据需要对其进行编辑。小心 ;)
编辑:显然,您可能还需要将编辑后的脚本拖入启动映像中。有关如何执行此操作的信息,请参见:http : //forum.xda-developers.com/showthread.php?t=443994
find / -name "init.sh"
任何变化。在启动时还有其他脚本运行吗?
/etc/init.rc
启动外壳程序。它应该调用init.sh,但如果不这样做,则可以使其调用自己的脚本。
/data
但没有/data/init/.sh
或/etc/init.rc
。Grep init
在/etc
(甚至递归)中都找不到该字符串的任何有趣实例。
查找/etc/
目录。通常将其放置在/system/
可以作为RW挂载的分区中:
$ ls -l /etc
lrwxrwxrwx 1 root root 11 Jan 1 2009 /etc -> /system/etc
$ su
$ mount -o remount,rw /system
$ chmod o+w /system/etc # for "adb push"
以上某些步骤可能被替换为:
$ adb root
$ adb remount
然后重新安装RO:
$ chmod o-w /system/etc
$ mount -o remount,ro /system
现在,您的任务是查找*rc
可以修改以实现目标的可执行文件或文件:
$ find /etc -type f -perm +110
$ find /etc -name "*rc"
$ find /etc -name "init*"
$ grep -R /data /etc
$ grep -R /system /etc
Google关于每个候选人的信息,以了解如何使用此文件。
包含自定义脚本的很好的候选者来自以下行:
$ grep service /init*.rc
由于每台设备都是唯一的,因此您可能需要对搜索条件进行猜测...
例如,我发现/etc/mkshrc
Korn shell使用了哪个。我更新了此文件以扩展PATH
env var,现在每次我adb shell
在PATH中都有Busybox符号链接!
另请参阅困难的方式(如果您找不到查找魔术文件的运气):https : //stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc
/system
is system.img
和/etc
is是进入的符号链接/system
。
我尝试了所有这些方法,但没有一个对我有用。但是,有效的方法是基于lord-ralf-adolf的回答, 如何在CM12.1的引导中运行脚本?
基本上,找到文件
/system/etc/install-recovery.sh
并在开头添加以下行
/data/init.sh &
然后
touch /data/init.sh
chmod 755 /data/init.sh
做完了!现在,您可以放入任何内容/data/init.sh
,它将在启动时运行。如果文件/system/etc/install-recovery.sh
不在您的系统中,那么此答案将对您不起作用。不要为创建它而烦恼。
/system/etc/install-recovery.sh
不存在的系统,但是如果存在,它仍然会在引导时执行,因此值得检查。
在Android 5之前的SELinux并非如此,当时一切都很简单enforcing
。您可以将代码放入任何脚本中,也可以将二进制文件替换为在启动时以root特权执行的脚本。另一种方法是定义一个定制init
服务,专门用于从某个目录中批量执行脚本。
以此为基础的定制ROM开发者推出了不同伪init.d
现象一样/etc/init.d/
,/etc/install-recovery.sh
,/etc/init.qcom.post_boot.sh
,/system/bin/debuggerd
,/data/init.sh
,/data/local/userinit.sh
,/data/local/init.d/
等。
但是,使用UID 0
但在受限的SELinux上下文中运行的过程是非常无奈的。服务在启动init.rc
与文件u:r:init:s0
方面甚至无法执行shell脚本的/system/bin/
,所以SELinux策略需要修补注入一个不受限制的情况下如Magisk 定义 u:r:magisk:s0
。之后,可以直接作为init
服务或从init.d
-like目录运行脚本。
有关详细信息,请参见如何在启动时运行可执行文件并使其保持运行状态?
如果安装了magisk,则可以将.sh放在:
/sbin/.magisk/img/.core/service.d/
或者
/sbin/.magisk/img/.core/post-fs-data.d/
不要忘记使其可执行:chmod +x your-script.sh
。
更多信息:https : //github.com/topjohnwu/Magisk/blob/master/docs/guides.md#boot-scripts