起動時に実行可能ファイルを実行して実行し続ける方法は? -- root-access フィールド と linux フィールド と scripts フィールド と services フィールド と init.d フィールド android 関連 問題

How to run an executable on boot and keep it running?


3
vote

問題

日本語

998877766666654330 プログラムから実行可能なビルドを持っています。根ざしたAndroidデバイスで実行したいです。 Androidが私の実行可能ファイルを殺す可能性はいくらですか?

<コード> ./executable1 、次のコマンドを使用して実行可能ファイルを実行することができます。

<事前> <コード> ./executable2

私の要件は、デバイスの起動時にこの実行可能ファイルを実行することです。

次のことを試みました:

  1. ./executable3 の。
    • reboot init.rc5 元の内容にリセットされます。私はこの魔法の魔女がこれを完全にしたと考えました。
  2. / stem/etc/init/bootstat.rcにコマンドを書き込みます
    • <コード> ./executable6
    • <コード> service custom /system/executable
    • <コード> ./executable8 <コード> ./system/dhandler/diag_revealer
  3. 上記のことは働いていません。

英語

I have an executable build from a ndk-build program. I want to run it on a rooted Android device. How much is the possibility that Android will kill my executable?

Using adb shell, I am able to execute my executable using following commands:

adb push executable /sdcard adb shell device:/ $ su device:/ # cd /system device:/system # mount -o rw,remount /system device:/system # mv /sdcard/executable . device:/system # ./executable 

My requirement is to run this executable on device boot.

I have tried following:

  1. Write ./executable in init.rc.
    • On reboot init.rc reset to its original contents. I figured out that Magisk done this.
  2. Write commands in /system/etc/init/bootstat.rc
    • ./executable
    • service custom /system/executable
    • on boot ./system/dhandler/diag_revealer

None of the above thing is working.

              
 
 

回答リスト

6
 
vote
vote
ベストアンサー
 

Androidが私の実行可能ファイルを殺す可能性はいくらですか?

特権ネイティブプロセスは、システムリソースが利用できない、または許可されていないシステムリソースなどのエラーが発生しない場合は、Androidによっては殺害されません。そのフレームワークの中で、<コード> 998877666544330 の下で実行されています。ネイティブプロセスのリソースを管理するには、Androidは<コード> 9988776665544331 を使用します。

