起動時にスクリプトを実行するにはどうすればよいですか?


51

Linuxでブート時にスクリプトを実行することに慣れていますが、Androidでこれを行う方法がわかりません。起動時にSSHデーモンを起動したいので、いつでも接続できます。Androidブートで任意のスクリプトを実行するにはどうすればよいですか?これはDalvikの外部で行うことが望ましいでしょう。

回答:


42

私の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"、十分に実行されていることを確認しました。かっこいい!


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
消防士

9

/data/init.shブート時に実行されます。ルートがある場合は、好きなように編集できます。注意してください ;)

編集:どうやら、編集したスクリプトをブートイメージにシューホーンする必要があるようです。ここでそれを行う方法に関する情報:http : //forum.xda-developers.com/showthread.php?t=443994


1
はい、CM7-RC1を実行しているNexus Oneでこのファイルを見つけることができません。a find / -name "init.sh"が何かを上げるかどうかを確認します。起動時に実行される他のスクリプトはありますか?
ナフトゥリケイ

1
/etc/init.rcシェルを起動するが必要です。init.shを呼び出す必要がありますが、そうでない場合は、独自のスクリプトを呼び出すようにできます。
マシュー

残念ながら、私もそのスクリプトを持っていませんが、解決策を見つけました。
ナフトゥリケイ

3
Androidのバージョンは何ですか?4.3は持っていません/dataが、ありません/data/init/.sh/etc/init.rc。grepは、文字列のいずれかの興味深いインスタンスが見つかりませんinit/etc(でも、再帰的に)。
ステファンゴーリチョン

AOSPをビルドするときにスタートアップスクリプトを追加する方法はありますか?
サレ

4

/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シェルで使用されているものを見つけました。このファイルを更新してPATHenv var を拡張すると、そのたびにadb shellPATHにBusyboxのシンボリックリンクが追加されます。

難しい方法も参照してください(マジックファイルを見つけることができない場合):https : //stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc


しかし、起動するたびに上書きされるのではないでしょうか?/ etcフォルダはramdiskであるcpioの一部だと思います。
ransh

1
@ranshこれは、少なくとも8.1.0_r60に/systemは当てはまりません。where はsystem.imgであり/etc、へのシンボリックリンク/systemです。
Ciro Santilli新疆改造中心法轮功六四事件

1

これらすべての方法を試してみましたが、どれも役に立たなかった。しかし、ここで働いたのは、ここで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がシステムにない場合、この回答は機能しません。わざわざ作成しないでください。


1
実際、/system/etc/install-recovery.sh存在しないシステムがありますが、存在する場合はブート時に実行されるため、確認する価値があります。
jcaron

1

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:s0initinit.d

詳細については、起動時に実行可能ファイルを実行し、実行し続ける方法を参照してください


0

簡単な方法(作業):

  1. / system / xbin / post-boot(exec permを設定)などのスクリプトで起動後コマンドを準備します

  2. /system/etc/init.qcom.post_boot.shの最後に上記のカスタムスクリプトパスを追加します

例えば:

echo / system / xbin / post-boot >> /system/etc/init.qcom.post_boot.sh

できた!

(qcom post_boot(Qualcommデバイス)が見つからない場合は、post_bootスクリプトを探してください)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.