Android源码学习之Overlay

在 Android Framework 开发中,Overlay 主要用于修改和替换系统或应用的资源,而无需直接修改源码,与源码解耦。Overlay 机制可以分为 两种类型

静态 Overlay(Static Resource Overlay, SRO)

  • 编译时 覆盖资源。
  • 适用于系统级资源修改(如默认壁纸、配置文件等)。
  • 需要在 PRODUCT_PACKAGE_OVERLAYS 中指定 Overlay 目录。

动态 Overlay(Runtime Resource Overlay, RRO)

  • 运行时 动态替换资源。
  • 适用于应用级资源修改(如主题更换、颜色调整等)。
  • 通过 Manifest 声明 overlay,可在 运行时启用/禁用

静态 Overlay(Static Resource Overlay, SRO)

系统在编译的时候会生成两个 APK,一个Overlay,一个是原来的 APK。在运行时,系统会解析这个应用是否有Overlay,如果有的话,会先去Overlay中查找,而不是向原来的 APK 中查找资源(比如 res 目录下的:文字、图片、配置等资源)。静态Overlay要求有源码的情况才能使用,一般用在修改系统源码应用属性时使用。

在系统源码中,静态 Overlay 通常以独立的模块(APK 或资源包)形式存在,放置在 vendor/overlayproduct/overlay 目录下。

示例(定制壁纸)

打开 android/frameworks/base/core/res 目录,其中当前目录下就是一个完整的 APK 源码文件,其中系统的权限、弹框字符、配置参数等资源都会从这个应用读取。打开该目录下的 Android.pb 文件可以看到,该应用编译后的应用名叫 framework-res

android_app {name: "framework-res",....
}

可以在 android/frameworks/base/core/res/res/drawable-nodpi/ 等其他资源文件夹下找到 default_wallpaper.png 系统默认壁纸图片。如果直接在这些目录下替换图片的话,就和源码耦合度太高了,不推荐。为了解耦,就可以使用 SRO 进行编译覆盖。


创建 overlay 文件目录

首先在源码根目录创建 vendor 文件夹,然后创建 overlay 文件夹,接着 overlay 下的文件目录要和源码中的文件目录保持一致,创建一个 frameworks/base/core/res/res/drawable-nodpi/ 目录结构,将包含 default_wallpaper.png 图片的目录都创建出来。例如:res 目录下有 drawable-sw600dp-hdpidrawable-sw720dp-nodpi 等文件夹包含默认壁纸,就需要将这些文件夹都创建出来,每个文件夹都放一份要替换的默认壁纸图片(注意文件类型要保持一致,如果默认是 png,你替换的也要是 png 格式)。至此资源文件创建完成。


添加到编译文件

资源文件创建完成了,需要让系统去知道你有这个文件夹,那么就需要在 .mk 文件中去把这个文件夹添加上。在上篇文章中 vendor 目录下的 vendor_product.mk 中增加如下代码:

# overlay
PRODUCT_PACKAGE_OVERLAYS := \
vendor/overlay

这样,overlay 文件夹就被 MK 文件知道了,编译的时候系统就知道它是 overlay 的文件了。编译过程中就会把相应的目录资源进行覆盖操作,这样在开机的时候就会展示我们定制的壁纸了 😃

同样,如果想要修改系统默认的导航方式,则需要创建 values/config.xml 文件,因为系统导航的默认配置在 android/frameworks/base/core/res/res/values/config.xml 文件中:

<resources><!-- Controls the navigation bar interaction mode:0: 3 button mode (back, home, overview buttons)1: 2 button mode (back, home buttons + swipe up for overview) 2: gestures only for back, home and overview --><integer name="config_navBarInteractionMode">0</integer>
</resources>

效果如下:

默认壁纸:
在这里插入图片描述
替换壁纸:
在这里插入图片描述
最终效果:
在这里插入图片描述

动态 Overlay(Runtime Resource Overlay, RRO)

用在只有应用包的情况下使用,应用是以 APK 包的形式直接放到系统源码中的,不会再进行重新编译了。要覆盖应用里面的内容,就只能使用 RRO,动态去修改应用中的资源内容。

RRO 的工作原理是将叠加层软件包中定义的资源映射到目标软件包中定义的资源。当应用尝试解析目标软件包中资源的值时,系统转而会返回目标资源映射到的叠加层资源的值。


设置清单文件

如果某个软件包包含 <overlay> 标记作为 <manifest> 标记的子项,该软件包将被视为 RRO 软件包。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.dynamictheme.overlay"><application android:hasCode="false" /><overlayandroid:targetPackage="com.example.myapp"android:isStatic="true"android:priority="1"/>
</manifest>
  • 必要 android:targetPackage 属性的值用于指明 RRO 想要叠加(覆盖)的软件包的名称。
  • 可选 android:targetName 属性的值用于指明 RRO 想要叠加的目标软件包的可叠加资源子集的名称。如果目标未定义可叠加资源集,此属性就不会显示。
  • android:isStatic,当此布尔值属性的值设置为 true 时,叠加层会默认处于启用状态并且不可变,这会导致叠加层无法停用。
  • android:priority,当多个静态叠加层以相同的资源值为替换目标时,此数字属性的值(仅影响静态叠加层)将配置叠加层的优先级。数值越大表示优先级越高。