プロセスは、カーネルまたは他のUserSpaceプログラムからの信号を受信したときにキルドされます(例:<コード> 998877666554332 command)( 1 、 2 )。カーネルは実際のオペレーティングシステムですが、私たちには見えないが、私たちがデバイスで提供するすべてのものを処理します。開発者は、受信した場合、または完全にITを完全に無視した場合、または完全に無視する場合は、特定の信号にどのように反応するかを彼のコードをプログラムできます(( 3 sigkill を除く。プログラムによって処理することはできません、カーネルからの警告なし、すぐに終了するだけでなく、安全に終了する猶予期間はありません。しかし、カーネルはハードウェアのリソースを短くしない、またはあなたが誤っているのを始めなければあなたの存在を気にしないでしょう。それがプログラミングが重要です。

プログラムは、UID によって支配されているカーネルによって転送される互いの信号(killを含む)を送信することができます( 4 )。ただし、<コード> init カーネルによって開始されたUserSpaceの最初のプロセスは親愛なるものです。カーネルは Dangerable 信号を<コード> 998877666544334 に転送しません。何らかの理由で起こると、カーネルはパニックを取得し、( 5 )

上記のラインのまとめ、プログラム的に(AMAP)、あるいはいくつかのスクリプトトリックを使用することはできません。 / a>として@ alecxs が記載されています。しかし、失効した場合にプロセスが再起動する必要があることを確認したい場合は、Android <コード> 998876655443355 サービスを定義してください。

reboot <コード> init6 元の内容にリセットされます。私はこの魔術がこれをやったと考え出した。

いいえ、マジークはこれをしませんでした。 Androidの<コード> init7 は一時ファイルシステム( 9988776654338 または 998876544439 のような永続的なものではありません)は、すべての再起動時にクリアされます。ルートディレクトリの内容( cgroups0 )は、<コード> 99887766666643311 および 99887666544333313 99887766665443311 から抽出されます。 システムとしてroot を使用して変更されました。そのため、 998877665443314 を永久に変更することはできません 99887766665443315

しかし、新しいINITサービスを定義するには、<コード> 99887766655443316 を変更する必要はありません。 Androidは、<コード> cgroups7 <コード> 9988776643318 <コード> 998877665433318 ( 6 )。そのため、独自の<コード> 998877665443321 ファイルを作成できます。


注: 実際のroot権限を取得し、SELinuxに対処するために、以下のすべてのオプションはマジスクによって異なります。詳細については、詳細についてはを参照してください。

init.d script

MASISKの従来の のような機能を使用して、起動時のプロセスを開始できます。 スクリプトを作成する<コード> kill3

<事前> <コード> kill4

* <コード>はシェルの疑似信号 * Androidの<コード> kill6 (<コード> 99887766555443327 )はバグのバグ、<コード> 9988776 アプレット

<コード> 998877665443329 とSet Permissions:

の下で実行可能ファイルを配置します。 <事前> <コード> init30

998877665543331 でスクリプトを配置することもできますが、それは少し早く実行されます。その段階でファイルシステムのパス(およびその他の必須リソースがある場合)が利用可能であることを確認してください。

init

からプログラムを実行する

もう1つの方法は、INITからバイナリを直接実行することです。 init32 <事前> <コード> init33

設定権限:

<事前> <コード> init34

それはすべて!変更を有効にするためのデバイスを再起動します。

しかしそれは1回の実行で、再起動されません。 998877665443335 ファイルには、使用できないシェルスクリプト機能もいくつかあります。たとえば、stdout / stderrをファイルにリダイレクトすることはできません。これは実行可能プログラム自体によって処理されなければなりません。だから私たちは両方を利用しようとすることができます。シェルスクリプトと<コード> 9988766554433336

file:

INITサービス

9988776666544337 Fileからバイナリを直接実行する代わりに、シェルスクリプトを実行してください。スクリプトを作成する<コード> init38 :

 <コード> init9  

CREATE init0 サービス:

<事前> <コード> init1

<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、および再起動の権限の設定。

その他のパラメータ( 7 、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>、<コード>が必要な場合)ユーザー。 最小要求権限 を付与することは、セキュリティの観点からの推奨されるアプローチです。 機能の詳細については、機能とSELinuxの詳細については

init8 は、5秒ごとにサービスを再起動し続けます(デフォルトごと)。 init9 でサービスを停止できます。 998876655443350 99888776665443351 に再度開始します。
サービスで何が起こるかを確認するには:<コード> init52 。

関連

  • スーパーユーザーSELinuxコンテキストでAndroid Initサービスを実行する方法?
  • ADBシェルからのバックグラウンドでスクリプトを実行する方法?

 

How much is the possibility that Android will kill my executable?

Privileged native processes usually don't get killed by Android except if they can't handle an error occurred inside, such as some system resource not available or permission denied because of SELinux etc. To free up memory, Android only kills processes within its framework i.e. running under zygote. To manage resources for native processes, Android uses cgroups.

Processes are killed when they receive SIGNALS from kernel or other userspace programs (e.g. with kill command) (1, 2). Kernel is the actual operating system, not visible to us but handling everything we do with device. A developer can program his code how to react to a specific signal if received, or completely ignore it (3). Except SIGKILL. Which can't be handled by program, no warning from kernel, no grace period to exit safely, just being terminated immediately. But kernel won't mind your presence unless he gets short on hardware resources or you start misbehaving. That's why programming is important.

Programs can send each other signals (including KILL), which are forwarded by kernel, governed by UID (4). However, init the very first process in userspace started by kernel is the dear one, kernel never forwards dangerous signals to init. And if this happens for some reason, kernel gets panic and reboots (5).

Summarizing above lines, it is possible to avoid being killed (AMAP) programmatically or using some scripting tricks as @alecxs has mentioned. But if you want to make sure that your process should restart if gets killed, define an Android init service.

On reboot init.rc reset to its original contents. I figured out that Magisk done this.

No, Magisk didn't do this. Android's rootfs is a temporary filesystem (not a persistent one like on /system or /data) that gets cleared on every reboot. Contents of root directory (/) are extracted from another partition named boot which contains kernel and ramdisk (though things have changed with system-as-root). So you can't change init.rc permanently unless you extract, modify, repack and reflash boot.img.

But to define a new init service, modifying init.rc isn't necessary. Android parses all .rc files from /etc/init directories located under /system and /vendor (6). So you can create your own .rc file.


NOTE: In order to get real root privileges and to deal with SELinux, all of the options given below depend on Magisk. See this answer for details.

INIT.D SCRIPT

You can use traditional init.d-like feature of Magisk to start a process on boot. Create script /data/adb/service.d/custom.sh:

#!/system/bin/sh  # write log file if executable throws something at stdout/sterr exec >>/data/media/0/executable.log 2>&1  # run script in background to avoid blocking boot chain [ -n "$BG" ] || { BG=Y "$0" & exit; }  # try to ignore signals as much as possible for i in $(seq 64); do trap '' "$i"; done  # execute script whenever exits e.g. when executable gets killed trap "sleep 5; exec $0" EXIT  # avoid multiple instances e.g. if script killed but executable is running pkill -9 -x /system/bin/executable  # execute the binary, should run in foreground, otherwise get in loop echo "$(date): Starting program..." /system/bin/executable  # program is killed, won't reach here if script is killed echo "$(date): Re-executing script..." 

* EXIT is shell's pseudo-signal.
* Android's /system/bin/pkill (from toybox) is buggy, better use busybox applet.

Place the executable under /system/bin and set permissions:

~# chown 0.0 /system/bin/executable /data/adb/service.d/custom.sh ~# chmod 0755 /system/bin/executable /data/adb/service.d/custom.sh 

You can also place script under /data/adb/post-fs-data.d/ but that's executed a bit earlier. Be sure that filesystem paths (and other required resources if any) are available at that stage.

EXECUTE PROGRAM FROM INIT

Another way is to directly execute the binary from init. Create custom.rc file:

#/etc/init/custom.rc  # execute the binary when boot is completed on property:sys.boot_completed=1     exec_background u:r:magisk:s0 -- /system/bin/executable 

Set permissions:

~# chown 0.0 /etc/init/custom.rc ~# chmod 0644 /etc/init/custom.rc ~# chcon u:object_r:system_file:s0 /etc/init/custom.rc 

And that's all! Restart device for changes to take effect.

However it's a one time execution, won't be restarted. Also there are some shell scripting features not available in .rc files. For instance you can't redirect stdout/stderr to a file, this has to be handled by executable program itself. So we can try to make use of both; shell script and .rc file:

INIT SERVICE

Instead of directly executing binary from .rc file, execute a shell script. Create script /system/bin/custom.sh:

#!/system/bin/sh  # write log file if executable throws something at stdout/sterr exec >>/data/media/0/executable.log 2>&1  # execute the binary, should run in foreground, otherwise get in loop echo "$(date): Starting program..." exec /system/bin/executable 

Create init service:

#/etc/init/custom.rc  # define service, use executable here if script not needed service custom /system/bin/custom.sh      # don't start unless explicitly asked to     disabled      # only execute once, don't restart if exited     # don't add if you want to restart service when killed     #oneshot      # run with unrestricted SELinux context to avoid avc denials     # it's required if SELinux is enforcing and service needs access     # to some system resources not allowed by default sepolicy     seclabel u:r:magisk:s0  # start the service when boot is completed on property:sys.boot_completed=1     start custom 

Set permissions on executable, custom.sh and custom.rc as stated above and restart.

Other parameters (7) such as user, group, capabilities are required if you want to run the service as non-privileged user. Granting least required privileges is the recommended approach from security's perspective. See this answer for more details on capabilities and SELinux.

init will keep on restarting service every 5 seconds (by-default) if it gets killed. You can stop the service with setprop ctl.stop custom. Replace stop with start to start again.
To see what happens with service: dmesg | grep init: | tail.

RELATED:

  • How to run an Android init service with superuser SELinux context?
  • How to run a script in background from adb shell?
 
 
 
 

関連する質問

0  Link2SDスクリプトエラー。 [4]:/システム/ etc/init.d/11link2sdを作成できません:>ディレクトリではありません  ( Link2sd mount script error 4 cant create system etc init d 11link2sd no ) 
私のアプリの一部を内部メモリからextsdcardに移動したいです。 このはそうすることができます(私はMarsh Mellowを使っていませんので、ガイドの最初の部分をスキップします)。 LINK2SDをインストールしてマイデバイスを再起動したとき、それはと...

1  Huawei U8350(Android 2.2.2)のAutomount Ext2 SDカード  ( Automount ext2 sd card on huawei u8350 android 2 2 2 ) 
Huawei U8350(Android 2.2.2)initスクリプトはすべてルートパーティションに表示されます。これは実際にはRAMディスク(INITRAMFS)であるため、再起動後も永続的ではありません。 起動時にコマンドを実行して、ルートイメージを開...

2  shスクリプトとinit.dアプリを使用してAPKをインストールできません  ( Cant install apk using sh script and init d app ) 
デバイスが起動しているときにAPKをインストールしようとしています。 APKをインストールするためのシェルスクリプトを書きました: <事前> <コード> 9988776655443330 残念ながら、私がシェルに入ったとき( 'adb shell'を使って)...

0  各起動時に(ネイティブINIT.Dサポートなしで)カスタム.shスクリプトを実行できますか?  ( How can i run a custom sh script at each startup without native init d support ) 
これは、彼らの電話を根ざしたばかりのRookie Androidシステム選手の一般的な関心事のように見えます。最も一般的な方法では、 998877666544330 にスクリプトを投げることができます。 ROMが<コード> 998877666544331 を...

1  起動時にファイアウォールが起動する前にインターネットアクセスをブロックする  ( Block internet access before firewall starts at boot ) 
アイスクリームサンドイッチとDroidWallを持つ古いAndroid携帯電話をファイアウォールとして持っています。そのアプリのためにそれを有効にしない限り、アプリが3Gを使用できないことを確認します。 DroidWallは起動時に起動しますが、アプリがインタ...

0  init.dでスクリプトを削除します  ( Remove the script in init d ) 
私の根ざしたAndroid 4.4.2デバイスにTweakDryptをフラッシュしたいです。しかし、以前は、init.d内のすべてのスクリプトを削除する必要があります。私はそれらを削除するためにUniversal Init.dを使ってみましたが、彼らはしません...

0  INIT.D内の無限ループを開始することは可能ですか?  ( Is it possible to start an infinite loop within init d ) 
Lollipop 5.1.1、CyanogenMod 12.1の下でのodroid XU3のファンを制御するためのinit.dスクリプトを作成したいと思います。 私はすでにLinuxに一つを作り、それをAndroidに移植したいと思います。 スクリプトは5...

1  電話機が起動するたびにスクリプトを使用してアプリキャッシュをクリーニングする方法は?  ( How to clean app cache using script every time the phone boot ) 
私はあらゆる起動のキャッシュをきれいにする多くのアプリがあることを知っていますが、init.d / scriptを使用してストレージを保存したいと思います。 Dalvik-Cache IS / DATA / DALVIK-CACHE / ARM / rm -...

1  Android-x86 Nougatにカスタムブートアップスクリプトを追加する  ( Adding custom bootup script to android x86 nougat ) 
私は私のシステムでAndroid-x86 Nougatを使って幸せでした。その仕事をした皆さんに感謝します。 私はカスタム<コード> 9988766544330 スクリプト(シェルスクリプト)を起動したいという小さな変更を1つにしようとしています。 それは私が...

4  ifup / ifdownスクリプト  ( Ifup ifdown scripts ) 
私はいくつかのネットワーク関連のものとフィディヘルディングして、それらをアンドロイドで試してみたい。 Ubuntuでは、 9988776665544330 にスクリプト呼び出しを追加するだけで、インタフェース(eth0またはwlan0)が上下になると、一部のコ...

2  起動時に/ proc / sysの値を変更する方法(sysctl.confは通常のLinuxでこれを行います)?  ( How can proc sys values be changed at boot sysctl conf does this on normal lin ) 
起動時に<コード> /proc/sys 値を変更する方法 <コード> sysctl.conf <コード> 9988776665444334 ファイルにAndroidおよびエコー値は存在しません。 ...

2  SELinux注入されたルールをacking-packing-boot.imgせずに永続化する方法  ( How to make selinux injected rules persistent without unpacking packing boot img ) 
私はrootアクセスを必要とするアプリケーションに取り組んでいます、そして私は根ざしているが覚醒を持つものではない装置を持っています。このデバイスには、<コード> 998877666544330 Rootが利用可能な存在のみがあります。そのため、マジークやそ...

-1  私のデバイスはinit.dサポートを持っていないようですが、私はinitの束を持っています。*ファイル。どういうわけか同じアプローチを使うことができますか?  ( It seems my device doesnt have init d support but i have a bunch of init fil ) 
<事前> <コード> /system/etc1 これらはinitで始まるすべてのファイルです。* My 9988776544332 partition。 <コード> /system/etc 私はいくつかあります: <コード> -rw-r--r-- ...

1  init.rc起動完了イベントでサービスを開始しません  ( Init rc doesnt start my service on boot completed event ) 
998877666544330 ファイルの最後に次のスニペットを追加しました。 <事前> <コード> #!/system/bin/sh echo hi > /data/hi.txt monkey -p com.example.package 1 1 およ...

2  /data / local/userinit.shにマウントされていません  ( Mount in data local userinit sh is not working ) 
マップ/ SDCARD / DCIMを/ Storage / SDCARD1 / DCIMにマップしたい I9100のCM 12.1を使用する 99887766544330 :に数回の行を書きました。 <事前> <コード> userinit end1 ...

1  スーパーユーザーSELinuxコンテキストを使用してAndroid Initサービスを実行する方法  ( How to run an android init service with superuser selinux context ) 
Android init Serviceを実行したい。私は根ざしたシェルを持つデバイス(製造から根付いたものとして購入されています)を持っています。このデバイスにはマジスクまたは他のSUマネージャーがありませんが、<コード> 99887766544331...

0  init.dスクリプトは実行されません  ( Init d scripts not executed ) 
私はinit.dと一緒に来ないように思われるAndroid 6.0.1を実行している古いSamsumg J120Wを使用しています。 RuyinfernoのUniversal Init.dサポートを使用してinit.dをインストールしました。この主張init....

4  init.dフォルダを使用して起動スクリプトを作成する方法  ( How to create start up scripts using the init d folder ) 
この答えたときに尋ねた質問に答えたとき、彼はスクリプトを実行することが可能ですすべてのブーツ 次のものを含むファイル(拡張子なし)を作成しました: <事前> <コード> 9988776655443330 ターゲットフォルダが存在し、ファイルを 9988776...

2  SELinuxはinit.rc execコマンドを実行するのを防ぎます  ( Selinux prevents my init rc exec command to execute ) 
99887766554333 fileの末尾に 99887766544332 コマンドを追加しました。 <コード> on property:dev.bootcomplete=1 exec u:r:shell:s0 shell shell --...

3  init.dは実行されません  ( Init d doesnt get executed ) 
Samsung S2とカスタムROMを使用している外付けSDカードは/ EMMCにマウントされていますが、/ MNT / SDCARD / EXTERNAL_SDにマウントしてほしい、init.dを使用してマウントできますか? コンテンツで "99mount...

0  init.dスクリプトは値を保つためには機能しません  ( Init d script wont work to keep value ) 
私は、シェルスクリプトを使用してVM、LowMemorykiller、Adj、およびNetのような値を変更してから、init.dフォルダに保存してrootとして実行します。 再起動後、常にデフォルトに戻ります。 そして私はこれをやろうとしていました: このコマ...

0  initサービスはユーザービルドで始まっていません  ( Init service not starting in user build ) 
私はユーザービルドで始まっていないinitサービスを持っています。 UserDebugビルドを実行すると、ユーザービルドでは機能しません。なぜ走っていないのかを把握できないようです。 LogCATでもエラーが発生しません。 <事前> <コード> 9988776...

0  Termuxアプリターミナルアクセスでは、電話の再起動時に自分のRunnitサービスを開始する必要がありますか。  ( On a termux app terminal access where should i put my own runnit service to star ) 
このようなシンプルなサービスを書いた: http://smarden.org/runit/ RunScripts.html#apache2 <事前> <コード> 9988776655443332 電話の再起動時に実行させたいのですが ...

3  起動時に実行可能ファイルを実行して実行し続ける方法は?  ( How to run an executable on boot and keep it running ) 
998877766666654330 プログラムから実行可能なビルドを持っています。根ざしたAndroidデバイスで実行したいです。 Androidが私の実行可能ファイルを殺す可能性はいくらですか? <コード> ./executable1 、次のコマンド...

1  MVを使用してディレクトリを削除できない理由  ( Why i cant remove directory using mv ) 
だからマウントされたディレクトリを空にする必要がある 99887766544330 を使用します。それから私はwhatsapp(内部ストレージ)内容を外部SDカードに移動しようとしています <事前> <コード> mv: can't remove '/data/...

関連する質問

0  Link2SDスクリプトエラー。 [4]:/システム/ etc/init.d/11link2sdを作成できません:>ディレクトリではありません 
1  Huawei U8350(Android 2.2.2)のAutomount Ext2 SDカード 
2  shスクリプトとinit.dアプリを使用してAPKをインストールできません 
0  各起動時に(ネイティブINIT.Dサポートなしで)カスタム.shスクリプトを実行できますか? 
1  起動時にファイアウォールが起動する前にインターネットアクセスをブロックする 
0  init.dでスクリプトを削除します 
0  INIT.D内の無限ループを開始することは可能ですか? 
1  電話機が起動するたびにスクリプトを使用してアプリキャッシュをクリーニングする方法は? 
1  Android-x86 Nougatにカスタムブートアップスクリプトを追加する 
4  ifup / ifdownスクリプト 
2  起動時に/ proc / sysの値を変更する方法(sysctl.confは通常のLinuxでこれを行います)? 
2  SELinux注入されたルールをacking-packing-boot.imgせずに永続化する方法 
-1  私のデバイスはinit.dサポートを持っていないようですが、私はinitの束を持っています。*ファイル。どういうわけか同じアプローチを使うことができますか? 
1  init.rc起動完了イベントでサービスを開始しません 
2  /data / local/userinit.shにマウントされていません 
1  スーパーユーザーSELinuxコンテキストを使用してAndroid Initサービスを実行する方法 
0  init.dスクリプトは実行されません 
4  init.dフォルダを使用して起動スクリプトを作成する方法 
2  SELinuxはinit.rc execコマンドを実行するのを防ぎます 
3  init.dは実行されません 
0  init.dスクリプトは値を保つためには機能しません 
0  initサービスはユーザービルドで始まっていません 
0  Termuxアプリターミナルアクセスでは、電話の再起動時に自分のRunnitサービスを開始する必要がありますか。 
3  起動時に実行可能ファイルを実行して実行し続ける方法は? 
1  MVを使用してディレクトリを削除できない理由