Android OS

RRO: 动态资源覆盖

2019-01-11  本文已影响0人  古风子

RRO: Runtime Resource Overlay

问题现象

计划通过资源覆盖的方式,覆盖系统的通知使用权字段。于是,通过Ovelay配置了自己的资源字符串

//--/common/overlay/frameworks/base/core/res/res/values/config.xml
<string name="config_defaultListenerAccessPackages" translatable="false">
com.google.mms
</string>

但是通过调试系统,系统中实际获取的是:

<string name="config_defaultListenerAccessPackages">
com.google.android.setupwizard:com.google.android.apps.restore
</string>

问题定位

出现此类问题:去/system/vendor/overlay下面的apk查看,是否有apk中的资源覆盖此字段
结果发现,framework-res__auto_generated_rro应用通过rro的方式覆盖了此资源。

  1. rro覆盖配置方式
//AndroidManifest.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:compileSdkVersion="28" 
    android:compileSdkVersionCodename="9"
    package="android.auto_generated_rro__" 
    platformBuildVersionCode="28"
    platformBuildVersionName="9">

    //配置动态覆盖android的资源
    <overlay android:isStatic="true" android:priority="0" android:targetPackage="android"/>

</manifest>
  1. 配置要覆盖的字段
//framework-res__auto_generated_rro\res\values\string.xml
<string name="config_defaultListenerAccessPackages">
        com.google.android.setupwizard:com.google.android.apps.restore
</string>

最后通过grep -nr "config_defaultListenerAccessPackages",全局搜索改字段,在其他地方是否有通过rro的方式进行

修改方案

  1. 创建以下资源:
//--/device/prodcut/common/runtime_overlay/frameworks/base/core/res/res/values/config.xml
<string name="config_defaultListenerAccessPackages" translatable="false">....</string>
  1. 并在mk文件中,用此资源通过rro方式去覆盖framework-res的资源
ifneq (,$(filter filter_string,$(VERSION)))
    PRODUCT_PACKAGE_OVERLAYS := /device/prodcut/common/runtime_overlay $(PRODUCT_PACKAGE_OVERLAYS)
endif 

/device/prodcut/common/runtime_overlay下的目录要跟原生的frameworks资源目录(config.xml)保持一致
并且/device/prodcut/common/runtime_overlay要放到PRODUCT_PACKAGE_OVERLAYS的最前面,这样保证我们的资源优先级最高

自定义区覆盖其他应用的资源文件的方式,参考如下文章:

https://blog.csdn.net/azhengye/article/details/49050631

上一篇下一篇

猜你喜欢

热点阅读