热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidQRRO(RuntimeResourceOverlay)机制(1)

概述Android5.0引入了RRO,RRO全称(RuntimeResourceOverlay),它可以实现在不修改三方应

概述

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&#61;"http://schemas.android.com/apk/res/android"package&#61;"com.caic.car.rroresource"><overlay android:targetPackage&#61;"com.example.overlaydemo" android:category&#61;"com.caic.car.theme.customization.rroresource" android:priority&#61;"1"/><application android:label&#61;"RROResource" android:hasCode&#61;"false"/>
manifest>

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

Android.mk

LOCAL_PATH:&#61; $(call my-dir)
include $(CLEAR_VARS)LOCAL_RRO_THEME :&#61; RROResourceLOCAL_PRODUCT_MODULE :&#61; trueLOCAL_SRC_FILES :&#61; $(call all-subdir-java-files)LOCAL_RESOURCE_DIR :&#61; $(LOCAL_PATH)/resLOCAL_PACKAGE_NAME :&#61; RROResource
LOCAL_SDK_VERSION :&#61; currentinclude $(BUILD_RRO_PACKAGE)

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

在这里插入图片描述

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

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


推荐阅读
author-avatar
asdvuj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有