Android插件化原理(三)——加载插件资源

Android插件化原理与方案详解 Android插件化是一种开发模式,它允许我们动态地加载和卸载APK,从而实现模块化开发,热更新等功能。本文将详细介绍Android插件化原理,以及几种主流的Android插件化方案。 阅读详情


系列帖子:

Android插件化原理(一)—— 插件类加载、类加载原理、(双亲委托机制)
Android插件化原理(二)—启动插件Activity

应用

单作为一个技术点来讲,其实没有什么意义,还是要围绕需求展开的,加载插件资源最常见的应用就是插件化换肤了。我们直到,apk绝大部分体积都是资源,如果多套主题皮肤,那么包体积就会增加很多,
所以插件化换肤就很实用。可以实现多样化主题,个性化定制,提高了应用的灵活性和扩展性。

应用加载资源的原理

要看加载资源的原理,我们先看一下,在实际运行中如何获取资源的

如何获取资源

Activity

    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        getResources().getDrawable();
        getDrawable(0);
    }

Context

    @Nullable
    public final Drawable getDrawable(@DrawableRes int id) {
   
   
        return getResources().getDrawable(id, getTheme());
    }

实际上,不论是直接调用getDrawable或者Resource().getDrawable(),亦或者getContext().getDrawable()最终调用的都是Re
Resources的方法

Resources


    public Drawable getDrawable(@DrawableRes int id, @Nullable Theme theme)
            throws NotFoundException {
   
   
        return getDrawableForDensity(id, 0, theme);
    }

    @Nullable
    public Drawable getDrawableForDensity(@DrawableRes int id, int density, @Nullable Theme theme) {
   
   
        final TypedValue value = obtainTempTypedValue();
        try {
   
   
            final ResourcesImpl impl = mResourcesImpl;
            impl.getValueForDensity(id, density, value, true);
            return impl.loadDrawable(this, value, id, density, theme);
        } finally {
   
   
            releaseTempTypedValue(value);
        }
    }

    

ResourcesImpl

    void getValueForDensity(@AnyRes int id, int density, TypedValue outValue,
            boolean resolveRefs) throws NotFoundException {
   
   
        boolean found = mAssets.getResourceValue(id, density, outValue, resolveRefs);
        if (found) {
   
   
            return;
        }
        throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id));
    }

其中,最重要的就是 mAssets.getResourceValue(id, density, outValue, resolveRefs),而mAssets就是android.content.res.AssetManager,

AssetManager


    boolean getResourceValue(@AnyRes int resId, int densityDpi, @NonNull TypedValue outValue,
            boolean resolveRefs) {
   
   
        Preconditions.checkNotNull(outValue, "outValue");
        synchronized (this) {
   
   
            ensureValidLocked();
            final int cookie = nativeGetResourceValue(
                    mObject, resId, (short) densityDpi, outValue, resolveRefs);
            if (cookie <= 0) {
   
   
                return false;
            }

            // Convert the changing configurations flags populated by native code.
            outValue.changingConfigurations = ActivityInfo.activityInfoConfigNativeToJava(
                    outValue.changingConfigurations);

            if (outValue.type == TypedValue.TYPE_STRING) {
   
   
                outValue.string = mApkAssets[cookie - 1].getStringFromPool(outValue.data);
            }
            return true;
        }
    }

    private static native int nativeGetResourceValue(long ptr, @AnyRes int resId, short density,
                                                     @NonNull TypedValue outValue, boolean resolveReferences);

最终呢,调用到了nativeGetResourceValue

总结:查找资源从Context开始到Context内部的Resources,再到Resources的成员ResourcesImpl,再到ResourcesImpl的成员AssetManager,最终呢,到大native层,到这一步,我们可以说资源实际上是由AssetManager管理的。
那么,AssetManager又是如何来的呢?

继续往下看应用资源加载原理

android资源加载原理

我们从Activity的创建开始,一步步看他的资源是如何加载出来的

