当前位置: 首页 > 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.lryc.cn/news/626858.html

相关文章:

  • 猫头虎开源AI分享|基于大模型和RAG的一款智能text2sql问答系统:SQLBot(SQL-RAG-QABot),可以帮你用自然语言查询数据库
  • Https之(二)TLS的DH密钥协商算法
  • FFmpeg的基本概述(二)
  • 基于 Java 和 MySQL 的精品课程网站
  • 零知开源——基于STM32F103RBT6与ADXL362三轴加速度计的体感迷宫游戏设计与实现
  • AV1视频编码器2024-2025技术进展与行业应用分析
  • 全球首款 8K 全景无人机影翎 A1 发布解读:航拍进入“先飞行后取景”时代
  • 《算法导论》第 33 章 - 计算几何学
  • 189.轮转数组
  • Linux多线程——线程池
  • Dubbo 的 Java 项目间调用的完整示例
  • 新手向:Python实现文件加密解密工具
  • 【java面试day16】mysql-覆盖索引
  • 害虫检测识别数据集:近4K图像,6类,yolo标注
  • 【CocosCreator】electron/Cocos双窗口本地模拟聊天系统
  • Spring事务源码
  • PyTorch API 1
  • 【数据结构】递归与非递归:归并排序全解析
  • 第一章:认识 CAD 图形文件 —— DXF 格式
  • 车载软件架构 --- 赢得汽车软件开发竞赛
  • 好家园房产中介网后台管理完整(python+flask+mysql)
  • Scikit-learn 预处理函数分类详解
  • 【Task02】:四步构建简单rag(第一章3节)
  • 第R6周:LSTM实现糖尿病探索与预测
  • 深度学习核心技巧与实战指南
  • 机器学习中的数据处理技巧
  • Node.js中的Prisma应用:现代数据库开发的最佳实践
  • 关联规则挖掘3:Eclat算法——等价类转换(Equivalence Class Transformation)
  • Simulink实现RELS递推最小二乘算法
  • 【机器学习】什么是损失景观(Loss Landscape)?