本篇文章给大家谈谈深入解析Android资源管理:流程分析与插件化资源Hook技术实现,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
Android资源管理器AssetManager的创建过程[3]
背景分析
如何在多个APK环境下存储资源
AssetsManger和Resources如何实现资源访问
Android-Framework-Plugin插件化资源创建[4]
概括
摘要主要讲解了资源的基本认识以及资源的打包流程和注意事项。
资源分类
assets资源
res资源 res目录下的资源会被赋予ID.方便我们通过ID访问资源
animator - 属性动画anim - 补间动画颜色- 可绘制颜色资源- 图像资源布局- 布局资源菜单- 菜单资源raw - 任何格式资源,它会像assets下的资源一样保持不变APK 文件,但仍然会被分配一个ID,我们也可以通过ID 来访问它Resources res=getResources();
输入流=res .openRawResource(R.raw.filename);
Values - 描述一些简单的资源xml - 描述应用程序的配置信息资源
注意:
以上9种资源,除了Bitmap文件的raw类型资源和drawable类型资源外,其余的资源都会被编译成打包过程中二进制格式的xml文件,
这些二进制文件各自都有一个字符串资源池,用于保存文件中引用的资源。
这样做的好处是文件占用空间较小,解析速度较快。编译完成后,Res资源将被分配一个资源ID,该资源ID将保存在R.java文件中,并与应用程序的其他源文件一起编译到程序中。 ID 是唯一的,不会发生资源冲突,唯一的情况是
资源打包过程
。除了assets和res/raw资源原样导入到APK中外,其他资源都会被编译成二进制文件输入到APK中。除了assets资源外,其他资源都会被赋予一个资源ID。打包工具完成资源的打包编译后,会生成resources.arsc文件和R.java文件。前者是资源索引表,后者是资源ID表。 AndroidManifest.xml 也会被编译成二进制XML 文件。应用程序通过AssetManager来访问资源,或者通过资源ID访问,或者通过文件名访问
自定义资源ID的取值范围
使用场景
当我们在插件中定义的资源打包被编译到主机资源列表中时,为了避免之间的冲突这些资源和主机的资源一样,需要我们为主机的资源定义一个ID范围。
自定以资源方式
在Android资源中,有一种称为Public的资源类型。它们一般在res/values/public.xml 文件中定义,格式如下:
?xml 版本="1.0"编码="utf-8"?
xml分析
type 用于指定资源类型名称。 appt 使用它在编译期间重新分配资源的名称。 name_resource name start 是值end 的起始位置。值的结束位置。每当aapt重新编译修改过的资源时,这些资源都会被重新分配ID。
Android资源管理器AssetManager的创建过程
上下文环境解析
每个Activity 都与一个ContextImpl 对象关联。 Activity和ContextImpl都继承自Context;因此,Activity的大部分成员函数都是通过调用ContextImpl对象的对应函数来处理的。访问程序资源是通过调用ContextImpl对象来实现的。 getResources() 实现的getResources() 和getAssets() 函数返回一个Resources 对象。通过Resources对象,我们可以通过资源ID来访问资源。
getAssets() 返回一个AssetsManager 对象。通过AssetsManager对象我们可以通过文件名访问编译后的资源文件。
其实Resources也是通过AssetsManager来访问资源文件的,只不过它会先通过资源ID
多个APK环境下资源的存储方式
找到资源文件名。 Android系统允许一个进程中存在多个apk文件,每个APK文件都会有一个全局的Resources对象和AssetsManager对象,
全局的Resources对象保存在对应的ContextImpl对象的成员变量mResources中。全局的AssetsManager对象存储在对应的Resources对象的成员变量mAssets中。
AssetsManger和Resources如何实现资源访问的
Resources访问资源
Resources类中的成员函数getAssets(),通过getAssets()可以获取Resources类中的成员变量mAssets的AssetsManager对象,所以访问资源的最终实现还是由AssetsManager来实现:010 -1010 1.AssetsManager类除了Java层的实现外,还有对应的C++层的实现。 Java层的AssetsManager类的功能是通过C++层实现的; 2、Java层的每个AssetsManager对象都有一个int类型的成员变量mObject,mObject保存了C++层对应的AssetsManager对象的地址。 3、Java层对象和C++层对象可以通过mObject变量关联起来。 4、C++层的AssetsManager类有3个重要的成员变量mAssetPaths——资源存放目录mResources——指向一个资源索引表,供Resources对象通过资源ID来访问资源。 mConfig - 设备的本地配置信息,包括屏幕密度和尺寸、国家、地区、语言等。
有了这三个变量,C++层的AssetsManager类就可以访问程序资源了
AssetsManager访问资源
1.创建AssetManager代理类的实例。因为它是AssetManager的代理,所以需要将AssetManasger实例传递给代理。在HackAssetManager 中hackAssetManager=new HackAssetManager(assetMgr); 2、在HackAssetManager中通过反射添加assetPaths数组中的资源路径hackAssetManager.addAssetPaths(assetPaths); 3、完成上述步骤后,我们需要创建字符串资源池,实现资源添加hackAssetManager.ensureStringBlocks(); //创建字符串资源池4.现在我们可以获取资源了
资源pluginRes=new PluginResourceWrapper(assetMgr, mainRes.getDisplayMetrics(),mainRes.getConfiguration(), pluginDescriptor);
//assetMgr是我们集成的Asset资源
//mainRes是宿主机的Resources实例,调用了它的两个属性方法。
//pluginDescriptor是插件的属性数据序列化类实例
//通过实例化this来获取Resources资源实例。具体实现代码请前往Android-Fragmework-Plugin,GitHub地址
Android-Framework-Plugin插件化资源创建
摘要
自定义资源ID取值范围
Android资源管理器AssetManager的创建过程
Android-Framework-Plugin插件资源创建
如果你还想了解更多这方面的信息,记得收藏关注本站。
【深入解析Android资源管理:流程分析与插件化资源Hook技术实现】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
学习这篇文章希望能更深入地了解Android Resource Manager是怎么运作的
有12位网友表示赞同!
感觉现在越来越多人对系统架构有研究,这个和插件化开发应该很相关!
有9位网友表示赞同!
想问问文章里提到的hook机制具体怎么做到的呢?
有9位网友表示赞同!
学习一下Hook技术,搞明白Android源码,这太棒了!
有18位网友表示赞同!
最近在研究动态加载资源文件,这篇文档正好能解答我一些困惑啊。
有10位网友表示赞同!
插件化开发对应用的维护和扩展很有帮助,资源管理器方面也是关键部分
有16位网友表示赞同!
看到文章里提到了Android Resource Manager的分析,那它在系统中主要作用是什么呢?
有16位网友表示赞同!
学习这些代码,能让我更理解系统内部是怎么运作的吗?
有19位网友表示赞同!
真希望能找到更多关于安卓系统的深入分析资料!
有7位网友表示赞同!
这篇文章对Android平台开发者来说非常有意义,可以提升我们的开发水平。
有15位网友表示赞同!
感觉这篇文章的深度很高,需要多加研究才能理解所有内容。很期待学习新的知识!
有6位网友表示赞同!
资源管理器是系统中的重要组成部分,掌握它的原理有助于我们更好地开发应用程序。
有11位网友表示赞同!
插画化实现Hook功能,听起来很有意思啊!
有15位网友表示赞同!
文章的标题很吸引人,我非常想了解Android Resource Manager是如何工作的!
有19位网友表示赞同!
学习一下Hook技术的原理和应用场景可以让我提升Android开发技能!
有5位网友表示赞同!
这篇文章是安卓系统学习的好资源,可以帮助我们更好地理解它。
有14位网友表示赞同!
期待看到这篇论文的详细内容,希望能深入了解Android Resource Manager的架构。
有19位网友表示赞同!
文章标题很贴切,正好点明了文章的内容和目标,我迫不及待想要阅读!
有7位网友表示赞同!
希望这篇文章能详细讲解资源管理器的工作原理以及Hook技术在实践中的示例。
有15位网友表示赞同!