基于 Android的 Activity插件化技术研究与实现

(整期优先)网络出版时间:2020-04-16
/ 2

基于 Android的 Activity插件化技术研究与实现

闫新惠

北京信息职业技术学院 北京 100018

摘要Android插件化是Anroid平台上的新型技术。Android平台上的软件(APP)增加新功能,传统方法可以采用手动升级APP,这样需要用户的干预,频繁的升级会导致用户体验的下降,而且对于APP不同版本的存在,运营和服务器接口维护也需要投入。采用插件化架构,可以避免手动升级APP,直接给用户新功能,用户体验和APP运营等都带来方便。

【关键词】Android;Activity插件化技术;研究;实现

1.插件化技术简介

安卓是时下最流行的移动操作系统,在智能手机操作系统中占有大部分市场份额。Android系统本身是一个丰富的生态圈,其上应用程序(APP)采用java语言,开发生成APK文件后便可以安装运行。通常开发者通过不断升级APP来完成功能扩展,采用插件化技术后,便可以免去升级,直接增加新的功能。Android的java虚拟机(Davlik/ART)本身具备读取APK文件的能力,通过动态加载APK中的类,便可实现简单的功能扩展,但是这项技术有较大局限性,无法实现Android组件(例如Activity)的扩展,也无法加载资源文件,也就无法动态生成界面。所以采用这种方法只能加载简单的java类,实现有限的动态化。Android的主要功能提供者”四大组件”(即Activity, Content Provider, Service, Broadcast Listener)是注册在APP的配置文件中,不可更改,也就不能动态替代。本文提供一种插件化技术,解决这个限制。由于Activity是四大组件的核心元素,其插件化更是重中之重,我们主要提供Activity的插件化方案。此方案主要有2种办法,一种是通过接管ActivityManager类来实现,另一种是接管Instrumentation实现。首先我们需要从整体上了解Activity的启动流程。大体上Activity可以分为2中,APP进程运行的第一个Activity和后续Activity,Android会将启动的Activity缓存,再次启动时速度会更快,所以相对第一个启动的Activity流程复杂些。按进程启动流程图如下:

1.1.Activity的启动

zygote是android的基础进程,它的主要作用就是克隆(fork)自己,然后将子进程作为APP进程运行,同时当APP进程死亡时,zygote进程也负责回收和清理资源。创建首个Activity后,Activity的主线程也就是ActivityThread,会初始化java虚拟机并执行,自此APP就运行在java环境中。

1.2.其它Activity的启动

APP运行后,其它Activity启动就简单的多了由于APP进程已经启动,无需zygote参与,SystemServer中也管理了APP的Activity栈信息,SystemServer只需检测APP的Actvitiy栈,直接请求ActivityThread创建(没有在栈中)或运行(在栈中)新的Activity即可。

2.插件化实现

Activity的启动需要在APP的Manifest.xml文件中定义,插件化技术需要避开这一点,我们需要准备一个占位的Activity,但它并不完成任何功能,功能是由插件Activity完成的,插件Activity无需注册,可以在后台静默下载,占位Activity作用就是启动插件Activity,从而完成新功能扩展。实现要点是在创建Activity的时候接管系统操作,一般有2种接管的方法,我们分别介绍。

2.1.接管ActivityManager

这个方法主要是在ActivityThread运行新的Activity时接管。运行Activity的操作由IActivityManager代理类完成,它通过AIDL和SystemServer通信,而IActivityManager对象由ActivityManagerNative的getDefault方法获取得到,这是一个单例对象,只有一个全局静态对象gDefault。我们可以通过替代此对象来完成最终目的。通过java反射技术,替换全局静态对象gDefault为我们自己的对象,这个对象需要实现IActivityManager接口,接口的实现可以由java动态代理技术完成。通过这些操作,我们在启动占位Activity时替接管系统操作,最终启动了插件Activity,插件Activity无需配置,可动态下载,从而完成APP功能插件化。在代码示例中我们固定了插件Activity,实际中可以灵活配置,通过intent传递参数给占位Activity,根据不同参数替换不同插件Activity。

2.2.Activity的生命周期

Activity的生命周期由SystemServer中的ActivityManager对象管理,我们实现了接管使插件Activity替代目标Activity,那么Activity的生命周期有影响吗?研究ActivityManager的实现代码发现,在创建完Activity后,它保存Activity的token在mToken变量中,以后ActivityManager与Activity的交互都是基于token的,与Activity的类无关,所以我们虽然替换了Activity,但是其生命周期依然保持不变。

3.结束语

本文介绍了android的插件机制,实现了在android中动态加载插件模块。详细分析了2中不同的插件实现机制。插件模块技术是构建大型软件的基础,在实际应用中,我们从网络下载模块包文件,并在运行时加载插件,取得良好效果,软件具有极好的扩充性。

参考文献:

[1] 邓凡平..深入理解Android卷 1[M].北京: 机械出版社,2011年

作者简介: 闫新惠(1974-),女(汉),山东省泰安市人,讲师,硕士,主要研究方向为计算机应用,yanxh@bitc.edu.cn;

TEL:13699283058

地址:朝阳区东坝红松园北里甲1号。 邮编:100018