ActivityThread.handleLaunchActivity

    @Override
    public Activity handleLaunchActivity(ActivityClientRecord r,
            PendingTransactionActions pendingActions, Intent customIntent) {
   
   
Android插件化完美实现代码资源加载原理讲解 附可运行demo *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 。 我们通过前4篇的分解,分别将插件化设计到的知识点全部梳理了一遍,如果没有看过的,建议先看前面4篇 1. Binder机制 2. 插件化知识详细分解及原理 之代理,hook,反射, 3. 类加载及dex加载 4. 应用启动过程及类加载过程 5. Android插件化完美实现代码资源加载原理讲解 附可运行demo 阅读详情

相关推荐

Android插件化资源的使用及动态加载 附demo

上一篇我们已经完成了一个真正可运行的插件化demo,而且demo中也解决了插件中不可以使用资源的问题,但是由于篇幅的问题我们并没有对原理讲解,所以这一篇是对上一篇的一个收尾,如果没有看过上一篇建议先看Android插件化完美实现代码资源加载原理讲解 附可运行demo.demo地址 : https://github.com/ljqloveyou123/LiujiaqiAndroid我们的宿主应用调用

yulong0809的专栏 7563

Android插件化原理(一)—— 插件加载、类加载原理、(双亲委托机制)

Acitivity启动原理(一),pauseActivity原理

blankmargin的博客 2396

android插件化

概述 插件化是一种动态升级app功能的解决方案,不同于热修复(仅仅是修复功能),类似于RN、Weex(目的类似)。都是为了在不发版本的情况下,可以让用户用上最新的功能。不过RN、Weex还额外支持跨平台。相对于RN和Weex,插件化有以下的优缺点: 优点: 对于业务方,无额外的学习成本,基本无感知 性能等同于原生、可以做任何原生可以做的事情 天然代码隔离、使得插件化的代码更加的“高内聚、低耦合” 插件并发开发,开发之间互不影响 缺点: 稳定性差,使用了大量大反射...

long8313002的博客 4980

Android开发:深入源码剖析图片加载过程,面试官再也不能为难我了!

*** 关注2:getValue()*/// 查找资源Id & 相关信息存储在 outValue -> 关注3/*** 关注3:AssetManager.getResourceValue()*/// 从Native文件中查找 -> 关注4/*** 关注4:AssetManager.NativeGetResourceValue()*/clazz// ->关注5/*** 关注5:AssetManager.CopyValue()*/if (config!

2401_84010744的博客 687

Android 资源文件匹配规则

Android 资源文件匹配规则 Android 资源文件,可以加各种限定标注,类似我们常用的layout-hdpi ,layout-xhpdi,value-zh-rCN,layout-400x800等等。官方支持的请参考: 应用资源概览 那么Android是怎么去判断使用哪个一个呢? 资源查找 我们知道,不管定义多少个限制符的资源文件,ID只有一个,所以到底取哪个文件夹下面的呢? 以Resource#getDrawable开启。主要流程是:Resource#getDrawable-》Resource#ge

qunimaode的博客 875

插件化之APK动态加载

插件化相关概念: 根据组件化与插件化的区别来了解一下概念 组件化和插件化的区别 组件化:是将一个APP分成多个模块,每个模块都是一个组件(module),开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件,但是最终发布的时候将这些组件合并成一个统一的APK。 插件化:是将整个APP拆分成很多模块,每个模块都是一个APK(组件化的每个模块是一个lib),最终打包的时候将宿主APK和插件APK分开打包,插件APK通过动态下发到宿主APK。 插件化的优点 减小安装APK的体积,按需下载模块

u013773608的博客 2047

Android进阶宝典 -- 插件化1(加载插件中类)

什么是插件化插件化对于Android应用能起到什么好处?可能对于插件化不熟悉的伙伴们都会有这个疑问,或许你在项目中已经遇到过这个问题,只不过是不知道需要采用什么样的方式去解决,我们看下面这个场景。

m0_64420071的博客 901

Android 插件化插件化简介 ( 组件化与插件化 )

一、组件化与插件化、 二、插件化示例、 插件化标准引入、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 9692

Android插件化主流框架和实现原理

写在前面; 这几年移动开发业界兴起的「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优越性,令人目不暇接。随着公司业务快速发展,项目增多,开发资源却有限,如何能在有限资源内满足需求和项目的增长,同时又能快速响应问题和迭代新需求,这就是一个矛盾点。此时,插件化技术正好风生水起,去了解各个主流框架实现思路,看看能对目前工作是否有帮助,是很有必要的。 主要分为以...

chuhe1989的博客 1万+

Android 插件化插件化原理 (加载)

一、" 插件化 " 中的 dex 文件、 二、类加载器分析、 、获取类加载器、 四、双亲委派机制、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3445

Android插件化原理

也叫动态加载技术,应用在不发布新版本的情况下更新,增加或者移除某些功能模块的技术;对Android来说插件化通常是指将App拆分成多个功能模块,包括一个宿主和多个插件,宿主的形式是APK,插件的形式可以是APK(未安装), zip,Jar, dex;;区别于组件化:组件化是将一个App分成多个模块,每个模块都是一个组件(Module),开发的过程中让这些组件相互依赖,并且可以单独开发和调试单个组件,但最终发布的是所有模块合并打包的APK。

1609

插件化知识详细分解及原理 之Binder机制

最近一直在研究插件化的东西,我看了网上大多都是直接上来就开始讲解原理然后写个demo,这样对于很多没有入门的朋友不是很好的理解,下面我会通过自己的研究过程,一步一步循序渐进的将插件化需要的知识点都梳理一遍及讲解,其实学习插件化的好处并不全因为它是一门热门的技术,插件化涉及的知识点很多,可以让我们对android的理解及境界上都会有一个质的飞跃,在我将所有设计的知识点都大概讲一遍后会用一个demo来实

yulong0809的专栏 1万+

Android插件化资源动态加载

Android插件化资源动态加载 一.概述 Android插件化的一个重要问题就是插件资源访问问题,先列出会面对的问题 1.如何加载插件资源 2.如何处理插件资源与宿主资源的处突:插件化资源问题要做到的效果是,如果我们要获取的资源插件中找得到,则加载优先加载插件的,如果找不到,则到宿主资源中找。这样能做到动态更新的效果。 3.如何确保插件和宿主使用到的是被修改过的资源

scholarSu 4603

Android插件化技术

一、Android插件化技术 我们在平时的开发过程中,会经常遇到产品需求的变更或者出现bug,在传统的模式中,我们需要首先需要修改代码,然后重新打包Apk,再交给公司的运营去官网或者应用商店上线,用户在打开应用的时候就会进行更新了。但是这种模式有几个缺点,一是上线周期长,从修改代码到用户更新需要较长的时间;二是用户更新代价较大,每次用户更新都需要下载整个Apk包,整个Apk包包括了...

xiao_nian的博客 7883

安卓漏洞学习(八):Android 插件化技术

android插件的基本原理和实现方法

beefreesky的博客 1111

深入理解Android插件化技术

插件化提要 可以说,插件化技术涉及得非常广泛,其中最核心的就是Android的类加载机制和反射机制,相关原理请大家自行百度。 插件化发展历史 插件化技术最初源于免安装运行apk的想法,这个免安装的apk可以理解为插件。支持插件化的app可以在运行时加载和运行插件,这样便可以将app中一些不常用的功能模块做成插件,一方面减小了安装包的大小,另一方面可以实现app功能的动态扩展。想要实现插件...

android开发笔记 1万+

安卓插件化系列课程-一步步带你实现插件化

前言: 目前安卓领域,插件化十分的流行,本以为这一类的文章会有很多,但是百度一搜,基本上讲的插件化都是皮毛,没有涉及到核心。 所以就想写一系列的文章来一步一步深入的讲解插件化,通过实现逐渐增加难度的需求,最终实现插件化方案。 章节: 插件化系列文章主要包含以下几个篇章: 1.加载插件apk中的类 2.启动插件apk中的activity 3.使用插桩的方式启动apk中的activity 4.使用插件apk中的资源 5.使用插件apk中的so文件 6.插件化加载移动apk。 7.插件化目前所遇到的

分享+记录 2534
上一篇: Gradle系列(2)——如何自定以Gradle 插件
下一篇: Gradle系列(3)——Gradle extension(gradle扩展),如何自定义gradle扩展,AppPlugin,AppExtension原理
cry kid
博客等级 码龄10年 144粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值