序文
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.mk
vendor/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-nodpi
にdefault_wallpaper.png
を追加します。この目的は、デスクトップの壁紙をオーバーレイすることです。
OK、コンパイルと書き込みテストの結果は書き込み前と同じです。これは、コンパイル後の書き込み結果は aapt
でわかっているためです。システムのデフォルトのオーバーレイが上書きされてコード変更が混乱することを心配する必要はありません。
要約する
この記事では、Android ソース コードをカスタマイズするための次のようなメカニズムとツールをいくつか紹介します。
- オーバーレイ: オーバーレイの概念とディレクトリ構造、およびオーバーレイ ディレクトリとリソースをカスタマイズする方法を紹介します。
- デバッグ ツール:
aapt
ツールの使用方法と、システム イメージ内のリソース情報を表示する方法を紹介します。
この記事がお役に立てば幸いです。ご質問やご提案がございましたら、コメント欄にメッセージを残してください。ありがとう!