码迷,mamicode.com
首页 > 移动开发 > 详细

Android中apk动态加载技术研究(2)android插件化及实现

时间:2015-07-01 18:25:46      阅读:403      评论:0      收藏:0      [点我收藏+]

标签:dexclassloader   插件化   动态加载   

   了解了android中类加载的前期知识点后,来看看android中DexClassLoader具体的实现
    具体加载流程如下:
    宿主程序会到文件系统比如SD卡中去加载APK【1】,然后通过一个叫proxy的Activity去执行apk中的Activity
    关于动态加载ap,理论上可用用到DexClassLoad、PathClassLoader、URLClassLoader;
     DexClassLoader: 可以加载文件系统上的jar、dex、apk
    PathClassLoader:可以加载 /data/app 目录下的apk,这也意味着它只能加载已经安装的apk
   URLClassLoader:可以加载java中的jar,但由于android中的dalvik不能直接识别jar,所有该方法在android中无法使用,虽然有这个类
  
    获取AssetsManager
           加载的方法是通过反射,通过调用AssetManager中的addAssetPath方法,我们可以将一个apk中的资源加载到Resources中,由于addAssetPath是隐藏api我们无法直接调用,所以只能通过反射,下面是它的声明,通过注释我们可以看出,传递的路径可以是zip文件也可以是一个资源目录,而apk就是一个zip,所以直接将apk的路径传给它,资源就加载到AssetManager中了,然后再通过AssetManager来创建一个新的Resources对象,这个对象就是我们可以使用的apk中的资源了


  封装数据:
    1:把classLoader、assetManager、resource作为插件的成员,封装成bean
    2:多插件时通过Map维护,其中key为apk的packageName


  插件加载到内存流程:

  技术分享

加载插件的Activity:

   

?          插件Activity本身无法启动(生命周期,资源等问题),是通过宿主提供的ProxyActivity来加载的。
?         当我们发Intent去启动插件当Activity时实质启动的是ProxyActivity   
?         为了封装细节所以封装了DXIntent
?         所有插件实现了IDXPlugin接口
         PrxoyActivity接管了所有插件Activity


DXPluginBean 封装bean

    ?封装了每个Plugin也就是apk的数据
?    维护在DXPluginManger类的Map


   DXPluginManager 插件管理核心类
      
?         加载插件、启动插件、插件维护

    IDXPlugin:

     ?把每个插件的Activity抽象成一个“插件”
?     IDXPlugin实现了Activity的主要方法
?    onAttach方法是插件专用的回调方法,当插件ActivityProxy加载当时候proxy的引用赋值给that

   DXIntent:
?   pluginPackgeName: 跳转的Plugin的包名,也就是Manifest里的packageName

   pluginClassName:跳转的Plugin中指定的ActivityName,可以传null,则默认时跳转main Activity


   DXPluginBaseActivity、DXPluginBaseFragmentActivity:

      所有插件Activity继承这两个Activity

      该Activity实现IDXPlugin接口

      onAttach方法中获得proxyActivity的引用

?    所有activity继承方法中需要对插件本身启动还是在宿主中被启动进行判断 ----》FROM_INTERNAL和FROM_EXTERNAL

  DXProxyActivity、DXProxyFragmentActivity :.
?     宿主Activity
?    host中调用插件Activity的跳转,本质就是这两个Activity之间的跳转
?    为插件提供真正的Context
?   为减少重复代码将插件的初始化放在DXPluginInitializer类中    

    DXPluginInitializer
     ?修复theme带来的崩溃问题
    ? 启动插件Activity

     1 通过反射获得插件Activity的默认构造函数

     2 通过反射new出一个插件并强转成IDXPlugin

    3 回调onAttach方法传入Prxoy的引用

  4 调用onCreate方法调起插件



可以直接参考demo:

   http://download.csdn.net/detail/yaya_soft/8858645



版权声明:本文为博主原创文章,未经博主允许不得转载。

Android中apk动态加载技术研究(2)android插件化及实现

标签:dexclassloader   插件化   动态加载   

原文地址:http://blog.csdn.net/yaya_soft/article/details/46709773

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!