获取资源那些事

简介: 获取资源那些事

查找资源过程

先从R.java中找到对应ID所对应的资源名称,再去arsc后缀文件中查找对应的资源路径利用AssetManager在native层打开该资源文件

大致链路:

Context的getResource—》Resource----》AssetManager—》Native层AssetManager打开资源文件

Zygote替你做的事

zygote会进行调用prepareresource方法,这个方法创建了Resource中的msystem(代表系统资源)和Assetmanager中的mAsset(代表系统资源)这两个静态变量。因此app进程可以共享这两个变量。

prepareresource

在prepareresource方法中会创建一个Assetmanager并调用addpath将framework-res.apk(系统资源APK)中的资源添加到assetmanager中,这个assetmanager对象就是assetmanager中的静态变量mAsset对象,它代表framework的资源,接下来会进行添加字符串池操作把framework涉及到的资源文件名添加到常量池中。

创建mresource和masset

最后创建Resource对象将上面创建出来的mAsset传入到resource构造函数中,这样就完成了系统测的资源添加过程并且mresource和masset这两个代表系统资源的静态对象也创建完成了。

App进程:

由于是zygote进行fork出来的所以共享这两个变量。

流程:

1.在即将创建Activity的时候会创建context上下文对象,通过basecreatecontextimpl生成contextimpl对象

2.contextimpl对象中会初始化mresources变量和massets变量(也就是上面Zygote做的操作,这里进行检查一次如果没有则主动进行添加framew-res.apk的资源)

3.该过程第一步也就是创建assetmanager,在assetmanager的构造方法中会进行添加framework-res.apk的路径也就是构造方法中就已经调用了一次addpath来把framework的资源加到资源管理者当中

4.第二部会再次调用assetmanager的addpath方法来把当前应用apk的路径添加到其中,,然后将资源文件名添加到字符串常量池中。这时候assetManager不仅可以访问到framework资源也可以访问到应用资源,但是这步只是生成了资源管理者

5.最后一步创建出一个resource对象,将assetmanager传入到构造方法中即可返回该resource便是context的getresource返回值

这时候应用资源和系统资源都可以使用

查找方法

根据资源id在arsc中查找如果不是文件直接返回即可,如果是文件则会调用assetmanager的openfile打开文件返回,因为上面进行了adspath把apk中的arsc文件中传了进去所以随后通过arac查找到资源文件

总结

frame workres.apk的资源也可以在应用程序中使用是因为在创建assetmanager的时候已经把framework-ree.apk的资源添加进去了,之后又添加了应用程序的apk路径。



相关文章
|
存储 移动开发 前端开发
浅谈前端路由原理hash和history
众所周知, hash 和 history 在前端面试中是很常考的一道题目。在学习本文内容之前,周一对 hash 和 history 的认知可能就在 hash 的 url 里面多了个 # ,而 history 就不会。然后,我认知里还有一个是只有 history 才能做前后端分离,而 hash 跟前后端分离没有关系。然而,现实是……
浅谈前端路由原理hash和history
|
安全 Windows
Antimalware Service Executable占CPU怎么解决?
Antimalware Service Executable占CPU怎么解决? Antimalware Service Executable导致电脑卡顿怎么解决? Antimalware Service Executable怎么关闭?
20212 1
|
11月前
|
Docker 容器
|
10月前
|
前端开发 Android开发 iOS开发
探索Android与iOS的跨平台开发策略
在移动应用开发的多元化时代,跨平台开发已成为开发者追求效率和广泛覆盖的重要手段。本文深入探讨了Android与iOS两大主流平台下的跨平台开发策略,分析了各自的优势与挑战,并通过实际案例展示了如何有效实施跨平台解决方案,以期为开发者提供有价值的参考和启示。
|
11月前
|
人工智能 关系型数据库 Serverless
1024,致开发者们——希望和你一起用技术人独有的方式,庆祝你的主场
阿里云开发者社区推出“1024·云上见”程序员节专题活动,包括云上实操、开发者测评和征文三个分会场,提供14个实操活动、3个解决方案、3 个产品方案的测评及征文比赛,旨在帮助开发者提升技能、分享经验,共筑技术梦想。
1736 160
|
11月前
|
程序员 开发者
1024程序员节特辑:代码千万行,看TA为你续航
1024开发者节,阿里云为程序员们准备了特别礼物——阿里云来电套装,包括高颜值的硬糖充电器。10月24日,北京合生汇将举办快闪活动,凭预约码以旧换新,现场还有更多惊喜等你来!祝每一位开发者节日快乐!
|
消息中间件 网络协议 大数据
[flink 实时流基础]源算子和转换算子
[flink 实时流基础]源算子和转换算子
157 1
|
11月前
|
并行计算 PyTorch 算法框架/工具
OSError: [WinError 1455] 页面文件太小,无法完成操作如何解决。
如何解决Windows系统中出现的"OSError: [WinError 1455] 页面文件太小,无法完成操作"的错误。文章提供了具体的解决步骤。
494 0
OSError: [WinError 1455] 页面文件太小,无法完成操作如何解决。
|
人工智能 数据可视化 数据挖掘
【python】Python航空公司客户价值数据分析(代码+论文)【独一无二】
【python】Python航空公司客户价值数据分析(代码+论文)【独一无二】
|
关系型数据库 MySQL 数据库
【Databend】多表联结,你不会还没有掌握吧!
【Databend】多表联结,你不会还没有掌握吧!
200 2