Android跨平台动态化系列-插件化之占位式插件化

Posted 程序Caribbean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android跨平台动态化系列-插件化之占位式插件化相关的知识,希望对你有一定的参考价值。

android跨平台动态化系列(二)-插件化之占位式插件化

前言

       本系列文章我打算以动态化的方案为主线写,第一个方案就是Native动态化,接下来几篇我都会来介绍Native动态化。在Native动态化方案中主要分为热修复、插件化和布局动态化两种大类,本篇文章及接下来几篇文章我打算好好介绍一下插件化。

一、插件化和热更新

1、1 概念

  • 插件化:App的一些功能模块不以传统的方式打进apk文件中,以另一种形式二次封装进app内部,或者放在网络上适时下载,这样子在有需要时可以动态的对这些功能模块进行加载,称此为插件化。初始安装的apk称为宿主,单独进行二次封装的功能模块apk称为插件

  • 热更新:通俗意义上讲就是不安装新版本的软件,直接从网络下载新功能模块来对软件进行局部更新。

1.2 区别和联系

       插件化的原理其实很简单就是动态加载,通过自定义ClassLoader来加载新的dex文件,从而让程序员原本没有的类可以被使用。当然里面的具体实现还要考虑很多,例如四大组件需要注册才可以,这些后面详细分析插件化方案的时候再细细的讲。至于插件化的作用,可以减少安装包大小,还可以动态部署。

       热更新现在有两个流派,第一是Native流派:代表有阿里的DexposedAndFix与腾讯的内部方案KKFix;另一个是Java流派,代表有Qzone的超级补丁、大众点评的nuwa、百度金融的rocooFix、 饿了么的amigo、美团的robust以及微信的Tinker。其原理大概就是ClassLoader的dex替换,和直接修改字节码等。

       热更新和插件化的区别:一是插件化的内容在原 App 中没有,而热更新是原 App 中的内容做了改动;二是插件化在代码中有固定的入口,而热更新则可能改变任何⼀个位置的代码。至于他们两个具体的分析,后面的文章进行详细分析。

二、 占位式插件化

2.1 原理

       占位式插件化和其他的插件化方案不太一样,他没有对android系统的底层方法进行Hook,而是从上层,也就是app应用层解决问题。通过创建一个ProxyXXX的代理类,由他进行分发。由于插件apk是没有安装的,也就是插件apk没有组件的一些环境,比如context上下文对象之类的,如果要用到这些环境就必须依赖宿主的环境运行。所以我们就要宿主跟插件之间定义一个标准,用来传递宿主中的环境给插件。在这里一般的插件中我们需要代理的无非就是四大组件,但是其中的ContentProvider这里不需要做代理,所以我们只需要代理ActivityService、、BroadcastReceiver,下面就分别以这三个代理来进行讲解。


以上是关于Android跨平台动态化系列-插件化之占位式插件化的主要内容,如果未能解决你的问题,请参考以下文章

Android 插件化Hook 插件化框架 ( Hook Activity 启动流程 | 主线程创建 Activity 实例之前使用插件 Activity 类替换占位的组件 )

android插件式开发资料整理

Nagios插件化之ganglia插件

android 动态加载之免安装升级(插件式开发)

android 动态加载之免安装升级(插件式开发)

插件化之插件Service 新的Hook方法