了解了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方法是插件专用的回调方法,当插件Activity被Proxy载入当时候。把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插件化及实现的更多相关文章

  1. 插件化开发—动态载入技术载入已安装和未安装的apk

    首先引入一个概念,动态载入技术是什么?为什么要引入动态载入?它有什么优点呢?首先要明确这几个问题.我们先从 应用程序入手,大家都知道在Android App中.一个应用程序dex文件的方法数最大不能超 ...

  2. Android中通过进程注入技术改动广播接收器的优先级

    前言 这个周末又没有吊事,在家研究了怎样通过进程的注入技术改动广播接收器的优先级.关于这个应用场景是非常多的.并且也非常重要.所以就非常急的去fixed了. Android中的四大组件中有一个广播:B ...

  3. Android中通过进程注入技术修改广播接收器的优先级

    前言 这个周末又没有吊事,在家研究了如何通过进程的注入技术修改广播接收器的优先级,关于这个应用场景是很多的,而且也很重要,所以就很急的去fixed了. Android中的四大组件中有一个广播:Broa ...

  4. Android中的接口回调技术

    Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...

  5. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  6. Android中通过进程注入技术修改系统返回的Mac地址

    致谢 感谢看雪论坛中的这位大神,分享了这个技术:http://bbs.pediy.com/showthread.php?t=186054,从这篇文章中学习到了很多内容,如果没有这篇好文章,我在研究的过 ...

  7. android中listview分页载入数据

    前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...

  8. 转:android中APK开机自动运行

    背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为android.intent.action.BOOT_COMPLETED.只 ...

  9. Android中如何动态添加碎片

    Android中的开发需要兼容手机和平板,两个方面.这就引入了碎片的概念.(注意:这里用的Fragment强烈建议使用support-v4库中的Fragment) 碎片:是一种可以嵌入在活动当中的UI ...

随机推荐

  1. Mac使用之常用快捷键

    正式工作了,公司配给了mac,很多命令跟windows有很大不同,为了自己更好的使用mac本,特此记录平时常用的快捷键命令. 1.复制.保存等:command+c/s等,与windows不同的是ctr ...

  2. JavaScript(十)基本包装类

    基本包装类都具有对象的基本方法     toString   和 valueOf Number 数字是原始类型,那为啥还有方法? 因为他在执行方法的时候会创建一个对应的包装类对象,这个对象有这种方法, ...

  3. Web性能测试术语

    并发用户: 并发一般分为2种情况.一种是严格意义上的并发,即所有的用户在同一时刻做同一件事情或者操作,这种操作一般指做同一类型的业务.比如在信用卡审批业 务中,一定数目的用户在同一时刻对已经完成的审批 ...

  4. PostgreSQL 备忘

    truncate table page_frame_mst; select setval('page_frame_mst_id_seq', 1, false): select setval('imag ...

  5. spring中配置数据源

    spring中配置数据源的几种常见方式: #mysql 数据库配置(jdbc.properties) jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.u ...

  6. Qt 5.8.3 部署/添加 Crypto++第三方库(5.6.5版本)

    首先,Qt没有封装加解密算法库(其实有个哈希函数的函数).介于OpenSSL函数封装不友好,以及先前爆发的心脏滴血漏洞广受诟病,我们考虑在C++上使用一种新的,并且封装友好的,OOAD程度更高的加解密 ...

  7. 系统异常 NSException.h

    FOUNDATION_EXPORT NSExceptionName const NSGenericException; FOUNDATION_EXPORT NSExceptionName const ...

  8. Python学习之LeetCode刷题之路——简单题【1、7、9】

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  9. 验证DNS解析失败:解决办法之一

    今天晚上练习简单的DNS解析验证: 环境是在一台虚拟机上搭建,另一台虚拟机验证,步骤如下: 虚拟机A: 1.安装软件包 bind  和bind-chroot[root@svr7 ~]# yum -y ...

  10. LINUX-文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消

    ls -lh 显示权限 ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 chmod ugo+rwx directory1 设置目录的所有人(u).群组(g)以及其他人(o ...