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

了解了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

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

时间: 2024-10-20 23:15:06

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

Android中apk动态加载技术研究(1)基础知识研修

java classloader 和android中DexClassloader对比: Java ClassLoader : 作用: 主要用来加载class 到jvm中,以供程序使用,也就是说:java程序可以动态加载类定义,而这个动态加载机制就是通过ClassLoader来实现的 核心loader: A:: bootstrap classloader(启动类加载器) -->加载java核心api,包括用户自定义的classloader和另外两个loader B: ExtClassLoader

Android中的动态加载机制

在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式.如何开发一个可以自定义

Android中的动态加载机制--薛彦顺

在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定

android 中的动态加载

这里所说的动态加载是加载一个包(插件),其实就是一个 apk只是这个apk 动态加载而已.创建一个要动态加载的 apk(插件)写一个类用于动态加载//DynamicTest.java package com.example.liuhailong.idynamic; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.Dia

Android中ListView动态加载数据

1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验. 2. 交互: 进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面. 3. 效果图: 4. 程序实现: package com.focus.l

js 页面图片等元素在普通元素中滚动动态加载技术

/*! * 2012-01-13 v1.1 偏移值计算修改 position → offset * 2012-09-25 v1.2 增加滚动容器参数, 回调参数 * 2015-11-17 v1.3 只对显示元素进行处理 */ (function($) { $.fn.scrollLoading = function(options) { var defaults = { attr: "data-url", container: $(window), callback: $.noop };

APK动态加载框架(DL)解析

意义 这里说说这个开源项目的意义.首先要说的是动态加载技术(或者说插件化)在技术驱动型的公司中扮演这相当重要的角色,当项目越来越庞大的时候,需要通过插件化来减轻应用的内存和cpu占用,还可以实现热插拔,即在不发布新版本的情况下更新某些模块. 我 几个月前开始进行这项技术的研究,当时查询了很多资料,没有找到很好的开源.目前淘宝.微信等都有成熟的动态加载框架,包括apkplug,但是它们都是 不开源的.还有github上有一个开源项目AndroidDynamicLoader,其思想是通过Fragme

Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了更好地阅读本文,你需要先阅读Android apk动态加载机制的研究这篇文章,在此文中,博主分析了Android中apk的动态加载机制,并在文章的最后指出需要解决的两个复杂问题:资源的访问和activity生命周期的管理,而本文将会分析这两个复杂问题的解决方法.需要说明的一点是,我们不可能调起任何一个未安装的

【转】Android类动态加载技术

http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定义控件的Android应用?就像eclipse一样,可以动态加载插件:如何让Android应用执行服务器上的不可预知的代码?如何对Android应用加密,而只在执行时自解密,从而防