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-11-05 04:51:14

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

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

了解了android中类加载的前期知识点后,来看看android中DexClassLoader具体的实现 具体加载流程如下: 宿主程序会到文件系统比如SD卡中去加载APK[1],然后通过一个叫proxy的Activity去执行apk中的Activity 关于动态加载ap,理论上可用用到DexClassLoad.PathClassLoader.URLClassLoader; DexClassLoader: 可以加载文件系统上的jar.dex.apk PathClassLoader:可以加载 /da

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

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

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

前言 这个周末又没有吊事,在家研究了如何通过进程的注入技术修改广播接收器的优先级,关于这个应用场景是很多的,而且也很重要,所以就很急的去fixed了. Android中的四大组件中有一个广播:Broadcast 关于它的相关知识可以转战:http://blog.csdn.net/jiangwei0910410003/article/details/19150705 我们这里就不做太多解释了,现在来看一下问题: 知识前提 这篇文章和我之前介绍一篇文章: Andrdoid中对应用程序的行为拦截实现方

Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)

一.前言 时隔半年,困扰的问题始终是需要解决的,之前也算是没时间弄,今天因为有人在此提起这个问题,那么就不能不解决了,这里写一篇文章记录一下吧.那么是什么问题呢? 就是关于之前的一个话题:Android中apk加固技术实现 关于这个问题,之前的一篇文章已经说过了,没有了解的同学可以点击这里:Android中apk加固技术实现 请务必仔细的看完这篇文章,不然今天说的内容会感觉很蛋疼的,因为今天的文章就是为了解决当初的加固技术遗留的问题,这里先大致来说一下加固apk的原理吧,先来看一张图: 看到这张

谈谈-Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面

Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面

Android热补丁动态修复技术(完结篇):自动生成打包带签名的补丁,重构项目

一.关于前面四篇博文 Android热补丁动态修复技术(一):从Dex分包原理到热补丁 Android热补丁动态修复技术(二):实战!CLASS_ISPREVERIFIED问题! Android热补丁动态修复技术(三)-- 使用Javassist注入字节码,完成热补丁框架雏形(可使用) Android热补丁动态修复技术(四):自动化生成补丁--解决混淆问题 前两篇博文主要是介绍热补丁修复技术的一些原理和实现方案. 而后面两篇博文主要是介绍如何使用代码实现整个热补丁框架,但是框架写的真的很糟糕,很

Android中的动态加载机制

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

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

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