APK 包

假设现在有一个已经打包好的 APK 包名为 com.example.myapp,其首页标题显示使用 res/values/strings.xml 中的文字资源:

  <string name="hello_word">Hello word!</string>

即首页标题显示 my app

在 vendor 目录下创建 apps/MyApplication/apps/MyApplicationOverlay/ 文件目录,将上面写好的 AndroidManifest.xml 文件放到 apps/MyApplicationOverlay/ 目录下,将编译好的 APK 和其对应的 Android.mk 文件放到 apps/MyApplication/ 目录下,如图:

Overlay目录结构

接着在 apps/MyApplicationOverlay/ 目录下,创建与原 APK 对应的文件资源目录 res/values/strings.xml,然后修改文字资源:

<resources><string name="hello_word">Hello word Overlay!</string>
</resources>

现在 overlay 包已经制作好了,需要把 MyApplicationOverlay 这个应用参与到编译中去,就需要在 apps/MyApplicationOverlay/ 目录下创建对应的 Android.mk 文件,来告诉源码该如何进行编译:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 资源目录
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
# 模块标签
LOCAL_MODULE_TAGS := optional
# Java 源文件(通常不需要)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# SDK 版本
LOCAL_SDK_VERSION := current
# 模块名称
LOCAL_PACKAGE_NAME := MyApplicationOverlay
# 输出路径
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay
# 签名方式
LOCAL_CERTIFICATE := shared
# AAPT 标志
LOCAL_AAPT_FLAGS := --auto-add-overlay
# 构建规则
include $(BUILD_PACKAGE)

然后编辑 product.mk ,将 MyApplicationMyApplicationOverlay 文件夹添加到编译环境中去:

注意product.mk 已经在 vendor_product.mk 中被引用,而 vendor_product.mk 又在系统build/target/product/sdk_phone_x86_64.mk 文件中引用,所以 product.mk 一定会被执行。

PRODUCT_PACKAGES+=\
MyApplication
MyApplicationOverlay

然后单编push或者整编验证即可!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33674.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】基本操作 —— DDL

目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…

网络安全需要学多久才能入门?

网络安全是一个复杂且不断发展的领域&#xff0c;想要入行该领域&#xff0c;我们需要付出足够多的时间和精力好好学习相关知识&#xff0c;才可以获得一份不错的工作&#xff0c;那么网络安全需要学多久才能入门?我们通过这篇文章来了解一下。 学习网络安全的入门时间因个人的…

【测试语言基础篇】Python基础之List列表

一、Python 列表(List) 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置&#xff0c;或索引&#xff0c;第一个索引是0&#xff0c;第二个索引是1&#xff0c;依此类推。 Python有6个序列的内置类型&#xff0c;但最常见的是列表和元组。序列都可…

编译系统设计原理概述

目录 简介 词法分析 正则表达式 有穷状态自动机 从正则表达式到有穷自动机的转换 单词识别 简介 主要介绍编译系统设计过程中涉及的原理与技术&#xff0c;主要分为前端设计和后端设计两 个模块。前端部分包括词法分析器、语法分析器的构建和语义分析过程的设计…

ArcGIS Pro 车牌分区数据处理与地图制作全攻略

在大数据时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术在各个领域都有着广泛的应用&#xff0c;而 ArcGIS Pro 作为一款功能强大的 GIS 软件&#xff0c;为数据处理和地图制作提供了丰富的工具和便捷的操作流程。 车牌数据作为一种重要的地理空间数据&#xf…

前端登录鉴权全解析:主流方案对比与实现指南

文章目录 一、常见登录鉴权方式概览1.1 主流方案对比1.2 技术特性对比 二、Session/Cookie方案2.1 实现原理2.2 代码实现2.3 优缺点分析 三、JWT方案3.1 实现原理3.2 代码实现3.3 优缺点分析 四、OAuth方案4.1 实现原理4.2 代码实现4.3 优缺点分析 五、SSO方案5.1 实现原理5.2 …

算法系列之回溯算法求解数独及所有可能解

有没有对数独感兴趣的朋友呢&#xff1f;数独作为一款经典的逻辑游戏&#xff0c;其目标是在一个9x9的方格中填入数字1至9&#xff0c;确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单&#xff0c;但编写一个能够自动求解数独的程序…

华为hcia——Datacom实验指南——TCP传输原理和数据段格式

