Android项目中运行时替换资源技术(RRO)

1,265 阅读2分钟

在运行时更改应用资源的值(RRO)

运行时资源叠加层 (RRO) 是一个软件包,可在运行时更改目标软件包的资源值。注意一点:RRO只能替换Android系统中软件的资源,而不能修改软件包中的代码逻辑。RRO相当于一个apk作为另一个apk的apk的资源包,替换展示目标apk中的资源。RRO只有资源apk已经安装,并且启用的情况下才会起作用;作为RRO的资源apk如果被禁用,或者被删除都不会起作用。

叠加层资源(工作原理)

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

定义映射资源

用于定义叠加层资源映射的推荐机制是,在叠加层软件包的 res/xml 目录中创建一个文件,枚举应覆盖的目标资源及其替换值,然后将 清单标记的 android:resourcesMap 属性的值设置为对资源映射文件的引用。以下代码显示了一个示例 res/xml/overlays.xml 文件:

<overlay xmlns:android="http://schemas.android.com/apk/res/android">
    <item target="string/action_settings" value="42" />
</overlay>

下面的代码是manifest文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application android:hasCode="false" />
    <overlay android:targetPackage="com.example.rroexample"
        android:targetName="OverlayableResources"
        android:resourcesMap="@xml/overlays"/>
</manifest>

调试叠加层

列出RRO

执行如下命令

    adb shell cmd overlay list --user current

image.png

image.png RRO有三种状态:

指标RRO 状态
[ ]已安装,未激活
[ X]已安装,已激活
---已安装,有错误

启用/禁用RRO

执行如下命令:

adb shell cmd overlay enable/disable --user 0 com.example.lota

RRO启用/禁用的时候,目标app不需要重新启动就能生效,这是RRO的最重要的作用。RRO作为原来业务的一个Module是一个比较好的方案。RRO比原来的app占用空间小,下载会用比较小的流量资源,这也是优势之一。

总结

RRO可以在不重新发新版本的情况下,可以发布一个下载体积较小的资源app修复页面展示中的问题,或者动态展示活动。作为RRO的apk必须安装在Android系统中,多个RRO的apk可以对应一个目标软件,更多的apk安装对Android系统的性能必然会造成一定的负担,技术虽好,不要滥用呀。希望文章对您有帮助,如果文中有问题,希望您不吝指教。