插件化研究之资源冲突

简介:

最近在研究Android应用的插件化开发, 插件化都是在解决以下几个问题:

本章我们来研究最后一个问题:资源共享与冲突。在《Android应用程序插件化研究之AssertManager》中,我们实现了加载插件apk中资源问题,实际上我们是单独创建了用于访问插件资源的AssertManager和Resource对象,即,插件独立使用一个资源管理器,这样插件宿主之间无法共享资源。

资源共享

如果需要宿主、插件之间使用同一套资源管理器,那么我们需要将插件的资源路径添加到宿主的AssetManager中。

我们知道,apk包括代码和资源,在apk编译过程中,dex工具将代码打包成.dex文件,资源文件会由aapt工具生成对应的ID,aapt在打包的时候组织成resources.arsc文件(详细参考: Android应用程序资源的编译和打包过程分析),resources.arsc文件是用来描述资源ID和资源位置配置信息,从18个维度描述了一个资源ID的配置信息(语言、分辨率等),就是资源ID和资源的索引表。资源的ID生成是有规则的,规则:0xPPTTNNNN,由8位16进制组成,其中:
PP段:表示资源的包空间:0x01表示系统资源空间,0x7f表示应用资源空间。
TT段:表示资源类型。
NNNN段:4个16进制表示资源id,一个apk中同一类型资源从0000开始递增。
例如:

nt anim pop_dialog_in 0x7f040000
int anim pop_dialog_out 0x7f040001
int anim slide_left_in 0x7f040002
int anim slide_left_out 0x7f040003
int anim slide_right_in 0x7f040004
int anim slide_right_out 0x7f040005
int anim update_loading_progressbar_anim 0x7f040006
int array indicator_tab_icon 0x7f050001
int array indicator_tab_titlt 0x7f050000

现在问题来了,宿主apk和插件apk是独立编译出来的两个独立的apk,那么其中就有资源ID相同的情况出现,从而产生资源ID冲突。如何解决这个问题?看了一些开源框架,解决的办法就是修改资源ID的PP段,大体有两种做法:

修改aapt源码,定制aapt工具编译期间修改PP段。

DynamicAPK的做法就是如此,定制aapt,替换google的原始aapt,在编译的时候可以传入参数修改PP段:例如传入0x05编译得到的资源的PP段就是0x05。个人觉得这个做法不是太灵活,入侵了原有的开发编译流程,不好维护。

修改aapt的产物,即,编译后期重新整理插件Apk的资源,编排ID。

前面说过apk编译之后会生成ID以及对应的索引表resorce.arsc,那么我们能不能后期修改相关ID及索引表呢?答案是肯定的,个人比较赞同这种思路,不用入侵原有编译流程。

结尾

插件系列文章到此结束了,如果你从第一章开始看到此处,你应该明白插件化要解决的问题、实现的思路、要掌握的技术,如果你理解完这5篇文章,你应该有能力写出一个简单的插件方案了。文章重在点明思路,实践才是最重要的,关于实践我们要做的还有很多很多。

目录
相关文章
|
机器学习/深度学习 数据采集 vr&ar
3D重建范式变革!最新模型MVDiffusion++
【2月更文挑战第30天】MVDiffusion++,一项革命性的3D重建技术,能在少量图像和无相机姿态信息下生成高密度、高分辨率的3D视图,简化重建流程。采用无姿态架构和视图丢弃策略,提升效率和质量。在Objaverse和Google Scanned Objects数据集上表现优越,且能与文本到图像生成模型结合,潜力广泛应用于游戏、电影和虚拟现实。然而,对训练数据质量和计算资源的需求是其挑战。
242 4
3D重建范式变革!最新模型MVDiffusion++
|
存储 测试技术 API
魔搭Agent体验升级!支持编辑已发布的Agent、新增tool说明书等
魔搭Agent作为开源版GPTs,可以零代码DIY一个具备丰富功能的chat bot,今天上线了一个新版本优化了相关体验,来看!
|
安全 Java API
java中HashMap的七种遍历方式
java.util.ConcurrentModificationException , 这种办法是非安全的 , 我们可以使用Iterator.remove() ,或者是Lambda 中的 removeIf() , 或者是Stream 中的 filter() 过滤或者删除相关数据
207 1
|
Java 应用服务中间件 Maven
IDEA创建一个Servlet项目(tomcat10)
IDEA创建一个Servlet项目(tomcat10)
826 1
|
SQL 监控 关系型数据库
MySQL主从复制详解
在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热闹,写写这方面的内容吧,同时分享下自己的经验和方法。
1429 0
MySQL主从复制详解
|
弹性计算 固态存储 大数据
2024年购买阿里云服务器多少钱一年?吐血整理,价格真优惠呀!
阿里云服务器2024年最新租用价格: 轻量应用服务器2核2G3M带宽一年82元, 折合6.8元/月; 2核4G4M带宽一年298元。新老用户共享99元/年的2核2G3M带宽ECS服务器, 2核4G5M带宽ECS优惠价199元/年。4核16G10M带宽服务器70元/月、210元/3个月; 8核32G10M带宽服务器160元/月、480元/3个月。GPU服务器如gn6v最高配置336G内存, 8核32G一个月4685.20元, 一年46097.40元。按小时计费的云服务器ECS如2核8G通用型每小时0.45元, 4核8G通用型每小时0.702元。
355 0
|
Java 程序员 数据格式
老程序员分享:java进阶(36)
老程序员分享:java进阶(36)
76 0
|
XML 设计模式 缓存
面试必问系列之最强源码分析,带你一步步弄清楚Spring如何解决循环依赖
面试必问系列之最强源码分析,带你一步步弄清楚Spring如何解决循环依赖
29715 6
面试必问系列之最强源码分析,带你一步步弄清楚Spring如何解决循环依赖
|
SQL 运维 安全
网站托管和网站维护是一样的吗?两者有什么区别
网站托管和网站维护是不一样的,网站托管一系列服务内容要远远多于网站维护内容。网站维护更多的只是维持网站的正常访问,而网站托管在网站维护的基础上,更多的对企业网站进行全面宣传。
277 0
网站托管和网站维护是一样的吗?两者有什么区别
|
缓存 负载均衡 监控
开发必备知识:通过网站架构演进与计算机网络模型深入理解“网关”、“正向代理”、“反向代理”含义
反向代理与网关都是从网站架构中发展而来的产物,原来在Web1.0与Web2.0时代,一般都用反向代理,采用前置反向代理来完成反向路由、负载均衡、日志监控、缓存、兼容熔断等功能,常见的就是Nginx等等,反向代理一般采用静态配置,是因为Web时代中网站更新换代是不快的。
开发必备知识:通过网站架构演进与计算机网络模型深入理解“网关”、“正向代理”、“反向代理”含义