Overlay机制

简介: Overlay机制

Android Overlay是一种资源替换机制,它能在不重新打包apk的情况下,实现资源文件的替换(res目录非assert目录),Overlay又分为静态Overlay(Static Resource Overlay)与运行时Overlay(Runtime Resource Overlay)。

1静态Overlay

静态Overlay,简称为SRO,资源替换发生在编译时,需要在Android系统源码环境中进行配置。

1.修改产品的mk文件,添加如下代码

将路径添加到PRODUCT_PACKAGE_OVERLAYS或DEVICE_PACKAGE_OVERLAYS变量中。

   PRODUCT_PACKAGE_OVERLAYS:用于一个指定的产品,即某个品牌的某个型号。

   DEVICE_PACKAGE_OVERLAYS: 用于某个品牌的所有产品。

   一般"device/" 路径下的overlay使用DEVICE_PACKAGE_OVERLAYS,而"vendor/"路径下的overlay使用    PRODUCT_PACKAGE_OVERLAYS。

  如果我们在编译时PRODUCT_PACKAGE_OVERLAYS和DEVICE_PACKAGE_OVERLAYS都被加载而且overlay了源包中的相同的资源,那么PRODUCT_PACKAGE_OVERLAYS中的overlay资源会被最终使用。

 

配置overlay的路径 这是配置的父路径 ,具体资源路径需要和原先使用时的路径和文件名一致

PRODUCT_PACKAGE_OVERLAYS := device/sample/overlays/backup


2.在overlays目录下添加对应产品的overlay项目,overlay项目实际上就是源项目剔除代码和替换资源后的项目,注意包名路径需要与源项目保持一致

overlay的内容

<resources>

   <string name="def_backup_transport">com.google.android.gms/.backup.BackupTransportService</string>

</resources>


盒子中的例子:vendor\xxx\TV\product.mk 中定义了

PRODUCT_PACKAGE_OVERLAYS := \

   vendor/xxx/TV/overlays

vendor/xxx/TV/overlays 路径下配置了该文件

相当于替换了 frameworks\base\core\res\res\values\config.xml 文件

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

   <!-- Control the behavior when the user long presses the power button.

           0 - Nothing

           1 - Global actions menu

           2 - Power off (with confirmation)

           3 - Power off (without confirmation)

           4 - Go to voice assist

           5 - Go to assistant (Settings.Secure.ASSISTANT)

   -->

   <integer name="config_longPressOnPowerBehavior">2</integer>

</resources>

2运行时Overlay

盒子中的实例

运行时Overlay,简称RRO,顾名思义,该机制的资源替换发生在运行时

与SRO的区别

  1. RRO能直接定制替换第三方APK的资源,而不需要其源码。SRO则需要对应APK的源码才能完成.
  2. RRO的编译结果会得到一个xxx_overlay.apk,加上原项目的apk,总共会有2个apk,而SRO最终只会得到一个已经完成资源替换的apk。得到的overlay.apk可以视为一个正常的apk,因为它能被安装,含有自己的AndroidManifest.xml文件,正常情况下,overlay.apk是不含有执行代码的。
  3. RRO不能替换AndroidManifest.xml文件及reference resource 类型的文件,如layout、anim、xml目录中的xml文件。虽然RRO具有自己的AndroidManifest.xml文件,但它却不能替换源项目中的AndroidManifest.xml文件。关于layout目录中的xml文件,SRO是可以替换的。

配置步骤

  1. 创建一个新项目,包名命名为com.android.launcher.overlay,其中包名可以随意命名
  2. 编辑overlay项目的AndroidManifest.xml文件,文件内容如下:
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.CHANGE_OVERLAY_PACKAGES"
        tools:ignore="ProtectedPermissions" />
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.overlaytest">
   <overlay android:target-package="com.example.overlaytest" android:priority="1" android:isStatic="true"/>
</manifest>

其中, android:targetPackage:需要overlay的项目的包名 android:priority:设置overlay.apk的优先级,值越大,优先级越高,用于存在多个overlay.apk情况下的判断。

“android:targetPackage"是我们要替换资源的目标apk的包名,如果要替换framework下的资源,可以将"android:targetPackage"写成"android”。

3.替换相应的res资源

4.编写mk文件,编译、打包、签名,并将生成的overlay.apk输出到/vendor/overlay目录下,其中签名需要与源项目签名一致,否则不会生效。 注意: 把app放到vendor/overlay下面以后,还要activate,默认是disable的 activate有两种方式: 一种是overlay的app的清单文件中,overlay标签写 isStatic="true" 一种是加系统属性ro.boot.vendor.overlay.theme=overlay的app的包名,分号分隔

Android S framework的overlay机制

由于之前使用的是 静态overlay,但是SRO在S上失效,所以改用RRO,配置步骤如下:

1.在 vendor\xxx\TV\product.mk 下 添加要包含进去的模块名称。

PRODUCT_PACKAGES += \

   libkeyprovision \

   SkDroidOverlay  \

2.复制对应的overlay包到vendor\xxx\TV\overlays\ 文件夹下

除此之外,我们还可以通过adb查看和启动overlay

查看

adb shell cmd overlay list --user current


签名的[ x ]表示其正在被使用状态。

启用

adb shell cmd overlay enable overlay的packageName

总结

SRO ,一般在android源码编译阶段一起编译,或者push到/vendor/overlay目录下,重启生效。

RRO, 直接安装,通过代码控制,更加灵活。


目录
相关文章
|
4天前
|
Cloud Native 网络协议 数据中心
Overlay网络与Underlay网络:深入探索与全面对比
在当今云原生的世界中🌍☁️,网络是构建和维护任何分布式系统的基石💎。了解Overlay网络和Underlay网络及其之间的区别🔍,对于设计高效、可扩展的云原生应用至关重要🚀。本文旨在全面解析Overlay和Underlay网络,揭示它们的工作原理、优缺点,并说明何种情况下应该使用哪一种网络📚。
Overlay网络与Underlay网络:深入探索与全面对比
|
4天前
|
Android开发
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
19 0
|
4天前
|
负载均衡 算法 应用服务中间件
Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/5)
Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/5)
193 0
|
7月前
|
Cloud Native Linux 虚拟化
【云原生】Docker跨主机网络Overlay与Macvlan的区别
【云原生】Docker跨主机网络Overlay与Macvlan的区别
118 0
|
9月前
|
关系型数据库 MySQL 应用服务中间件
docker--容器间通信 Link(单向通信)、bridge(双向通信)
docker--容器间通信 Link(单向通信)、bridge(双向通信)
|
10月前
|
存储 程序员 内存技术
"overlay"(叠加)
"overlay"(叠加)
103 1
|
10月前
|
Kubernetes Perl 容器
Pod 的实现机制之网络篇
Pod 这样一个东西,本身是一个逻辑概念。Pod核心就在于如何让一个 Pod 里的多个容器之间最高效的共享某些资源和数据。
170 0
|
编解码 API 计算机视觉
PYNQ-overlay
PYNQ-overlay
263 0
|
Kubernetes 网络协议 机器人
K8S 之 Flannel 的 vxlan 网络模式初步源码解析
详细解析过 Flannel 的 vxlan 模式的网络通信原理,本篇将继续深入结合源码进行探索