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的方式覆盖了此资源。
- 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>
- 配置要覆盖的字段
//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的方式进行
修改方案
- 创建以下资源:
//--/device/prodcut/common/runtime_overlay/frameworks/base/core/res/res/values/config.xml
<string name="config_defaultListenerAccessPackages" translatable="false">....</string>
- 并在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的最前面,这样保证我们的资源优先级最高
自定义区覆盖其他应用的资源文件的方式,参考如下文章:
网友评论