联系我们
简单又实用的WordPress网站制作教学
当前位置:网站首页 > 程序开发学习 > 正文

android13-RRO

作者:访客发布时间:2024-01-02分类:程序开发学习浏览:109


导读:1.简介运行时资源叠加层RRO(RuntimeResouceOverlay),就是系统提供的动态资源替换的方法1.1.参考blog.csdn.net/moxiouhao/...

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种情况:

  1. 如果没有指定android:isStatic="true",你是可以直接adb install安装的,但是默认overlay是不会生效。可以通过下面这个命令来验证:adb shell cmd overlay list 查看是否有你的overlay的应用。然后你可以通过命令来启用:adb shell cmd overlay enable com.sample.app.overlay。

  2. 如果你指定了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安装到设备上,需要系统签名

  1. 先看一下资源包有没有安装成功
adb shell cmd overlay list

结果说明:

[ ]已安装,待激活。
[X]已安装,已激活。
---已安装,但包含错误。
  1. 启用资源包 把overlayAppPackageName替换成自己覆盖包的包名
adb shell cmd overlay enable overlayAppPackageName
  1. 禁用资源包
adb shell cmd overlay disable overlayAppPackageName
  1. 若有多用户的话需要指定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


程序开发学习排行
最近发表
网站分类
标签列表