使用RRO机制定制风格

在拿到一个apk时,没有源码怎么去修改这个apk中的风格?如图片,图文字颜色?

这种情况下可以使用android 运行时(RRO)替换策略去修改。

运行时overlay(RRO), 是在app启动时,获取资源时,使用自定义资源替换原来的资源。

RRO不能替换AndroidManifest.xml文件及reference resource 类型的文件,如layout、anim、xml目录中的xml文件。虽然RRO具有自己的AndroidManifest.xml文件,但它却不能替换源项目中的AndroidManifest.xml文件。

RRO需要有两个应用,一个是原应用(需要替换资源的应用,比如下面录音机应用),另外一个是用来生成替换资源的应用(没有code)。

1. 创建一个新的项目,在AndroidManifast.xml中配置:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.overlayPackage">

    <overlay
    android:priority="1"
    android:targetPackage="com.android.soundrecorder" />

</manifest>

package: 包名随便命名,不过最好的命名规则是com.android.soundrecorder.overlay,就是包名+overlay,这样更容易理解。为了简单,就不提换了。

关键词:overlay便签    是标识这个应用支持overlay

 priority : 配置overlay.apk的优先级,值越大,优先级越高。如果有多个overlay.apk, 系统就会根据这个值从大到小的顺序获取资源。

targetPackage:被替换的包名,这里要替换的目标是录音机

我们想要替换录音机界面的背景(蓝色区域)。

2. 如果是有源码的话就找到这个背景设置资源的id,没有源码就反编译apk(把原apk 改名为zip格式,直接解压出来,在res中查找),再找到这个id。 id为statusbar_color_blue。

这里是用颜色值来填充的,所以在res/colors.xml 中配置:

<resources>
    <!-- The color tints to apply to the text and drag view when hovering
         over the delete target or the info target -->
    <color name="statusbar_color_blue">#000000</color>

</resources>

把蓝色背景替换为黑色背景。

到现在为止就完成这个overlay.apk的配置。

汇总一下就是第一步只要配置androidManifast.xml,增加overlay标签。 第二步获取资源id,并在相应的xml中(colors.xml、strings.xml ...)中声明这个id,并赋值为我们需要的资源。

3.现在编译这个apk。

4. 编译完成后把这个apk push到 vendor/overlay/中,重启手机,打开原apk,你会发现这个背景变成黑色的了。


RRO原理:

在资源编译打包后会在R.java中生成对应的id, 这个id 遵循如下原则:

0xppttiiii
其中,
pp:01表示是系统资源,7f表示是应用资源
tt:用于表示资源类型,如string、array、图片资源等

iiii:用于表示相同类型的不同资源

当应用使用getDrawable 或getString调用图片或字串时,会调用系统的getResource方法,该方法会根据资源id及设备配置信息(语言、像素密度等)来查找并返回合适的图片资源。

如果id表示的是系统资源,会从framework-res.apk中获取; 如果是表示的是应用资源,会从应用或overlay中获取对应的资源。

这个时候,overlay的优先级会高于app,所以优先overlay中的资源。

如果多个overlay.apk, 会根据定义的priority 属性的值来获取。

比如有两个,一个android:priority="1" 另一个是android:priority="2",  会优先priority为2的overlay apk中获取,如果没有在priority为1中获取,如果没有,则中原app中获取。

谢谢!

参考:https://www.jianshu.com/p/9304089c513d

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值