AndroidQ RRO(Runtime Resource Overlay)机制(1)

概述

Android5.0引入了RRO,RRO全称(Runtime Resource Overlay),它可以实现在不修改三方应用源码的情况下,替换其资源,主要依靠一个叫做overlay apk的应用实现的, overlay apk和普通的应用相比最大的区别就是overlay apk不含任何代码(java或者C++),它的一般结构仅包含一个AndroidManifest.xml和res目录,当然因为需要在源码下编译,还包含一个Android.mk或者Android.bp(也可以用AS编译,前提是AS编译出来的apk需要有平台签名)。

在这里插入图片描述

RRO替换资源的基本原理如图:
在这里插入图片描述
以替换背景颜色为例:首先我们需要给View设置背景颜色,颜色值定义在colors.xml中,假设其值为bg_color---->#FFFFFF,资源打包之后的ID为0x7f020001,接着系统资源管理框架拿到这个ID并不会立即去target资源包中找,而是先判断此应用是否有overlay,如果有就会去读取target应用与overlay应用共同生成的Idmap文件,此文件中包含了这两个应用之间同名资源的ID映射关系,假设0x7f030010就是overlay资源包中为它的bg_color所生成的ID,此时系统资源管理框架内部就将 0x7f020001替换为了0x7f030010 ,然后拿着0x7f030010去overlay资源包找对应的bg_color---->#000000,至此完成资源替换。

举个栗子

直接来个栗子,我们在frameworks/base/packages/overlays/目录下创建overlay apk,目录结构如前面的图:
在这里插入图片描述
AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.caic.car.rroresource">
    <overlay android:targetPackage="com.example.overlaydemo" android:category="com.caic.car.theme.customization.rroresource" android:priority="1"/>
    <application android:label="RROResource" android:hasCode="false"/>
</manifest>

overlay标签表示这是一个资源overlay应用,targetPackage表示要overlay的目标应用,priority表示overlay包的优先级,因为一个目标应用可能存在多个overlay包,所以需要优先级来排序,值越小优先级越高。

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_RRO_THEME := RROResource

LOCAL_PRODUCT_MODULE := true

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res

LOCAL_PACKAGE_NAME := RROResource
LOCAL_SDK_VERSION := current

include $(BUILD_RRO_PACKAGE)

再来看看目标应用的目录结构:
在这里插入图片描述
需要强调的是要想实现overlay,必须满足overlay应用的资源名称与目标应用资源名称完全相同,比如这里我们要overlay的图片ic_launcher_background.png,目标应用运行之后就是这样:

在这里插入图片描述

接着编译overlay应用,编好之后将其push到设备/system/product/overlay/中,重启之后输入命令adb shell dumpsys overlay可以查询设备中overlay包的详细信息:
在这里插入图片描述
目前我这个overlay包状态是Disable的,我们输入命令adb shell cmd overlay enable com.caic.car.rroresource,此时再dump,overlay包状态已经被enable了:
在这里插入图片描述
再看我们的目标应用,资源已经被换掉了:
在这里插入图片描述

我们就这样简单的实现了在不修改三方应用源码的情况下替换它的资源,后续文章我们再来分析RRO的相关原理与细节。

### Android Overlay 使用方法 #### 定义与概述 RRO (Runtime Resource Overlay) 是一种允许应用程序或系统资源被覆盖的技术,在不修改原始APK的情况下实现自定义外观或其他资源属性的功能[^1]。 #### 创建Overlay项目 为了创建一个新的overlay项目,首先需要设置`AndroidManifest.xml`文件来指定目标包名以及优先级。例如: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.overlay"> <overlay android:targetPackage="com.target.package.name" android:priority="1"/> </manifest> ``` 这里通过`android:targetPackage`指定了要覆盖的目标应用包名称,并设置了该overlay的优先级别为最高(数值越大越优先)[^2]。 #### 编译并安装Overlay APK 编译完成后得到的`.apk`文件应当放置于设备上的特定路径以便系统能够识别它作为有效的overlay。通常推荐的位置是`/vendor/overlay/`, 如果不存在此目录,则可以考虑将其放到`/system/app/`下[^3]。 #### 实现主题切换功能 利用上述配置好的overlay机制,可以通过动态加载不同的resource overlay达到即时改变UI样式的效果。这使得开发者能够在运行时轻松地更改颜色方案、图标集或者其他视觉元素而不必重新打包整个应用程序。 #### 示例代码展示如何构建一个简单的Resource Overlay模块 下面给出一段简化版的例子说明怎样编写这样一个module: ```gradle // build.gradle 文件片段 apply plugin: 'com.android.library' android { ... } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) } ``` ```java // res/values/colors.xml 中的内容 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 自定义的颜色值 --> <color name="primaryColor">#FF009CDD</color> </resources> ``` 以上就是关于Android Overlay的基础介绍及其基本使用方式。对于更复杂的应用场景比如视频处理等方面则涉及到其他专门领域内的知识和技术细节[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值