获取资源那些事

简介: 获取资源那些事

查找资源过程

先从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路径。



目录
相关文章
|
5月前
|
机器学习/深度学习 算法 TensorFlow
资源消耗
资源消耗是指在计算机系统中对硬件和软件资源的使用情况,包括处理器时间、内存、硬盘空间、网络带宽等。在机器学习和深度学习任务中,由于需要处理大量数据和运行复杂的算法,因此资源消耗通常是一个重要的问题。
72 1
|
8月前
|
SQL 监控 安全
OpenWAF配置本地资源访问
OpenWAF配置本地资源访问
|
弹性计算 数据可视化 关系型数据库
资源
资源
|
消息中间件 存储 弹性计算
资源总结
资源总结
GameMakerStudio学习资源
GameMakerStudio学习资源
71 0
|
前端开发 JavaScript 数据可视化
TailwindCSS 资源推荐
TailwindCSS 发布了 3.0, 功能也越来越好用,那么是否有与之相关的组件库呢 ?本文是我将推荐我个人认为比较好用的资源。
628 0
|
人工智能 JSON 前端开发
学习资源
大家好,推荐一些学习资源给大家 当然大家可以留言评论自己发现的优秀资源地址
|
安全 程序员 编译器
借来的资源,如何还的潇洒?
本文的内容将专门对付内存管理,培养起有借有还的好习惯,方可消除资源管理的问题。
借来的资源,如何还的潇洒?
|
监控 API C#
C#多线程(5):资源池限制
C#多线程(5):资源池限制
179 0
C#多线程(5):资源池限制
|
Kubernetes 容器 Perl
K8S如何限制资源使用
本文介绍几种在K8S中限制资源使用的几种方法。 资源类型 在K8S中可以对两类资源进行限制:cpu和内存。 CPU的单位有: 正实数,代表分配几颗CPU,可以是小数点,比如0.5代表0.5颗CPU,意思是一颗CPU的一半时间。
1692 0