回答:
私の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
ブート時に実行されます。ルートがある場合は、好きなように編集できます。注意してください ;)
編集:どうやら、編集したスクリプトをブートイメージにシューホーンする必要があるようです。ここでそれを行う方法に関する情報: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シェルで使用されているものを見つけました。このファイルを更新してPATH
env var を拡張すると、そのたびにadb shell
PATHにBusyboxのシンボリックリンクが追加されます。
難しい方法も参照してください(マジックファイルを見つけることができない場合):https : //stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc
/system
は当てはまりません。where はsystem.img
であり/etc
、へのシンボリックリンク/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
存在しないシステムがありますが、存在する場合はブート時に実行されるため、確認する価値があります。
SELinuxがそうではなかったAndroid 5以前は、物事は簡単でしたenforcing
。任意のスクリプトにコードを配置したり、ブート時にルート特権で実行されたスクリプトでバイナリを置き換えることができます。別の方法は、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
ファイルで開始されたサービスは、シェルスクリプトを実行することさえできないため、SELinuxポリシーにパッチを適用して、Magisk 定義などの無制限のコンテキストを挿入する必要があります。その後、サービスとして、または-likeディレクトリからスクリプトを直接実行できます。u:r:init:s0
/system/bin/
u:r:magisk:s0
init
init.d
詳細については、起動時に実行可能ファイルを実行し、実行し続ける方法を参照してください。
あなたが持っている場合は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