Android システムは init.custom.rc をカスタマイズおよび動的に変更します

Android オペレーティング システムの奥深くでは、init.rcファイルが重要な役割を果たし、システムの起動時に実行されるサービスとコマンドを定義します。しかし、独自のカスタム init.custom.rc を追加してから、カスタム サービスまたはコマンドをカスタム ファイルに追加する場合はどうすればよいでしょうか? この記事では、 Android でinit.custom.rcファイルをカスタマイズおよび動的に変更する方法を説明します。

一連の記事
Android システム init.rc は、初回起動時にファイル ノード実装と原理分析を作成します
Android システム init.rc は、Android システム起動時にシェル スクリプトを実行します
init.rc sys/class システム ノードをソリューションと原理分析に書き込むことができません
Android system init.rc
Androidシステムカスタム動的変更の詳細ファイル説明 init.custom.rc

1. 要件の前提条件

私の目標は、init.custom.rc システムの起動完了後にスクリプトを実行する新しいサービスをファイルに追加することです。さらに、ファイル システム データが利用可能になった後に新しいディレクトリを作成し、コードを再コンパイルせずにサービスやスクリプトを動的に変更および追加できるようにしたいと考えています。

2. 最初の試み

当初のアイデアは、init.rc新しいサービスとコマンドをファイルに直接追加することでした。init.rcただし、この方法では、特に複数のカスタム サービスやコマンドがある場合、メイン ファイルが混乱する可能性があります。追加したサービスやシステムが混乱するのは望ましくありません。また、問題のトラブルシューティングを行ってから試すのが不便になりますさらに遠く。

3. 通過した罠

system/core/rootdirディレクトリ内にあるAndroid.mkおよびファイルの内容から、プロジェクトが 2 つのビルド システム (古いビルド システムと新しいビルドAndroid.bpシステム) を同時に使用しているようであることがわかります両方のビルド システムを追加するには、次の手順に従います。Android.mkAndroid.bpcustom.init.rc

Android.mk を追加します。

ファイル内でAndroid.mk適切な場所を見つけて、次の内容を追加します。

include $(CLEAR_VARS)

LOCAL_MODULE := init.custom.rc
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/init

include $(BUILD_PREBUILT)

init.custom.rcファイルが とAndroid.mk同じディレクトリにあることを確認してください。

Android.bp を追加します。
  1. ファイル内でAndroid.bp適切な場所を見つけて、次の内容を追加します。
prebuilt_etc {
    name: "init.custom.rc",
    src: "init.custom.rc",
    sub_dir: "init",
}

init.custom.rcファイルが とAndroid.bp同じディレクトリにあることを確認してください。

しかし...この変更は役に立たないので、別の方法を見つける必要があります。

エラーを追加した後、新しいinit.custom.rcファイルを Android ビルド システムに追加しようとしたときに問題が発生しました。MODULE.TARGET.ETC.custom.init.rcファイルが 2 回定義されています。これは、同じファイルを 2 つの異なる場所で定義しようとしていることを意味します build/make/core/base_rules.mk:325: error: system/core/rootdir: MODULE.TARGET.ETC.custom.init.rc はすでに system/ によって定義されていますcore/rootdir
(エラーの理由は、Android.mk と Android.bp に同時に追加し、最終的にどちらかを削除しても要件を満たさなかったためです)

3. 最終的な解決策

コードをよりモジュール化するために、importステートメントを使用してメイン ファイル内に名前を付けた新しいファイルをinit.rcインポートしてみることにしました。init.custom.rcこうすることで、すべてのカスタム サービスとコマンドをメイン ファイルに混在させるのではなく、この新しいファイルに配置できます。

既存のファイル.rcでステートメントを使用しますimportこれにより、.rc複数のファイルの内容をよりモジュール的に編成し、init.rcメイン ファイルにインポートできるようになります。

この問題を解決するために、次の手順が実行されました。

Customize.mk を変更します

vendor/customizeディレクトリcustomize.mkファイルを編集し、次の内容を追加します。

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/init.custom.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.custom.rc
init.rc を変更します

system/core/rootdirディレクトリで、init.rcファイルに次の変更を加えます。

@@ -8,6 +8,7 @@ import /init.environ.rc
import /system/etc/init/hw/init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
+import /vendor/etc/init/hw/init.custom.rc
init.custom.rc を追加しました

vendor/customizeディレクトリの下にinit.custom.rcファイルを作成し、次の内容を追加します。

# Define a service to copy video
service copy_video2 /system/bin/sh /system/bin/copy_video.sh
    class main
    user root
    group root
    seclabel u:r:shell:s0
    oneshot

# Start the service on boot completed
on property:sys.boot_completed=2
    start copy_video2

# Create a directory after the file system data is available
on post-fs-data
    mkdir /mnt/custom3 0755 root root

渡されるとPRODUCT_COPY_FILESinit.custom.rcコンパイル時にコピーされます/vendor/etc/init/hw/init.custom.rc

検証方法
ADB を使用して root 権限を取得します。
adb root
システムパーティションを再マウントします
adb remount
init.custom.rcデバイスからファイルをプルします:
adb pull /vendor/etc/init/hw/init.custom.rc .
ローカルinit.custom.rcファイルを変更します (たとえば、 に/mnt/custom3変更して/mnt/custom4、ファイルをデバイスにプッシュして戻します)
adb push .\init.custom.rc /vendor/etc/init/hw/init.custom.rc
ファイルシステムを同期し、デバイスを再起動します。
adb shell sync
adb shell reboot
再起動後、変更が有効になっているかどうかを確認します。
adb shell
cd /mnt
ls

custom4ディレクトリが表示されれば、変更は正常に反映されています。
ここに画像の説明を挿入します

上記の方法により、Android システムの起動スクリプトをカスタマイズすることに成功し、その有効性を検証しました。これにより、Android システム開発者は、システム機能をカスタマイズおよび拡張する柔軟な方法が提供されます。

4 結論

init.rcこのプロセスを通じて、 Android システム内のファイルをカスタマイズし、動的に変更する方法を学びました。これには Android ビルド システムにある程度の精通が必要ですが、基本的な概念をマスターすれば、プロセスは比較的簡単です。

おすすめ

転載: blog.csdn.net/SHH_1064994894/article/details/132488115