Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk

简介: Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk

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系统。


希望这篇文章能够对你有所帮助,如果你有任何问题或建议,请在评论区留言。谢谢!

相关文章
|
2月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
42 3
|
4月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
79 2
基于Android P,自定义Android开机动画的方法
|
2月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
90 0
|
4月前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
4月前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
24天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
26天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
32 5
|
2月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
3月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
63 10
|
3月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
52 3