学习笔记:插件化资源解决

简介: 学习笔记:插件化资源解决

一,资源获取

getResource传入R.资源名称,通过资源名称可以找到对应的资源ID(通过R.java文件保证),之后AssetManager通过资源ID找到对应的资源文件名称(通过arsc文件保证)

二,资源冲突:

插件和宿主使用aapt打包资源,aapt生成R和arsc文件是根据前缀信息(在aapt逻辑中apk默认为0X71)和资源顺序来进行命名的

因此会出现同一个资源ID在插件和宿主中都有对应的资源文件系统会出错。因此我们需要修改前缀即可保证,修改哪些前缀信息呢:

解决方案概述

根据上面的原理,可知道两种解决方案:

第一种

修改aapt脚本。我在aapt创建R,arsc文件时的源头上进行拦截,aapt使用我自定义的前缀这样出来的R文件和arsc文件里面的前缀就会和宿主不一样。【默认0X71(系统会根据不同的包用不同的前缀信息),使用自定义生成的R和arsc使用我自定义的前缀】

第二种

我在aapt打包后进行修改替换R和arsc文件。需要在aapt第一步整理生成对应的R.java(对应编译类型会生成不同的R文件varint)进行拦截,捕获原始的r.java文件修改之后编译为class存储起来。

之后再javac的过程中使用我们的这个class文件,取出arsc文件修改对应的前缀。

三,方案可行性:

第一种

简单直接,只需修改aapt中使用资源前缀的逻辑增加新case就好

缺点是需要进行修改aapt文件且不同SDK版本都需要生成一个aapt文件与之对应。

第二种

只需简单修改task名字即可,不需要根据不同sdk平台生成不同的aapt。复用性强。

缺点:需要修改的地方较多:1.生成R.java时还须修改完再次手动调用javac编译为class存储2.进行javac时在用之前生成的class。对arsc文件进行修改

方案二 不修改aapt,在打包后进行资源id冲突处理。将插件资源前缀改为0X71,72等 可自定义的数字防止资源冲突:同一个资源ID对应多个资源文件

四,优化资源复用问题:

很多情况下插件和宿主中的默认文件夹里面放的都是相同的资源比如android自动生成的那些图片等,占据着很多空间很少是自己独有的。

因此可以进行优化,提炼出一份名单位于这个名单里面的资源可以进行删除,时机是在生成我们修改后的R.java文件时我们可以根据这个名单删除对应资源

该方案是基于方案二提出的(方案一也可以进行该处理,只不过方案二更顺理成章).该方案已有开源框架实现~。

(默认的aapt在决定使用前缀时会进行case判断系统,library,apk然后使用不同的前缀。

方案一是对aapt进行修改,使用aapt时新增Bundle参数携带前缀信息,在使用前缀时增加新case,取出Bundle中的前缀信息,使用传入的前缀)。


目录
相关文章
|
存储 缓存 JSON
Unity资源热更新知识梳理及工作流介绍
研究了大半年的热更,才做出了一套相对完善的热更架构。不得不说,这块的知识点还是多而杂的,值得专门开篇博文来记录梳理。
2601 0
|
3月前
|
分布式计算 API 对象存储
Ray是一个开源的分布式计算框架,用于构建和扩展分布式应用。它提供了简单的API,使得开发者可以轻松地编写并行和分布式代码,而无需担心底层的复杂性。
Ray是一个开源的分布式计算框架,用于构建和扩展分布式应用。它提供了简单的API,使得开发者可以轻松地编写并行和分布式代码,而无需担心底层的复杂性。
526 11
|
3月前
|
缓存 图形学 UED
U3D开发技术深度解析:异步场景加载与资源管理优化策略
【7月更文第11天】在Unity3D(简称U3D)游戏开发中,优化场景加载与资源管理是提升用户体验的关键一环。通过实现高效的异步场景加载和智能的资源管理策略,我们能显著缩短玩家的等待时间,提升游戏流畅度。本文将详细介绍这两种技术的应用,并提供实用的代码示例。
233 0
|
4月前
|
小程序 存储 UED
如何实现一次搭建 多平台适配的小程序
【6月更文挑战第3天】如何实现一次搭建 多平台适配的小程序
|
4月前
|
缓存 监控 安全
构建高效的后端服务:最佳实践与性能优化策略
【6月更文挑战第27天】本文深入探讨了如何构建高效且可扩展的后端服务。我们将从系统架构设计、数据库优化、缓存机制、并发处理、安全性考量以及监控与日志管理等多个角度出发,为读者提供一系列实用的技术和策略。文章不仅涵盖了理论知识,还结合了实际案例分析,旨在帮助后端开发者提升服务性能,确保系统的高可用性和可靠性。
|
5月前
|
运维 监控 Android开发
构建高效自动化运维系统的策略与实践构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第29天】随着信息技术的迅猛发展,企业IT基础设施变得日益复杂,传统的手动运维模式已难以满足高效率、高稳定性的要求。本文将深入探讨如何通过自动化工具和策略来构建一个高效的自动化运维系统。文中不仅分析了自动化运维的必要性,还详细介绍了实现过程中的关键步骤,包括监控、配置管理、故障响应等,并结合实际案例分析其效果,以期为读者提供一套行之有效的自动化运维解决方案。
|
负载均衡 JavaScript Dubbo
基于常见组件微服务场景实战:如何对几十个后台服务进行高效管理
基于常见组件的微服务场景实战,注册发现 下面开始微服务相关内容的讲解。在这一部分中,仍然从最基础的场景入手,然后再逐步展开说明,帮助大家快速掌握一些微服务组件的实现原理,最终理解微服务架构的本质。
|
弹性计算 JSON 运维
资源编排基础知识|学习笔记
快速学习资源编排基础知识
资源编排基础知识|学习笔记
|
传感器 存储 SQL
应用编排与管理:核心原理|学习笔记
快速学习应用编排与管理:核心原理
115 0
应用编排与管理:核心原理|学习笔记
|
资源调度 数据安全/隐私保护
Umi@3 中最灵活的权限控制方案
Umi@3 中最灵活的权限控制方案
1026 0