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开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
297 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
2月前
|
Android开发
Android自定义view之利用PathEffect实现动态效果
本文介绍如何在Android自定义View中利用`PathEffect`实现动态效果。通过改变偏移量,结合`PathEffect`的子类(如`CornerPathEffect`、`DashPathEffect`、`PathDashPathEffect`等)实现路径绘制的动态变化。文章详细解析了各子类的功能与参数,并通过案例代码展示了如何使用`ComposePathEffect`组合效果,以及通过修改偏移量实现动画。最终效果为一个菱形图案沿路径运动,源码附于文末供参考。
|
2月前
|
Android开发 开发者
Android自定义view之利用drawArc方法实现动态效果
本文介绍了如何通过Android自定义View实现动态效果,重点使用`drawArc`方法完成圆弧动画。首先通过`onSizeChanged`进行测量,初始化画笔属性,设置圆弧相关参数。核心思路是不断改变圆弧扫过角度`sweepAngle`,并调用`invalidate()`刷新View以实现动态旋转效果。最后附上完整代码与效果图,帮助开发者快速理解并实践这一动画实现方式。
|
2月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
|
2月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
151 65
Android自定义view之网易云推荐歌单界面
|
2月前
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
406 84
|
2月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
2月前
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
|
2月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
Android自定义view之围棋动画(化繁为简)
|
2月前
|
Java Android开发 开发者
Android自定义view之围棋动画
本文详细介绍了在Android中自定义View实现围棋动画的过程。从测量宽高、绘制棋盘背景,到创建固定棋子及动态棋子,最后通过属性动画实现棋子的移动效果。文章还讲解了如何通过自定义属性调整棋子和棋盘的颜色及动画时长,并优化视觉效果,如添加渐变色让白子更明显。最终效果既可作为围棋动画展示,也可用作加载等待动画。代码完整,适合进阶开发者学习参考。