Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >获取资源那些事

获取资源那些事

作者头像
北洋
发布于 2022-05-06 07:36:15
发布于 2022-05-06 07:36:15
3830
举报
文章被收录于专栏:北洋csdn北洋csdn

查找资源过程

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
源码分析| Resource 加载资源
​ 既然资源的加载是通过 Resource 类,如果想要获取另一个 apk 中的资源文件,那么自己实例化一个 Resource 进行加载可以吗?
345
2022/02/11
4980
蘑菇街Android组件与插件化
插件化的基石 -- apk动态加载 随着我街业务的蓬勃发展,产品和运营随时上新功能新活动的需求越来越强烈,经常可以听到“有个功能我想周x上,行不行”。行么?当然是不行啦,上新功能得发新版本啊,到时候费时费力打乱开发节奏不说,覆盖率也是个问题。苏格拉底曾经说过:“现在移动端的主要矛盾是产品日益增长的功能需求与平台落后的发布流程之间的矛盾”。 当然,作为一个靠谱的程序猿,我们就是为了满足产品的需求而存在的(正义脸)。于是在一个阳光明媚的早晨,吃完公司的免费早餐后,我和小强、叶开,决定做一个完善的Andro
xiangzhihong
2018/02/01
7530
Android插件化学习之路(四)之使用插件中的R资源
res里的每一个资源都会在R.java里生成一个对应的Integer类型的id,APP启动时会先把R.java注册到当前的上下文环境,我们在代码里以R文件的方式使用资源时正是通过使用这些id访问res资源,然而插件的R.java并没有注册到当前的上下文环境,所以插件的res资源也就无法通过id使用了。
老马的编程之旅
2022/06/22
6720
求知 | 聊聊Android资源加载那些事 - Resource的初始化
在上一篇,求知 | 聊聊Android资源加载的那些事 - 小试牛刀 中,我们通过探讨 Resource.getx() ,从而解释了相关方法的背后实现, 明白了那些我们日常调用方法的背后实现。
Petterp
2022/12/07
4520
求知 | 聊聊Android资源加载那些事 - Resource的初始化
LayoutInflater 布局渲染工具原理分析
LayoutInflater其实是一个布局渲染工具,其本质就只是一个工具,说白了LayoutInflater的作用就是根据xml布局文件构建View树,自定义View的时候经常用到,常用的做法如下: View tmpView= LayoutInflater.from(context). inflate(R.layout.content,container,false); 首先通过LayoutInflater.from静态函数获得一个LayoutInflater实例,其实是是个PhoneLayoutInfl
用户1269200
2018/02/01
5530
Android7.0中的ResourceNotFoundException
随着Android N的出现,适配7.0的问题也成为了各大产品头疼的问题。而最近在我们的平台上面收到了7.0的Crash。具体的栈如下:
None_Ling
2018/10/24
1.9K0
Android7.0中的ResourceNotFoundException
LayoutInflater 布局渲染工具原理分析
LayoutInflater其实是一个布局渲染工具,其本质就只是一个工具,说白了LayoutInflater的作用就是根据xml布局文件构建View树,自定义View的时候经常用到,常用的做法如下:
看书的小蜗牛
2018/06/29
8690
LayoutInflater 布局渲染工具原理分析
字节头条部Android二面:说一说Android动态换肤实现原理吧,答不上来下一个
这种换肤的方式,也就是我们所说的内置换肤,就是在APP内部放置多套相同的资源。进行资源的切换。
Android技术干货分享
2021/01/18
2.2K0
字节头条部Android二面:说一说Android动态换肤实现原理吧,答不上来下一个
Android资源混淆打包方案
概述 我们知道在Android的打包过程中,有一个步骤是压缩,也是为了减少apk包的大小,其中在压缩的过程中,很大一部分就是对资源的压缩,除了系统的压缩方案之外,我们今天讲另外两种压缩方案:微信方案和美团方案 微信的方案是通过修改aapt在处理资源文件相关的源码达到资源文件的替换;而后者指通过直接修改resources.arsc文件达到资源文件混淆的目的。相比之下,微信的方案更加优秀。 微信资源混淆方案 微信中的资源混淆工具主要为了混淆资源ID长度(例如将res/drawable/welcome.png混淆
xiangzhihong
2018/01/26
2.7K0
Android的打包过程与资源分配
最近这个版本需要降低APK的大小, 所以很多功能需要从主APK中移除到插件中,除了相关工程的代码,还有Assets、Libs、Resources都需要移动到插件中,而在插件拆分的过程中也遇到了很多问题,需要记录一下。
None_Ling
2018/12/21
1.1K0
Android高级面试问题及答案(1)——Android Framework篇
1.按下电源,启动引导程序 BootLoader,启动linux内核,init进程启动,所以init是android系统的第一个进程,进程号为1。 2.init进程主要做以下几件事: 1)创建和挂载启动所需要的文件目录 2)初始化和启动属性服务,属性值的更改仅能在init进程中进行,通过socket来响应其它进程提交的申请。
老马的编程之旅
2022/06/22
3.3K0
Android高级面试问题及答案(1)——Android Framework篇
求知 | Android资源加载的那些事 - 小试牛刀
聊到到 Android 的 资源加载 ,每一个开发同学都会非常熟悉,毕竟 getText() 等, 我们实在用了太多。
Petterp
2022/10/28
6120
求知 | Android资源加载的那些事 - 小试牛刀
学习笔记:插件化资源解决
getResource传入R.资源名称,通过资源名称可以找到对应的资源ID(通过R.java文件保证),之后AssetManager通过资源ID找到对应的资源文件名称(通过arsc文件保证)
北洋
2022/05/06
3590
Android更新资源文件浅思考
最近在看 《深入探索Android热修复技术原理7.3Q.pdf》 时,遇到一个之前没有注意过的问题:关于资源修更新的Android的版本兼容?作为程序员我们需要非常严谨的思路,是什么导致了资源的修复更新需要做版本兼容?
静默加载
2020/05/29
1.2K0
源码分析| Resource 加载资源
​ 既然资源的加载是通过 Resource 类,如果想要获取另一个 apk 中的资源文件,那么自己实例化一个 Resource 进行加载可以吗?
345
2022/02/15
6860
【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
文章目录 一、AAPT2 资源编译工具 二、resources.arsc 资源映射表 工作机制 三、参考资料 一、AAPT2 资源编译工具 ---- 资源的编译 , 生成 R.java 文件 , 都是
韩曙亮
2023/03/29
1.1K0
【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
Resources和AssetManager创建过程
到这里AssetManager创建完毕。然后设置相关的路径 AssetManager assets = new AssetManager(); // resDir can be null if the 'android' package is creating a new Resources object. // This is fine, since each AssetManager automatically loads the 'android' package // already. if (resDir != null) { if (assets.addAssetPath(resDir) == 0) { return null; } } if (splitResDirs != null) { for (String splitResDir : splitResDirs) { if (assets.addAssetPath(splitResDir) == 0) { return null; } } } if (overlayDirs != null) { for (String idmapPath : overlayDirs) { assets.addOverlayPath(idmapPath); } } if (libDirs != null) { for (String libDir : libDirs) { if (libDir.endsWith(".apk")) { // Avoid opening files we know do not have resources, // like code-only .jar files. if (assets.addAssetPath(libDir) == 0) { Log.w(TAG, "Asset path '" + libDir + "' does not exist or contains no resources."); } } } } 接着就创建Resource对象 r = new Resources(assets, dm, config, compatInfo); 这里看到AssetManager保存到了Resources对象中。接着进入到Resources的构造方法中 public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config, CompatibilityInfo compatInfo) { mAssets = assets; mMetrics.setToDefaults(); if (compatInfo != null) { mCompatibilityInfo = compatInfo; } updateConfiguration(config, metrics); assets.ensureStringBlocks(); } 最后进入到updateConfiguration(Configuration config, DisplayMetrics metrics, CompatibilityInfo compat) mAssets.setConfiguration(mConfiguration.mcc, mConfiguration.mnc, locale, mConfiguration.orientation, mConfiguration.touchscreen, mConfiguration.densityDpi, mConfiguration.keyboard, keyboardHidden, mConfiguration.navigation, width, height, mConfiguration.smallestScreenWidthDp, mConfiguration.screenWidthDp, mConfiguration.screenHeightDp, mConfiguration.screenLayout, mConfiguration.uiMode, Build.VERSION.RESOURCES
用户2929716
2018/08/23
8720
Resources和AssetManager创建过程
《Android插件化技术——原理篇》
| 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头。从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结其中的技术原理。由于本人水平有限,插件化框架又相当复杂,文中若有错误或者不准确的地方望高手指点。 内容概要 一、发展历史 插件化技术最初源于免安装运行apk的想法,这个免安装的apk可以理解为插件。支持插件化的app可以在运行时加载和运行插件,这样便可以将app中一些不常用的功能模块做成插件,一方面减小了安
腾讯Bugly
2018/03/23
9.9K0
android应用资源预编译,编译和打包全解析
我们知道,在一个APK文件中,除了有代码文件之外,还有很多资源文件。这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的。在打包之前,大部分文本格式的XML资源文件还会被编译成二进制格式的XML资源文件。在本文中,我们就详细分析XML资源文件的编译和打包过程,为后面深入了解Android系统的资源管理框架打下坚实的基础。         在前面Android资源管理框架(Asset Manager)简要介绍和学习计划一文
xiangzhihong
2018/02/01
3.3K0
android应用资源预编译,编译和打包全解析
Android插件化原理解析
在解决插件中组件的生命周期,通常的做法是通过 Hook相应的系统对象,实现欺上瞒下,后面将通过Activity的插件化来进行讲解。
用户1205080
2019/02/26
9070
相关推荐
源码分析| Resource 加载资源
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档