安卓插件化分享_第1页
安卓插件化分享_第2页
安卓插件化分享_第3页
安卓插件化分享_第4页
安卓插件化分享_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、安卓插件化分享李东江目录 什么叫插件化(what) 为什么要使用插件化?插件化带来的好处?(why) Android在插件化存在的问题和方案 (how) 贴吧中插件化的实现 贴吧中插件化遇到的问题和解决方案 插件化Demo计算机硬件系统中有各种各样可插拔组件,比如cpu,硬盘,内存等。当需要升级时,我们可以方便的更换其中一个或者几个,只要符合主板规范,就可以正常工作。软件系统中是否也能这样“即插即用”?什么叫插件化 软件系统中的插件借用了硬件系统中插件的思想。它是一种符合一定规范,实现了特定接口的程序,主要是用来扩展软件的功能。 所谓插件化软件开发就是将软件系统分为一个主系统和若干个子系统,主

2、系统做为容器,为插件提供运行环境,而将子系统做成相对独立的插件。插件化带来的好处 隔离风险 解耦,降低系统复杂性 易于维护 扩展性好 并行开发 其他收益 解决包大小的问题 解决方法数超限,字符数超限的问题Android插件化的问题如何从外部文件加载一个类?如何从外部文件加载so库?如何从外部文件启动一个Activity?如何从外部文件加载资源?Android如何加载类 Java是通过Classloader将类加载到JVM中,Android也是一样 Android是通过DexClassloader、PathClassLoader将dex类加载到Dalvik中 DexClassLoader 可以加

3、载 apk, jar 或者 dex 文件 PathClassLoader只能加载已经安装到 Android 系统中的 apk 文件,也就是 /data/app 目录下的 apk 文件。其它位置的文件加载的时候都会出现 ClassNotFoundException.Classloader都采用了双亲代理模式,什么叫双亲代理模式呢?所谓双亲代理模式就是装载一个类时,先由自己定义的类装载器请求其parent装载,parent再请求它自己的parent装载,直到顶级的Bootstrap ClassLoader。 若某一级的parent能装载则装载之,否则由它的“下级”自己尝试装载。为什么要使用这种双亲

4、委托模式呢? 第一个原因就是因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。 第二个原因就是考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的ClassLoader。 protected synchronized Class loadClass(String name, boolean resolve) throws Cl

5、assNotFoundException / 首先检查该name指定的class是否有被加载 Class c = findLoadedClass(name); if (c = null) try if (parent != null) /如果parent不为null,则调用parent的loadClass进行加载 c = parent.loadClass(name, false); else /parent为null,则调用BootstrapClassLoader进行加载 c = findBootstrapClass0(name); catch (ClassNotFoundException

6、e) /如果仍然无法加载成功,则调用自身的findClass进行加载 c = findClass(name); if (resolve) resolveClass(c); return c;如何从外部文件加载一个类?可以使用DexClassLoader从外部文件加载类Android如何加载SO库 Android通过调用System.loadLibrary加载so库 System.loadLibrary会调用Runtime.getRuntime().loadLibrary loadLibrary会搜索当前调用System.loadLibrary类的ClassLoader的Library路径 pu

7、blic static void loadLibrary(String libName) Runtime.getRuntime().loadLibrary(libName, VMStack.getCallingClassLoader(); 如何从外部文件加载so库?指定ClassLoader的LibraryPathAndroid如何加载Activity 无法通过new一个对象的方式加载,必须用context.startActivity Activity必须在AndroidManifest.xml中配置 最终在ActivityThread (源码)生成Activity对象 最终会用context

8、.mPackageInfo.getClassLoader的classloader加载Activity Version 7及其以下的api context的实现类是android.app.ApplicationContext Version 7以上的api context实现类是android.app.ContextImpl如何从外部文件启动一个Activity?1.在配置文件中配置2.替换context.mPackageInfo中的classLoaderAndroid如何加载资源在activity内部访问资源(字符串,图片等)是很简单的,只要getResources然后就可以得到Resourc

9、es对象,有了Resources对象就可以访问各种资源了Resources对象是通过ContextImpl中的getResource方法拿到的会调用ResourcesManager的getTopLevelResources方法最终调用Resources构造函数Resources的构造函数通过AssetManager初始化AssetManager的私有方法addAssetPath能够添加路径AssetManager只能识别APK中的资源如何从外部文件加载资源?重写Activity的getResource方法,返回有外部资源的ResourceAndroid插件化的问题如何从外部文件加载一个类?如何

10、从外部文件加载so库?如何从外部文件启动一个Activity?如何从外部文件加载资源?ADK中插件化中的主要类PluginCenterPluginPluginDexLoaderPluginDownloaderPluginInstallerPluginResourceManagerRemoteSynchronousDataHelperPluginCenter 对外提供的接口 维护插件列表 通过PluginCenter拿到Plugin 安装、卸载插件 启用禁用插件Plugin 对外提供的接口 加载插件 获取接口实例PluginDexLoader 内部类 获取插件加载需要的classloader 解

11、决Activity、Service等加载问题 解决SO加载问题PluginInstaller 内部类 从Asset安装插件 从其他路径安装插件PluginResourceManager 解决从外部加载资源的问题 管理插件资源的加载 管理全局插件资源路径 创建插件资源的ResourcePluginDownloader & RemoteSynchronousDataHelper PluginDownloader 下载插件 RemoteSynchronousDataHelper 进行多进程同步 同步的时机是 插件安装好的时候 插件启用禁用状态改变的时候ADK中插件化的主要配置文件Plugin.xml 路径 pluginEX/$pluginName/Plugin.xml 会实例化为PluginXMLInfo类型 主要用于插件加载InstallConfig.xml 路径 pluginEX/installedConfig.xml 记录系统中已经安装的插件,启动的时候将已经安装的插件加载EnableConfig.xml 路径pluginEX/$pluginName/EnableConfig.xml 针对不同用户记录插件的启用状态ADK中插件化的目录结构PluginEXXXX1XXX1.apkSO$archPlugin.xmlEnableConfig.xmlXXX2XX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论