Android ソースコードのカスタマイズ: オーバーレイ ディレクトリのカスタマイズ | オーバーレイ リソースが有効かどうかのデバッグ

序文

Android ビルド システムには、ソース コードのカスタマイズと最適化に役立つ次のようなメカニズムとツールがいくつかあります。

  • オーバーレイ: これは、システム リソース (文字列、アイコン、レイアウトなど) を変更または置換するためのメカニズムです。ソース コードを変更せずに、システム リソースをカスタマイズおよび最適化できます。

Android ソース コードのカスタマイズ: 不要なランチの削除 | 新しいランチ | Customize.mk
Android ソース コードのカスタマイズ: MK ファイルの実行順序 | 属性のオーバーライド

この記事では、これらのメカニズムとツールの基本概念と使用法を紹介し、いくつかの例を使用してそれらを使用して Android ソース コードをカスタマイズおよび最適化する方法を示します。また、変更が有効になっているかどうかをデバッグする方法と、変更の詳細を表示する方法についても説明します。

1. オーバーレイディレクトリをカスタマイズする方法

Android では、オーバーレイはシステム リソース (文字列、アイコン、レイアウトなど) を変更または置換するために使用されるメカニズムです。オーバーレイは、ソース コードを変更せずにシステム リソースをカスタマイズおよび最適化できます。オーバーレイは通常、次のようなデバイス関連またはメーカー関連のディレクトリにあります。

  • device/rockchip/common/overlay
  • vendor/customize/rk3568_s_beta/overlay(これはカスタムディレクトリです)

ビルド システムはシステム イメージを生成するときに、さまざまなターゲット プラットフォームや製品に応じて対応するオーバーレイ ディレクトリを選択し、DEVICE_PACKAGE_OVERLAYS 変数に追加します。この変数は、オーバーレイ リソースが含まれるディレクトリを指定するために使用されます。

# 这是系统默认的
DEVICE_PACKAGE_OVERLAYS += device/rockchip/common/overlay

私のものは に含まれているのでcustomize.mk a>< で印刷をテストしました。 a i=4>結果はです。 を使用し、それが正しいディレクトリを指していることを確認したい場合は、アクセスする前に他の Makefile がそのディレクトリを変更していないこと、および < を呼び出していることを確認する必要があります。別の Makefile からインクルードするのではなく、ビルド システムから直接 i=7> を使用します。 device/rockchip/rk356x/device.mkvendor/customize/customize.mk$(LOCAL_PATH)device/rockchip/rk356x$(LOCAL_PATH)vendor/customize/customize.mk

変数をカスタマイズしてMY_CUSTOM_PATH := $(TOP)/vendor/customize出力してください./vendor/customize

MY_CUSTOM_PATH := $(TOP)/vendor/customize
$(warning Enter $(MY_CUSTOM_PATH)/rk3568_s_beta)
# 这句话的意思就是加载当前设备厂商的overlay路径./vendor/customize/rk3568_s_beta/overlay
DEVICE_PACKAGE_OVERLAYS += $(MY_CUSTOM_PATH)/rk3568_s_beta/overlay

このようにしてmakeを実行すると、ビルド システムはこのディレクトリをオーバーレイ リソースの検索パスに追加します。

システム リソースが複数のオーバーレイ ディレクトリで変更または置換されると、それらが競合して上書きされる可能性があります。この状況を回避するために、Android のビルド システムには、リソースの競合とオーバーライドをチェックして処理するためのルールとツールがいくつか用意されています。

リソースの上書き順序は、DEVICE_PACKAGE_OVERLAYS 変数で指定されたディレクトリの順序によって決まります。つまり、後で指定したディレクトリは、前に指定したディレクトリ内の同じ名前とタイプのリソースを上書きします。

  • でテストします。たとえば、システムの SettingsProvider は def_bluetooth_on と呼ばれ、Bluetooth がデフォルトで有効かどうかを指定するために使用されます。これは次の場所で定義および割り当てられます。
# 这是系统源码目录下的
ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk/frameworks/base/packages/SettingsProvider$ grep -rn "def_bluetooth_on"
src/com/android/providers/settings/DatabaseHelper.java:2476:                    R.bool.def_bluetooth_on);
res/values/defaults.xml:39:    <bool name="def_bluetooth_on">true</bool>

# 源码默认overlay部分:
ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk/device/rockchip$ grep -rn "def_bluetooth_on"
common/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml:22:    <bool name="def_bluetooth_on">false</bool>
common/overlay_go/frameworks/base/packages/SettingsProvider/res/values/defaults.xml:26:    <bool name="def_bluetooth_on">false</bool>
rk356x/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml:26:    <bool name="def_bluetooth_on">false</bool>

# 自定义overlay部分,这里我明明是写的true,但我编译测试发现蓝牙还是没有默认打开
ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk/vendor/customize$ grep -rn "def_bluetooth_on"
rk3568_s_beta/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml:27:    <bool name="def_bluetooth_on">true</bool>