什么是TCP TCP是一种可靠的端到端的传输层协议&#xff0c;仅应用于单波通信。 采用TCP协议作为传输方式的应用层服务&#xff0c;再进行数据传输前&#xff0c;都需要进行TCP协议的创建。 TCP报文的格式 sequence number&#xff08;序列号&#xff09; 占4个字节&#x…

Vlog 片头制作

打开剪映&#xff0c;新建草稿&#xff0c;导入黑色背景。 拉长时间轴&#xff0c;背景时常调整为4.2秒。 添加文本&#xff0c;输入 5 个“|”&#xff0c;每个中间 2 个空格&#xff0c;如下| | | | |&#xff0c;然后手动放大文本&#xff0c;让中间显示出四个间隔。 继续添…

【Nacos】服务发布之优雅预热上线方案

目录 一、背景二、注册时机2.1、注册机制2.2、分析源码找到注册时机 三、注册前心跳健康检测3.1、方案实施3.2、源码分析3.3、优化代码 四、流量权重配置五、总结5.1、整体完整流程&#xff1a;5.2、流程图&#xff1a;5.1、优化方案完整代码&#xff1a; 一、背景 有些面向广…

VXLAN 组播 RP

一、Anycast RP 在每个 VTEP 上&#xff0c;每个多播组都会建立一个源树 (S,G)&#xff0c;并且在双活 Leaf 设备上到 RP 地址是 ECMP 路径。 在 PIM ASM 模式下&#xff0c;(S,G) 组在 VTEP 端创建。由于每个 VTEP 都能够为特定的多播组发送和接收多播流量&#xff0c;因此每…

【第七节】windows sdk编程:Windows 中的对话框

目录 引言 一、对话框简介 1.1 对话框的创建 1.2 基本函数 1.3 模态对话框与非模态对话框 1.4 对话框与窗口的区别 二、模态对话框编程方法 2.1 模态对话框编程 2.2 消息框 三、非模态对话框编程方法 四、综合代码案例 引言 在Windows应用程序开发中&#xff0c;对话…

安装并配置终端字体

1. 简介 在使用 Oh My Zsh Powerlevel10k 时&#xff0c;正确的字体配置至关重要。Powerlevel10k 依赖 Nerd Fonts 扩展字体&#xff0c;以正确显示 Git 状态、分支、时间、图标等信息。 如果没有正确配置字体&#xff0c;你可能会看到 乱码、问号&#xff08;?&#xff09…

LeetCode - #227 基于 Swift 实现基本计算器

摘要 在这篇文章中&#xff0c;我们将实现一个基于 Swift 语言的基本计算器。该计算器能够解析和计算包含 、-、* 和 / 的数学表达式&#xff0c;并且遵循运算符的优先级规则。整数除法仅保留整数部分&#xff0c;不能使用 eval() 这样的内置解析方法。 描述 给你一个字符串表…

智慧应急消防解决方案(35页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。在当今社会&#xff0c;消防安全至关重要&#xff0c;关乎人民生命财产安全和社会稳定。随着科技的飞速发展&#xff0c;智慧应急消防解决方案应运而生&#xff0c;为消防工作带来了新的变革和机遇。接下来&#xff0c;让我们深入探讨这份智…

网络安全反渗透 网络安全攻防渗透

网络渗透防范主要从两个方面来进行防范&#xff0c;一方面是从思想意识上进行防范&#xff0c;另一方面就是从技术方面来进行防范。 1.从思想意识上防范渗透 网络攻击与网络安全防御是正反两个方面&#xff0c;纵观容易出现网络安全事故或者事件的公司和个人&#xff0c;在这些…

2025-03-15 学习记录--C/C++-PTA 练习3-4 统计字符

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 练习3-4 统计字符 本题要求编写程序&#xff0c;输入10个字符&#xff0c;统计其中英文字母、空格或回车、…

11a-PPDU

## 前导码和信令 OFDM 物理层&#xff08;PHY&#xff09;的 PPDU&#xff08;物理层协议数据单元&#xff09;格式包含以下实体信息&#xff1a; - **PPDU 组成**&#xff1a;由 OFDM PHY preamble&#xff08;前导码&#xff0c;12 个符号&#xff09;、PHY header&#xff…

TF-IDF:文本挖掘中的关键词提取利器

引言 在自然语言处理&#xff08;NLP&#xff09;和文本挖掘中&#xff0c;TF-IDF是一种常用的技术&#xff0c;用于评估一个词在文档中的重要性。它不仅在信息检索领域广泛应用&#xff0c;还在文本分类、关键词提取等任务中发挥着重要作用。本文将详细介绍TF-IDF的原理…

[新能源]新能源汽车快充与慢充说明

接口示意图 慢充接口为交流充电口&#xff08;七孔&#xff09;&#xff0c;快充接口为直流充电口&#xff08;九孔&#xff09;。 引脚说明 上图给的是充电口的引脚图&#xff0c;充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…