Android源代码是一个庞大的代码工程,包含了若干个项目和成百上千个模块,以及各种不同的硬件平台和设备。为了方便我们开发时选择合适的编译选项和配置文件,Android提供了一个名为lunch的工具,可以在源代码根目录下执行,列出所有可用的产品组合,并让我们选择一个进行编译。每个产品组合都对应了一个比如 device.mk文件,其中定义了该产品的特性和属性,例如设备名称、系统属性、预装应用等。
像我这种强迫症就需要对Android源代码进行一些定制 ,例如移除一些不需要的lunch选项,或者添加一些新的lunch选项,或者修改一些产品的属性。本文将介绍如何进行这些操作,并给出一些示例,本意就是灵活定制项目避免耦合。
移除无用lunch project:
拿到Android源代码中 每次编译选择lunch的时候就很烦,有一堆我们不需要的lunch选项,例如一些针对其他硬件平台或设备的项目,或者一些过时或废弃的项目。这些项目会占用我们的磁盘空间,或者干扰我们的编译过程(有时候还会选错)。为了移除这些无用的lunch选项,我们需要做以下步骤:
步骤1:
打开build/make/target/product/AndroidProducts.mk
文件,这个文件是定义所有可用产品组合的地方。在这个文件中,找到COMMON_LUNCH_CHOICES
变量,这个变量是一个列表,包含了所有通用的lunch选项。可以看到这个列表中有很多以aosp_开头的选项,这些都是针对不同架构和模式的Android通用系统。这些都是Google Android源码原生自带的 我们压根不需要这些选项,直接把它们注释掉。例如:
+++ b/build/make/target/product/AndroidProducts.mk @@ -79,7 +79,7 @@ PRODUCT_MAKEFILES += \ $(LOCAL_DIR)/module_x86.mk \ $(LOCAL_DIR)/module_x86_64.mk \ -COMMON_LUNCH_CHOICES := \ +#COMMON_LUNCH_CHOICES := \ aosp_arm64-eng \ aosp_arm-eng \ aosp_x86_64-eng \
步骤2:
打开device/rockchip/rk356x/AndroidProducts.mk
文件,这个文件是定义针对rk356x平台的所有产品组合的地方。在这个文件中找到PRODUCT_MAKEFILES
变量和COMMON_LUNCH_CHOICES
变量,这两个变量分别是一个列表,包含了所有针对rk356x平台的产品组合的.mk文件路径和lunch选项名称。可以看到,这两个列表中有很多以rk3566_开头或结尾的选项,这些都是针对rk3566芯片的不同设备和模式的系统。如果只需要rk3568芯片的系统,可以把这些选项删除掉。例如:
+++ b/device/rockchip/rk356x/AndroidProducts.mk @@ -15,28 +15,10 @@ # PRODUCT_MAKEFILES := \ - $(LOCAL_DIR)/rk3566_sgo/rk3566_sgo.mk \ - $(LOCAL_DIR)/rk3566_32bit/rk3566_32bit.mk \ - $(LOCAL_DIR)/rk3566_r/rk3566_r.mk \ - $(LOCAL_DIR)/rk3566_s/rk3566_s.mk \ $(LOCAL_DIR)/rk3568_s/rk3568_s.mk \ - $(LOCAL_DIR)/rk3566_eink/rk3566_eink.mk \ - $(LOCAL_DIR)/rk3566_einkw6/rk3566_einkw6.mk COMMON_LUNCH_CHOICES := \ - rk3566_32bit-userdebug \ - rk3566_32bit-user \ - rk3566_sgo-userdebug \ - rk3566_sgo-user \ - rk3566_r-userdebug \ - rk3566_r-user \ - rk3566_s-userdebug \ - rk3566_s-user \ rk3568_s-userdebug \ rk3568_s-user \ - rk3566_eink-userdebug \ - rk3566_eink-user \ - rk3566_einkw6-userdebug \ - rk3566_einkw6-user
步骤3:
删除device目录下的所有不需要的项目文件夹,例如device/amlogic和device/google等。这些文件夹可能包含了一些针对其他硬件平台或设备的源代码和配置文件,不需要它们。例如:
rm -rf device/amlogic rm -rf device/google ...
新建客制化lunch project:
既然定制代码,添加一些新的客制化 或者 自定义lunch选项,例如针对同一个硬件平台或设备的不同版本或模式的系统。为了添加一个新的lunch选项,需要做以下步骤:
步骤1:
在device/rockchip/rk356x目录下,复制一个已有的产品组合的文件夹,例如rk3568_s,作为新的产品组合的基础。给这个新的文件夹取一个有意义的名字,我就随便搞个 例如rk3568_s_beta(本意就是为了学习的意思),表示这是一个针对rk3568芯片的测试版系统。例如:
rk_android12.0_sdk/device/rockchip/rk356x$ cp -r rk3568_s/ rk3568_s_beta
步骤2:
在新的文件夹中,重命名.mk文件,使其与文件夹名称一致,不然重新lunch会报错。例如:
rk_android12.0_sdk/device/rockchip/rk356x/rk3568_s_beta$ mv rk3568_s.mk rk3568_s_beta.mk
步骤3:
在新的文件夹中,修改所有文件中的内容,将原来的产品组合名称替换为新的产品组合名称。例如:
rk_android12.0_sdk/device/rockchip/rk356x/rk3568_s_beta$ find . -type f | xargs sed -i 's/rk3568_s/rk3568_s_beta/g'
步骤4:
在device/rockchip/rk356x/AndroidProducts.mk文件中,添加新的产品组合的.mk文件路径和lunch选项名称到相应的列表中。例如:
+++ b/device/rockchip/rk356x/AndroidProducts.mk @@ -15,9 +15,12 @@ # PRODUCT_MAKEFILES := \ + $(LOCAL_DIR)/rk3568_s_beta/rk3568_s_beta.mk \ $(LOCAL_DIR)/rk3568_s/rk3568_s.mk COMMON_LUNCH_CHOICES := \ + rk3568_s_beta-userdebug \ + rk3568_s_beta-user \ rk3568_s-userdebug \ rk3568_s-user \
自定义customize.mk
链接: Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
除了新建project lunch外,虽然可以在该项目下的device.mk 修改,但是我一般不想修改原生的东西,我们搞定制化的 一般都是修改一些产品组合的属性,例如开启或关闭一些功能,编译模块,或者调整一些参数属性。为了方便地进行这些修改,可以使用一个名为customize.mk的文件,这个文件可以包含一些针对不同产品组合的条件判断和属性赋值语句。可以在vendor目录下创建一个customize目录,并在其中创建一个customize.mk文件。然后,在device/rockchip/rk356x/device.mk文件中,添加一行include vendor/customize/customize.mk语句,使得customize.mk文件能够被引用到每个产品组合中。需要做以下步骤:
步骤1:
打开device/rockchip/rk356x/device.mk文件,在其中添加一行include vendor/customize/customize.mk语句。例如:
+++ b/device/rockchip/rk356x/device.mk @@ -2,6 +2,7 @@ # Copyright (c) 2020 Rockchip Electronics Co., Ltd # +include vendor/customize/customize.mk include $(CLEAR_VARS) include $(call all-makefiles-under,$(LOCAL_PATH))
步骤2:
在vendor目录下,创建一个customize目录,并在其中创建一个customize.mk文件。例如:
rk_android12.0_sdk$ mkdir vendor/customize/ rk_android12.0_sdk$ touch vendor/customize/customize.mk
步骤3:
在customize.mk文件中,编写一些针对不同产品组合的条件判断和属性赋值语句。我们可以使用ifeq、else、endif等关键字来进行条件判断,使用+=或:=等符号来进行属性赋值。还可以使用$(warning …)语句来打印一些提示信息,方便我们调试和验证。例如:
# 在customize.mk中 include $(call all-subdir-makefiles) $(warning Enter customize.mk is included $(TARGET_PRODUCT)) ifeq ($(TARGET_PRODUCT),rk3568_s_beta) $(warning Enter rk3568_s_beta) PRODUCT_PROPERTY_OVERRIDES += persist.internet_adb_enable=1 PRODUCT_PROPERTY_OVERRIDES += persist.vendor.orientation=0 endif
这段代码的意思是,如果当前选择的产品组合是rk3568_s_beta,那么就给该产品组合添加两个属性,分别是开启网络adb功能和设置屏幕方向为0度(随便写两句表示意思,使用方式和device.mk 等一样)。
步骤4:
OK 前面的东西搞完,我们必须重新执行. build/envsetup.sh && lunch
命令,选择一个产品组合进行编译。可以看到,在执行lunch命令时,会打印出我们在customize.mk文件中设置的提示信息,表示customize.mk文件已经被引用到了该产品组合中,并且根据条件判断执行了相应的属性赋值语句。例如:
ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk$ . build/envsetup.sh ln28@ln28-pc:~/sourcecode/rk_android12.0_sdk$ lunch You're building on Linux Lunch menu... pick a combo: 1. rk3568_s-user 2. rk3568_s-userdebug 3. rk3568_s_beta-user 4. rk3568_s_beta-userdebug Which would you like? [aosp_arm-eng] 4 vendor/customize/customize.mk:3: warning: Enter customize.mk is included rk3568_s_beta vendor/customize/customize.mk:6: warning: Enter rk3568_s_beta
到这里就搞定了一个源代码最开始的一些基础定制,移除了无用的lunch选项,添加了新的lunch选项,自定义ustomize.mk。可以根据自己的需求和喜好,进行更多的定制和优化,打造出属于自己的Android系统。
希望这篇文章能够对你有所帮助,如果你有任何问题或建议,请在评论区留言。谢谢!