android13-RRO
作者:访客发布时间:2024-01-02分类:程序开发学习浏览:109
1.简介
运行时资源叠加层RRO(Runtime Resouce Overlay),就是系统提供的动态资源替换的方法
1.1.参考
blog.csdn.net/moxiouhao/a…
blog.csdn.net/hlllmr1314/…
RRO相关看官方文档
排查运行时资源叠加层问题
2.知识点
简单来讲,就是动态替换原有app里的资源文件。
2.1原始的app
举个例子,比如原始的app里有个字符串如下
<string name="help_app_permissions" translatable="false"></string>
我们还需要在res/values下建个overlayable.xml文件,里边声明这个字符串可被替换,如下
<resources>
<!-- TODO(evanseverson) rename this overlayable -->
<overlayable name="PermissionControllerStyles">
<policy type="product|system|vendor">
<!-- START HELP LINKS -->
<item type="string" name="help_app_permissions" />
<!-- END HELP LINKS -->
</policy>
</overlayable>
</resources>
2.2.覆盖资源的app
主要就是清单文件的配置:
- 如果某个软件包包含
<overlay>
标记作为<manifest>
标记的子项,该软件包将被视为 RRO 软件包 - 必须将清单中
<application
> 标记的android:hasCode
属性设置为false
。 - 必要
android:targetPackage
属性的值用于指明 RRO 想要叠加的软件包的名称 - 可选
android:targetName
属性的值用于指明 RRO 想要叠加的目标软件包的可叠加资源子集的名称。如果目标未定义可叠加资源集,此属性就不会显示
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.overlay">
<application android:hasCode="false" />
<overlay android:targetPackage="com.example.target"
android:targetName="OverlayableResources"
android:resourcesMap="@xml/overlays"/>
</manifest>
完事在res/xml里新建一个overlays.xml文件,内容如下
- target后边跟的就是要替换的资源类型以及名字,后边value就是新的值
- 这个是非必须的,也可以直接在strings.xml里写新的string
<?xml version="1.0" encoding="utf-8"?>
<overlay xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Overlays string/config1 and string/config2 with the same resource. -->
<item target="string/config1" value="@string/overlay1" />
<item target="string/config2" value="@string/overlay1" />
<!-- Overlays string/config3 with the string "yes". -->
<item target="string/config3" value="@android:string/yes" />
<!-- Overlays string/config4 with the string "Hardcoded string". -->
<item target="string/config4" value="Hardcoded string" />
<!-- Overlays integer/config5 with the integer "42". -->
<item target="integer/config5" value="42" />
</overlay>
2.3.install
接下来就是安装了,安装分2种情况:
-
如果没有指定android:isStatic="true",你是可以直接adb install安装的,但是默认overlay是不会生效。可以通过下面这个命令来验证:adb shell cmd overlay list 查看是否有你的overlay的应用。然后你可以通过命令来启用:adb shell cmd overlay enable com.sample.app.overlay。
-
如果你指定了android:isStatic="true", 你通过 adb install 时会报错:Overlay com.ecarx.eas.daemon.overlay is static but not pre-installed。所以你需要将你的overlay的Apk push 到/system/vendor/overlay目录下重启。
2.4.测试
source.android.google.cn/docs/device…
把覆盖app安装到设备上,需要系统签名
- 先看一下资源包有没有安装成功
adb shell cmd overlay list
结果说明:
[ ] | 已安装,待激活。 |
---|---|
[X] | 已安装,已激活。 |
--- | 已安装,但包含错误。 |
- 启用资源包 把overlayAppPackageName替换成自己覆盖包的包名
adb shell cmd overlay enable overlayAppPackageName
- 禁用资源包
adb shell cmd overlay disable overlayAppPackageName
- 若有多用户的话需要指定UserID
adb shell pm list users // 查看是否有多用户
adb shell cmd overlay enable --user 0 overlayAppPackageName
2.5.错误
写完overlay应用,安装后,使用overlay list命令,结果里显示的---,也就是说我们的包有问题
按照官方提示
adb logcat |grep idmap
查看日志查找错误,看起来是policy不匹配。
overlay '/data/app/~~NypueOeX6yPNkyAHOy5XRg==/com.android.permissioncontroller.my.overlay-UIj3DSq7DnO8_P13ImUnkw==/base.apk'
is not allowed to overlay resource 'string/help_app_permissions' in target:
overlay with policies "public|signature" does not fulfill any overlayable policies "product|system|vendor"
我们原始包里的policy如下,
<policy type="product|system|vendor">
查下资料,看下policy里的type是干啥的
使用 <policy>
标记可对可叠加资源施加限制。type
属性指定叠加层必须满足哪些政策的要求才能替换包含的资源。受支持的类型如下。
public
。任何叠加层均可替换相应资源。system
。系统分区上的任何叠加层均可替换相应资源。vendor
。vendor 分区上的任何叠加层均可替换相应资源。product
。product 分区上的任何叠加层均可替换相应资源。signature
。使用与目标 APK 相同的签名进行签名的任何叠加层均可替换相应资源。
说明覆盖app必须安装在system,vendor或者product分区上,而我们通过adb install xxx.apk 是安装在data目录下的,所以不符合要求。
现在是把apk放到/system/app目录下,主要解决下权限的问题,这个默认只有read权限。
如下先执行第一样,如果出现xxx is read-only的提示,那么再继续第二行
1|phaeton:/ # mount -o rw,remount -t auto /
'/dev/block/dm-4' is read-only
1|phaeton:/ # mount -o remount /dev/block/dm-4 /
3.信息查看命令
3.1.dump
后边的包名是overlay应用的包名
$ adb shell cmd overlay dump com.google.android.overlay.modules.documentsui
com.google.android.overlay.modules.documentsui:0 {
mPackageName...........: com.google.android.overlay.modules.documentsui
mOverlayName...........: null
mUserId................: 0
mTargetPackageName.....: com.google.android.documentsui
mTargetOverlayableName.: DocumentsUICustomization
mBaseCodePath..........: /product/overlay/GoogleDocumentsUIOverlay.apk
mState.................: STATE_ENABLED
mIsEnabled.............: true
mIsMutable.............: true
mPriority..............: 2147483647
mCategory..............: null
mIsFabricated..........: false
}
IDMAP OF com.google.android.overlay.modules.documentsui
Paths:
target path : /system/priv-app/DocumentsUIGoogle/DocumentsUIGoogle.apk
overlay path : /product/overlay/GoogleDocumentsUIOverlay.apk
Mapping:
0x7f040017 -> 0x7f010000 (bool/is_launcher_enabled -> bool/is_launcher_enabled)
3.2.lookup
后边的包名是原始的app的包名,查找is_launcher_enabled的值
adb shell cmd overlay lookup --verbose com.google.android.documentsui com.google.android.documentsui:bool/is_launcher_enabled
Resolution for 0x12010000
For config - en-rUS-ldltr-sw711dp-w711dp-h1113dp-large-notlong-notround-nowidecg-lowdr-port-uiModeType=3-notnight-180dpi-finger-keyssoft-nokeys-nonav-1280x800-v33
Found initial: /product/overlay/GoogleDocumentsUIOverlay.apk
Best matching is from v31 configuration of com.google.android.documentsui
false
标签:RRO
- 上一篇:JDK 动态代理
- 下一篇:HarmonyOS ArkTS 实现MQTT协议
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 8Android广播如何解决Sending non-protected broadcast问题
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版