当前位置: 首页 > news >正文

Android 资源替换:静态替换 vs 动态替换

Android 资源替换:静态替换 vs 动态替换

一、静态替换(DEVICE_PACKAGE_OVERLAYS)

原理

静态替换是在系统编译阶段通过指定资源目录,将定制资源直接替换目标应用的原始资源,最终打包到系统镜像中。替换后原始资源被永久覆盖,运行时无法修改,类似「编译时的强制复制替换」。

示例:替换Launcher3的图标

  1. 目录结构
android/
├── device/
│   └── 芯片厂商/
│       └── 芯片项目/
│           ├── Android.mk          # 编译配置
│           └── overlay/            # 覆盖资源目录
│               └── com.android.launcher3/ # 路径要与源代码的路径相同
│                   └── res/
│                       └── drawable-xxhdpi/
│                           └── ic_launcher_home.png  # 定制的图标
  1. Android.mk配置
# 定义当前路径
LOCAL_PATH := $(call my-dir)# 将overlay目录添加到设备覆盖路径
DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay
  1. 效果
  • 系统编译时,会自动用overlay/com.android.launcher3/res/drawable-xxhdpi/ic_launcher_home.png替换Launcher3应用中的同名图标
  • 编译完成后,该替换永久生效,用户无法在设备上修改或恢复原始图标
  • 仅替换指定资源,Launcher3的其他未被覆盖的资源保持原样
  1. 类似原理
    静态替换(如 DEVICE_PACKAGE_OVERLAYS)的核心效果类似 cp -f(强制复制替换),但实现层面更复杂一些。
    从最终效果看:
    就像用 cp -f overlay/res/layout/main.xml original/app/res/layout/main.xml 命令,用覆盖目录中的文件强制替换原始文件,最终打包到系统中的是替换后的版本。原始资源在编译后的系统中不再存在,被完全覆盖。
    但从实现机制看:
    比 cp -f 更智能 ——Android 编译系统会对比资源目录结构,只替换同名同路径的资源,非同名资源会保留原始版本,无需手动复制整个目录。

简单说,静态替换可以理解为「编译阶段的智能 cp -f」,只针对性替换需要定制的资源,其余保持原样。

二、动态替换(标签资源包)

原理

动态替换是通过安装独立的资源APK,在应用运行时动态加载资源。系统会按照priority属性(值越高优先级越高)查找资源,高优先级资源会覆盖低优先级资源和原始资源,可通过安装/卸载APK控制替换效果。

示例:替换Launcher3的布局

  1. 目录结构
launcher_overlay/
├── AndroidManifest.xml  # 声明覆盖配置
└── res/└── layout/└── workspace.xml  # 定制的布局文件
  1. AndroidManifest.xml配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.launcheroverlay"android:versionCode="1"android:versionName="1.0"><!-- 声明无代码,仅含资源 --><application android:hasCode="false" /><!-- 声明覆盖目标 --><overlay android:targetPackage="com.android.launcher3"  <!-- 目标应用包名 -->android:priority="10"                         <!-- 优先级(高) 值越大越高 -->android:isStatic="true" /><!-- 声明权限(API 26+ 要求) --><uses-permission android:name="android.permission.OVERLAY_RESOURCE" />
</manifest>
  1. 使用流程
  • 将上述文件打包成APK(如launcher_overlay.apk
  • 通过adb install launcher_overlay.apk安装到设备
  • 安装后立即生效,Launcher3会使用定制的workspace.xml布局
  • 卸载该APK后,自动恢复原始布局
  1. 优先级说明
  • 若同时安装了优先级为5和10的两个覆盖包,系统会优先使用优先级10的资源
  • 若覆盖包中不存在某个资源,系统会自动使用目标应用的原始资源

三、核心差异对比

维度静态替换(DEVICE_PACKAGE_OVERLAYS)动态替换(标签)
生效阶段系统编译时应用运行时(覆盖包安装后)
存在形式资源目录独立APK(仅含资源)
灵活性固定不可变,需重新编译系统动态可控,支持安装/卸载/切换
优先级控制仅通过目录顺序通过android:priority精确控制
适用场景ROM系统定制、设备厂商适配主题包、功能补丁、用户可选定制
http://www.dtcms.com/a/340885.html

相关文章:

  • PHP特有的安全漏洞及渗透测试利用方法(通俗易懂)
  • 项目1总结其一
  • 49 C++ STL模板库18-类模板-pair
  • ROS 2系统Callback Group概念笔记
  • 突发!DeepSeek刚刚开源V3.1-Base
  • UTF-8 编解码可视化分析
  • 【Day 30】Linux-SQL语句
  • C/C++ 与嵌入式岗位常见笔试题详解
  • MYSQL为什么会发生死锁,怎么解决
  • 第三阶段数据-3:数据库脚本生成,备份与还原,分离与附加
  • configtx通道配置文件
  • RHCA08内存管理
  • 对称加密算法
  • 数据库DML语言(增、删、改)
  • 闪电赋能全链路:领码SPARK一体化创新平台
  • 基于HTTP3的WebTransport实践
  • 基于 Java 和 MySQL 的精品课程网站
  • 在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本2)
  • Ubuntu 重连usb设备(断电和不断电方案)亲测可行
  • 亚马逊新品爆单策略:从传统困境到智能突破
  • LeetCode热题100--101. 对称二叉树--简单
  • C++ 力扣 438.找到字符串中所有字母异位词 题解 优选算法 滑动窗口 每日一题
  • 《数据之舞》
  • GitHub宕机生存指南:从应急协作到高可用架构设计
  • QT-图像灰度处理时QImage.setPixel方法存在的坑
  • 在QT中动态生成控件造成界面卡顿时的鼠标处理
  • Qt设置软件使用期限【新版防修改系统时间】
  • 一个 WPF 文档和工具窗口布局容器
  • GitHub宕机应急指南:无缝协作方案
  • Eclipse 里Mybatis的xml的头部报错