オーバーレイに関していくつかの疑問があるためだと思います。1 つは device/rockchip/
common/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults です。 .xml、2 番目は /vendor/customize/
rk3568_s_beta/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml です。

  • device/rockchip/common/overlay ディレクトリには、defaults.xml というリソース ファイルがあり、システム リソースの変更または置換に使用されます。次の場所で def_bluetooth_on の値を false に変更します。
device/rockchip/common/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml:22:    <bool name="def_bluetooth_on">false</bool>
  • vendor/customize/rk3568_s_beta/overlay ディレクトリには、オーバーレイ ディレクトリをカスタマイズしました。また、defaults.xml というリソース ファイルもあり、システム リソースの変更または置換に使用されます。 。次の場所で def_bluetooth_on の値を true に変更します。
rk3568_s_beta/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml:27:    <bool name="def_bluetooth_on">true</bool>

私の最初の理解では、実行時にmake、ビルド システムは上記のディレクトリをオーバーレイ リソースの検索パスに追加し、DEVICE_PACKAGE_OVERLAYS 変数はリソースの上書きを処理します。最初に device/rockchip/common/overlay が指定され、次に vendor/customize/rk3568_s_beta/overlay が指定されるため、後者は前者の同じ名前および種類のリソースを上書きします。つまり、最終的に生成されるシステム イメージでは、def_bluetooth_on の値は true に設定されますが、結果は false のままになります。 。 。

後の実際のテストでは理解と全く同じではないので、システムメーカーディレクトリにあるオリジナルのオーバーレイディレクトリをコメントアウトして、カスタマイズしたオーバーレイディレクトリのみを使用する予定です。

+++ b/device/rockchip/rk356x/rk3568_s/rk3568_s.mk
@@ -13,7 +13,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #

 # First lunching is S, api_level is 31
 PRODUCT_SHIPPING_API_LEVEL := 31
 PRODUCT_DTBO_TEMPLATE := $(LOCAL_PATH)/dt-overlay.in
@@ -26,7 +31,7 @@ $(call inherit-product, device/rockchip/rk356x/device.mk)
 $(call inherit-product, device/rockchip/common/device.mk)
 $(call inherit-product, frameworks/native/build/tablet-10in-xhdpi-2048-dalvik-heap.mk)
 
-DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/../overlay
+#DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/../overlay
 
 PRODUCT_CHARACTERISTICS := tablet
 
ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk$ git diff device/rockchip/common/BoardConfig.mk
diff --git a/device/rockchip/common/BoardConfig.mk b/device/rockchip/common/BoardConfig.mk
index 4724a3bd46..d164031bf5 100755
--- a/device/rockchip/common/BoardConfig.mk
+++ b/device/rockchip/common/BoardConfig.mk
@@ -199,12 +199,12 @@ VENDOR_SECURITY_PATCH := $(PLATFORM_SECURITY_PATCH)
 
 TARGET_BOOTLOADER_BOARD_NAME ?= rk30sdk
 TARGET_NO_BOOTLOADER ?= true
-ifeq ($(filter atv box, $(strip $(TARGET_BOARD_PLATFORM_PRODUCT))), )
-DEVICE_PACKAGE_OVERLAYS += device/rockchip/common/overlay
-ifneq ($(BOARD_HAS_RK_4G_MODEM), true)
-DEVICE_PACKAGE_OVERLAYS += device/rockchip/common/overlay_wifi_only
-endif
-endif
+#ifeq ($(filter atv box, $(strip $(TARGET_BOARD_PLATFORM_PRODUCT))), )
+#DEVICE_PACKAGE_OVERLAYS += device/rockchip/common/overlay
+#ifneq ($(BOARD_HAS_RK_4G_MODEM), true)
+#DEVICE_PACKAGE_OVERLAYS += device/rockchip/common/overlay_wifi_only
+#endif
+#endif

2. オーバーレイリソースが有効かどうかをデバッグする

システム リソースを変更または置換した後、変更がシステム イメージに正しく適用されているかどうかを確認する必要がある場合があります。これを迅速にデバッグするために、いくつかのツールを使用してシステム イメージ内のリソース情報を表示し、それらがオーバーレイ リソースと一致しているかどうかを比較できます。

一般的に使用されるツールはaaptです。これは、Android アプリケーション パッケージを操作するためのコマンド ライン ツールです。これを使用して、APK 内のリソースとメタデータを表示、追加、削除、または変更できます。 aapt を使用すると、システム イメージ内の APK ファイル内のリソース情報を表示できます。例:

aapt d resources out/target/product/rk3568_s/system/priv-app/SettingsProvider/SettingsProvider.apk

