Android Overlay机制

这篇具有很好参考价值的文章主要介绍了Android Overlay机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 加入编译,

PRODUCT_PACKAGES += \
    FileManagerOverlay \

单编得到 TestOverlay.apk , push 到机器上验证即可。文章来源地址https://www.toymoban.com/news/detail-430824.html

到了这里,关于Android Overlay机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包