当前位置:   article > 正文

android ndk怎样加载o文件_Android进阶资源和Service的插件化

android .o文件
5500d4225b7beaab3df5709234f4a9b8.png

一、系统资源加载

1、资源类别

  • res目录下存放的资源文件。编译时会在R文件中生成资源文件的十六进制值。res目录下资源通过Context.getResource方法获取到Resource对象,然后通过getXXX获取资源。
  • assets目录下存放的原始文件,编译时不会被编译。通过AssetManager的open方法获取目录下文件资源,AssetManager来源于Resources类的getAssets方法

2、Resources

(1)AssetManager

3bb1e2e715fb8a14fdcb0ec399fc48da.png
  • AssetManage有一个addAssetPath方法,将apk路径传入,Resources就能访问当前apk的所有资源。可以通过反射的方式将插件apk路径传入addAssetPath方法。
  • AssetManager内部有一个NDK方法,用来访问文件。apk打包时会生成一个resources.arsc文件,是一个Hash表,存放着十六进制和资源的对应关系

二、VirtualApk插件资源加载

资源插件化实现方式:

  • 合并资源:将插件的资源合并到宿主的Resources中,可以访问宿主的资源。可能存在插件和宿主的资源id重复的情况。
  • 解决方式:
  1. 修改Android打包流程中使用到的aapt命令,为插件的资源id指定前缀,避免与宿主资源id冲突。
  2. 在Android打包生成resources.arsc文件之后,对这个resources.arsc文件进行修改。
  • 单独加载插件资源:每个插件都会构造单独的Resources去加载插件资源,不能访问宿主资源

1、Resources创建

#LoadedPluginpublic LoadedPlugin(PluginManager pluginManager, Context context, File apk) throws Exception { ...... this.mResources = createResources(context, getPackageName(), apk); ......}protected Resources createResources(Context context, String packageName, File apk) throws Exception { if (Constants.COMBINE_RESOURCES) { //插件资源合并到宿主中,插件可访问宿主资源 return ResourcesManager.createResources(context, packageName, apk); } else { //插件创建独立的Resources,不与宿主关联 Resources hostResources = context.getResources(); AssetManager assetManager = createAssetManager(context, apk); return new Resources(assetManager, hostResources.getDisplayMetrics(), hostResources.getConfiguration()); }}

2、插件资源独立

主要通过反射创建新的AssetManager对象,通过addAssetPath加载插件资源。适用于资源独立的情况,无法调用宿主资源

protected AssetManager createAssetManager(Context context, File apk) throws Exception { //通过反射创建新的AssetManager对象,通过addAssetPath加载插件资源 AssetManager am = AssetManager.class.newInstance(); Reflector.with(am).method("addAssetPath
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/319215
推荐阅读
相关标签
  

闽ICP备14008679号