美文网首页
Android动态加载系列——加载已安装的或未安装的插件APK

Android动态加载系列——加载已安装的或未安装的插件APK

作者: Ex_Joe | 来源:发表于2019-06-21 11:30 被阅读0次

    前言

    移动端APP发展到现在已经日趋成熟,当然随之带来的是业务越来越臃肿,APK体积越来越大。
    为了解决这样的问题,当今行业内有一套非常火的方案————插件化方案。包括滴滴的VirtualAPK、360的RePlugin、腾讯的tinker,都是非常优秀的插件化方案。

    基础

    要学习插件化,我们可以从最基础但也是最重要的入手,把一个已安装|未安装的apk加载成功,并正常调用插件资源。
    这样的实现实际上插件化的优点已经深深埋在根里,就是实现业务与接入的解耦。

    生成插件Context

    当我们需要了解一个APK,获取它的Context是最为直接有效的方法,但是插件是没有Context的,需要利用宿主Context才能生成自身的Context,从而获取插件资源并使用。根据包名可以通过以下方法获取:


    image.png

    生成插件ClassLoader

    若想加载插件的类,需要一个类加载器,那通过上一篇的 ClassLoader加载原理(链接) 学习。因为要加载一个apk中的类而不是dex文件,这时候我们要创建一个PathClassLoader,
    以下:

    image.png

    拿到这个插件的ClassLoader后,形同于整个插件APK就暴露在宿主应用前,可以对为所欲为了(邪恶脸+-+)。

    调用插件APK的类

    使用loadClass方法加载插件类,就能很愉快地使用到插件的资源。
    Host:


    image.png

    Plugin:


    image.png

    最终安装Plugin后,再调起Host,就能看到以下log:


    image.png

    小结

    本文章中示例代码都是用的很简单粗暴的搭建方式。通过下列方式,可以较为优雅地实现这次的插件化方案。

    • 抽象接口类设计
    • 构造缓存业务类对象池

    但实际商用项目开发中,很少会使用已安装插件APK的方案,因为除了系统应用,不会有用户愿意主动安装插件。
    不过咱们可以通过这个实现方式,学习到一个APK是如何调到另外一个APK的,更好地理解classloader的作用。

    相关文章

      网友评论

          本文标题:Android动态加载系列——加载已安装的或未安装的插件APK

          本文链接:https://www.haomeiwen.com/subject/ykgjaqtx.html