Android Overlay 是一种资源替换机制,它能在不重新打包 apk 的情况下,覆盖替换 res/ 下的字符和图片等资源。
分为 静态Overlay (Static Resource Overlay) 和 运行时 Overlay (Runtime Resource Overlay) 。
两种 Overlay 方式,都需要资源 id 对应上。大白话就是要替换的资源名称一样、字符串的 id 一样。
静态Overlay (SRO):发生在编译时,需要在 Aosp 源码中配置。
运行时Overlay (RRO):发生在运行时,可以直接覆盖替换其他 apk 的资源而不需要其源码。
静态Overlay (SRO)
可以替换 string.xml 、图片、layout、anim、xml目录中的 xml 文件 。
常用场景:覆盖替换 frameworks/ 、packages/ 目录下的资源文件。如改翻译词条、图片、改默认值等。
frameworks/base/core/res/res/drawable-xxxhdpi/
frameworks/base/core/res/res/layout-xxxhdpi/
frameworks/base/core/res/res/values/
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
packages/apps/Bluetooth/res/values/
1.配置 overlay 目录
在 Aosp 源码下下找到 PRODUCT_PACKAGE_OVERLAYS
的定义,一般都配置在 device 目录下,如 device/xxx/yyy/device.mk ,
# overlay
PRODUCT_PACKAGE_OVERLAYS := \
device/xxx/yyy/overlay
2.替换资源文件
在 device/xxx/yyy/overlay 下按照 frameworks 目录新建对应的文件夹,放入要替换的文件即可。
device/xxx/yyy/overlay/frameworks/
device/xxx/yyy/overlay/packages/
3.全编译验证
全编译验证即可。
运行时 Overlay (RRO)
参考 运行时资源叠加层 (RRO)
可以替换 string.xml 、图片,不能替换 layout、anim、xml 目录中的 xml 文件 。
常用场景:覆盖替换目标 apk 的翻译词条、图片资源等。
假设当前已有 Test.apk ,包名是 com.test 。我们用 运行时 Overlay 的形式替换它的 翻译词条和图片。
1.新建 TestOverlay 目录,创建 Android.mk
新建 TestOverlay 目录,在目录下创建 Android.mk ,
写入这些内容,
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := TestOverlay
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay
LOCAL_CERTIFICATE := shared
LOCAL_AAPT_FLAGS := --auto-add-overlay
include $(BUILD_PACKAGE)
LOCAL_CERTIFICATE 可以写 shared 、platform ,取决于对签名的要求。
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay ,说明编译后生成的 apk 路径在 vendor/overlay/TestOverlay/TestOverlay.apk 。这个路径可以根据不同方案进行调整。
2.创建 AndroidManifest.xml
创建 AndroidManifest.xml ,写入
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.overlay">
<overlay
android:priority="1"
android:isStatic="true"
android:targetPackage="com.test" />
</manifest>
package=“com.test.overlay” 是后面编译生成的 TestOverlay.apk 的包名。
targetPackage 是目标 apk 的包名。
3.放入资源文件
创建 TestOverlay/res/ 目录,放入对应的文件即可,目录机构如 apk 源码目录结构是一样的。
TestOverlay/res/values/strings.xml
TestOverlay/res/values-fa/strings.xml
TestOverlay/res/drawable-hdpi/pic1.png
TestOverlay/res/mipmap-hdpi/mip1.png
需要留意,即使只是想替换 values-fa/strings.xml 里的字符串,values/strings.xml 里也要加上对应的字符串,要不然会替换不成功。
4.编译
修改 device/xxx/yyy/device.mk ,把 TestOverlay 加入编译,文章来源:https://www.toymoban.com/news/detail-430824.html
PRODUCT_PACKAGES += \
FileManagerOverlay \
单编得到 TestOverlay.apk , push 到机器上验证即可。文章来源地址https://www.toymoban.com/news/detail-430824.html
到了这里,关于Android Overlay机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!