从启动一个未安装Apk的页面入门插件化开发

本文介绍了Android插件化开发的概念、优点和两种方式,并详细探讨了如何启动一个未安装的Apk页面。通过重写类加载器、构造新的Resources对象以及管理生命周期,实现不安装式插件的页面展示。文章最后提到了插件页面的跳转问题及提供了一个GitHub示例链接。
摘要由CSDN通过智能技术生成

什么是插件化开发

一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块。此时可能就需要考虑如何分拆整个应用了。
举个栗子,好比小时候玩的小霸王游戏机,你刚买回家的只是一个插卡带的机器,就好比最初下载的apk,当你发现你想玩某一款游戏的时候,就去买专门的卡带插进去即可,而不是非得把游戏一下子全买下来.

插件化优点:

  • 应用程序非常容易扩展,比如一个新的领域要加到旧的应用程序中,只需把这个新的领域做为一个插件,只开发这个小的app就可以了,旧的应用程序可能会原分不动,就连编译打包都不需要。
  • 解除单个dex函数不能超过 65535的限制
  • 模块升级,而不需要将 整个功能全部下载安装
  • 高效开发(编译速度更快)
  • 用户可以根据需要下载模块,减小初次安装的apk体积

插件化的两种方式

1.安装式:通过网络下载插件apk,安装(这样似乎和重新装了一个apk没啥区别感觉),中间可以通过一个webview 动态更新,便于加载新的模块.通过js调用intent启动即可,因为是安装的apk,系统会为apk注入上下文,运行比较方便

2.不安装式:因为apk没有安装,在宿主apk中,无法加载安装包中的资源文件,类文件,注入content,系统也不会为apk管理生命周期,需要通过宿主apk协助加载,本文重点讨论这种方式

话不多说,切入正题……

可是怎么启动一个未安装的apk页面呢??

先po出用于展示插件页面的代理activity吧(当然是在宿主app里的) ,先简单说说里面的几个关键的东西是干啥的,一会在细说(提前抛出一个坑,所有的关于context 的东西,必须重写,因为系统没有入住context,需要调用我们宿主的context)

  • ProxyInterface 是一个lib 中的接口,用于将插件页面的生命周期关联到宿主activity,其中多一个attach(context) 用于模仿系统为apk注入上下文

  • PluginManager.getInstance().dexClassLoader 用于根据插件apk路径构造新的类加载器

  • PluginManager.getInstance().resources 用于根据插件apk路径加载新的Resources对象

  • 通过传入的类名,加上自定义的加载器,这样我们就能通过classloader.loadclass加载未安装的apk中的类啦~~,但是activity 只加载类还是不够滴,activity 需要通过反射拿到构造函数构建,并且,因为不是系统打开的页面,没有context上下文,需要重写getwindow ,getDecoreview等方法,用我们宿主传入的context 为activity获得构造需要的东西, 这样我们的activity差不多已经是8个月大的baby啦,已经具备了展示自己的能力,在关联生命周期之后,就可以展示出来啦……

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值