cpp
LOCAL_PATH:= $(call my-dir) //vendor/qti/overlays/CneEthernetOverlay/
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res 核心就是通过这个目录中的资源来替换目标应用或系统中的同名资源。
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay 指定该模块安装的目标路径 , /vendor/overlay/, Android 系统会在启动时扫描 /vendor/overlay/ 目录,加载 RRO 模块。
LOCAL_MANIFEST_FILE := AndroidManifest.xml 这个文件是 RRO 的核心配置文件,必须包含
LOCAL_PACKAGE_NAME := CneEthernetOverlay 编译后生成的 APK 文件名为:CneEthernetOverlay.apk
LOCAL_SDK_VERSION := current
LOCAL_CERTIFICATE := platform 指定对该 APK 进行签名的密钥, platform 表示使用 platform key
LOCAL_MODULE_OWNER := qti 指定该模块的"所有者"为 qti(Qualcomm Technologies, Inc)
LOCAL_VENDOR_MODULE := true 标记该模块为 vendor 模块。
include $(BUILD_RRO_PACKAGE) :这是构建规则的入口
这段代码是一个 Android 的 Android.mk 构建脚本 ,用于定义一个 Resource-Only Overlay(RRO) 模块,名称为 CneEthernetOverlay。它属于 Android 的资源覆盖机制(Runtime Resource Overlay),常用于厂商(如 Qualcomm、Samsung)在不修改原生系统代码的情况下,动态替换系统或其他应用的资源。
下面我们逐行解释其含义和作用:
📌 1. LOCAL_PATH := $(call my-dir)
makefile
LOCAL_PATH := $(call my-dir)
- 作用 :将当前
Android.mk文件所在的目录路径赋值给变量LOCAL_PATH。 $(call my-dir)是一个 Make 函数,返回当前.mk文件的路径。- 这是每个
Android.mk文件的标准开头,用于后续相对路径引用。
✅ 示例:如果
Android.mk在vendor/qti/overlays/CneEthernetOverlay/,那么LOCAL_PATH就是这个路径。
📌 2. include $(CLEAR_VARS)
makefile
include $(CLEAR_VARS)
- 作用 :清除之前定义的所有
LOCAL_XXX变量(如LOCAL_SRC_FILES、LOCAL_MODULE等),但保留LOCAL_PATH。 - 这是为了确保当前模块的定义不会受到之前模块的影响。
- 是每个模块定义前的必要步骤。
🔁 相当于"重置"构建环境。
📌 3. LOCAL_SRC_FILES := $(call all-subdir-java-files)
makefile
LOCAL_SRC_FILES := $(call all-subdir-java-files)
- 作用 :递归查找当前目录及其子目录下的所有
.java文件,并作为源文件。 - 但在 RRO(Resource-Only Overlay) 模块中,通常不需要 Java 代码。
- ❗ 这里可能是 冗余或错误配置,因为 RRO 只关心资源(res/)和清单文件(AndroidManifest.xml),不需要编译 Java 代码。
⚠️ 建议:对于纯资源覆盖,应删除此行或确认是否有 Java 文件需要编译(极少见)。
📌 4. LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
makefile
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
- 作用 :指定该模块的资源目录为
res/(相对于LOCAL_PATH)。 - 这个目录下通常包含:
values/strings.xml:覆盖字符串drawable/:覆盖图片layout/:覆盖布局(较少见)
- RRO 的核心就是通过这个目录中的资源来替换目标应用或系统中的同名资源。
📌 5. LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay
makefile
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay
-
作用:指定该模块安装的目标路径。
-
$(TARGET_OUT_VENDOR)/overlay通常是:/vendor/overlay/ -
Android 系统会在启动时扫描
/vendor/overlay/目录,加载 RRO 模块。 -
✅ 这是 vendor overlay 的标准安装路径。
📌 6. LOCAL_MANIFEST_FILE := AndroidManifest.xml
makefile
LOCAL_MANIFEST_FILE := AndroidManifest.xml
-
作用 :指定该模块的
AndroidManifest.xml文件路径(相对于LOCAL_PATH)。 -
这个文件是 RRO 的核心配置文件 ,必须包含:
xml<manifest android:sharedUserId="android.uid.system"> <overlay android:targetPackage="com.android.systemui" /> </manifest> -
其中
android:targetPackage指明了要覆盖哪个应用的资源(如SystemUI、Settings等)。
📌 7. LOCAL_PACKAGE_NAME := CneEthernetOverlay
makefile
LOCAL_PACKAGE_NAME := CneEthernetOverlay
-
作用:定义该模块的名称。
-
编译后生成的 APK 文件名为:
CneEthernetOverlay.apk -
该名称也用于在系统中标识这个 overlay 模块。
📌 8. LOCAL_SDK_VERSION := current
makefile
LOCAL_SDK_VERSION := current
- 作用:指定编译该模块时使用的 SDK 版本。
current表示使用当前 AOSP 源码树的最新 SDK(即未发布版本)。- 对于 vendor 模块,通常使用
current或system_current。
🆚 对比:
LOCAL_SDK_VERSION := 30表示使用 Android 11 的 SDK。
📌 9. LOCAL_CERTIFICATE := platform
makefile
LOCAL_CERTIFICATE := platform
- 作用:指定对该 APK 进行签名的密钥。
platform表示使用 platform key (build/target/product/security/platform.x509.pem + platform.pk8)。- RRO 模块要覆盖系统应用,必须使用与目标应用相同的签名,否则系统会拒绝加载。
✅ 如果
targetPackage是SystemUI(platform 签名),那么 overlay 也必须用platform签名。
📌 10. LOCAL_MODULE_OWNER := qti
makefile
LOCAL_MODULE_OWNER := qti
- 作用 :指定该模块的"所有者"为
qti(Qualcomm Technologies, Inc)。 - 主要用于构建系统内部记录和依赖管理。
- 不影响 APK 功能,但有助于追踪模块来源。
📌 11. LOCAL_VENDOR_MODULE := true
makefile
LOCAL_VENDOR_MODULE := true
- 作用 :标记该模块为 vendor 模块。
- 影响:
- 安装路径(如
/vendor/overlay/) - SELinux 上下文
- 构建依赖解析
- 安装路径(如
- ✅ 对于高通等 SoC 厂商的 overlay,必须设置为
true。
📌 12. include $(BUILD_RRO_PACKAGE)
makefile
include $(BUILD_RRO_PACKAGE)
- 作用 :这是构建规则的入口 ,告诉构建系统:
- 这是一个 Resource-Only Overlay Package。
- 使用 RRO 的特殊构建流程,生成一个只包含资源的 APK。
- 与
$(BUILD_PACKAGE)不同,BUILD_RRO_PACKAGE不会编译 Java 代码,也不会生成classes.dex。
🧩 总结:这个模块是做什么的?
| 项目 | 说明 |
|---|---|
| 模块名 | CneEthernetOverlay |
| 类型 | Resource Overlay (RRO) |
| 作用 | 覆盖某个系统应用(如 Cne 或 EthernetService)的资源(字符串、颜色、布局等) |
| 安装路径 | /vendor/overlay/CneEthernetOverlay.apk |
| 签名 | platform(与系统应用一致) |
| 目标 | 通过 AndroidManifest.xml 中的 android:targetPackage 指定要覆盖的应用 |
🛠️ 典型 AndroidManifest.xml 内容推测
xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.qualcomm.qti.CneEthernetOverlay"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="android.uid.system">
<application android:hasCode="false" />
<overlay
android:targetPackage="com.qualcomm.qti.cne"
android:targetName="CneOverlay"
android:isStatic="false"
android:priority="1" />
</manifest>
targetPackage:被覆盖的应用包名priority:优先级,数字越大优先级越高isStatic:false表示运行时可启用/禁用
✅ 建议优化
-
移除
LOCAL_SRC_FILES(除非真有 Java 文件):makefile# LOCAL_SRC_FILES := $(call all-subdir-java-files) # 删除或注释 -
确保
res/目录存在且结构正确 -
确认
AndroidManifest.xml中的targetPackage正确
这个模块是典型的 高通 vendor overlay,用于定制化网络或连接相关的系统行为,属于 Android 定制开发中的常见模式。