このコマンドは、リソース名、ID、タイプ、値、サイズ、参照などを含むすべてのリソース情報をSettingsProvider.apkに出力します。特定のリソースを表示したい場合は、grep コマンドを使用して出力をフィルタリングできます。例:


aapt d resources out/target/product/rk3568_s/system/priv-app/SettingsProvider/SettingsProvider.apk  | grep def_bluetooth_on

このコマンドは、def_bluetooth_on に関連するリソース情報を出力します。例:

ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk$ aapt d resources out/target/product/rk3568_s/system/priv-app/SettingsProvider/SettingsProvider.apk  | grep def_bluetooth_on
      spec resource 0x7f02000d com.android.providers.settings:bool/def_bluetooth_on: flags=0x00000000
        resource 0x7f02000d com.android.providers.settings:bool/def_bluetooth_on: t=0x12 d=0xffffffff (s=0x0008 r=0x00)

この出力は、def_bluetooth_on がブール型リソースであり、その値がtrue (0xffffffff) であることを示しています。この出力を使用して、オーバーレイ リソースが有効かどうかを判断できます。

vendor\customize\rk3568_s_beta\overlay\frameworks\base\packages\SettingsProvider\res\values\defaults.xml中修改def_bluetooth_on<bool name="def_bluetooth_on">true</bool>

コンパイル後、次の出力が表示されます。

ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk$ aapt d resources out/target/product/rk3568_s/system/priv-app/SettingsProvider/SettingsProvider.apk  | grep def_bluetooth_on
      spec resource 0x7f02000d com.android.providers.settings:bool/def_bluetooth_on: flags=0x00000000
        resource 0x7f02000d com.android.providers.settings:bool/def_bluetooth_on: t=0x12 d=0xffffffff (s=0x0008 r=0x00)

これは、オーバーレイ リソースが有効になったことを意味します。最終的に、実際のテストでは、起動時に Bluetooth がデフォルトでオンになることもわかりました。

vendor\customize\rk3568_s_beta\overlay\frameworks\base\packages\SettingsProvider\res\values\defaults.xml中修改def_bluetooth_on<bool name="def_bluetooth_on">false</bool>

ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk$ aapt d resources out/target/product/rk3568_s/system/priv-app/SettingsProvider/SettingsProvider.apk  | grep def_bluetooth_on
      spec resource 0x7f02000d com.android.providers.settings:bool/def_bluetooth_on: flags=0x00000000
        resource 0x7f02000d com.android.providers.settings:bool/def_bluetooth_on: t=0x12 d=0x00000000 (s=0x0008 r=0x00)

これは、オーバーレイ リソースは有効ですが、def_bluetooth_onその結果は閉じられていることを意味します。

さまざまなオーバーレイ設定でリソース情報を簡単に比較するために、テーブルを使用して表示し、簡単に比較できるようにします。

リソース名 リソースID タイプ 価値 サイズ リソース参照
com.android.providers.settings:bool/def_bluetooth_on (オーバーレイを true に設定) 0x7f02000d ブール 0xffffffff (真) 0x0008 0x00
com.android.providers.settings:bool/def_bluetooth_on (オーバーレイを false に設定) 0x7f02000d ブール 0x00000000 (偽) 0x0008 0x00
  • 0xffffffffこの文脈では、 は通常true を意味します。
  • 0x00000000 表示false
  • r=0x00: これはリソースへの参照です。この場合、それは 0 であり、リソースが他のリソースを参照しないことを意味します。

テスト

vendor\customize\rk3568_s_beta\overlay\frameworks\base\packages\SettingsProvider\res\values\defaults.xml追加されたこの目的は、Wi-Fi、Bluetooth、およびデフォルトのバックライト 244 をデフォルトでオンにすることです。

<resources>
    <bool name="def_wifi_on">true</bool>
    <bool name="def_bluetooth_on">true</bool>
    <integer name="def_screen_brightness">244</integer>
</resources>

vendor\customize\rk3568_s_beta\overlay\frameworks\base\core\res\res\drawable-sw720dp-nodpidefault_wallpaper.png を追加します。この目的は、デスクトップの壁紙をオーバーレイすることです。 ここに画像の説明を挿入します
OK、コンパイルと書き込みテストの結果は書き込み前と同じです。これは、コンパイル後の書き込み結果は aapt でわかっているためです。システムのデフォルトのオーバーレイが上書きされてコード変更が混乱することを心配する必要はありません。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

要約する

この記事では、Android ソース コードをカスタマイズするための次のようなメカニズムとツールをいくつか紹介します。

  • オーバーレイ: オーバーレイの概念とディレクトリ構造、およびオーバーレイ ディレクトリとリソースをカスタマイズする方法を紹介します。
  • デバッグ ツール:aapt ツールの使用方法と、システム イメージ内のリソース情報を表示する方法を紹介します。

この記事がお役に立てば幸いです。ご質問やご提案がございましたら、コメント欄にメッセージを残してください。ありがとう!

おすすめ

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