close
当前位置: 物联网在线 > 技术文库 > android >

APP项目如何与插件化无缝结合(二)

上一篇主要介绍插件化的一些概念和作用,以及我为什么选择Small。现在来具体介绍下small。

Small的原理 1.动态加载class

APP项目如何与插件化无缝结合(二)

Android类由DexClassLoader 加载,如果直接在编译搜索这个类的时候出现下面这种情况,我开始以为是没有关联源码,还折腾了好一会,后面发现,应该是特意搜不到了。不过开源直接在https://android.googlesource.com 搜。请自备梯子,我一般是用lantern+谷歌浏览器。

APP项目如何与插件化无缝结合(二)

DexClassLoader的构造方法里面调用了父类的构造方法,我们跟进去可以看到BaseDexClassLoader 里面有个dexPath参数,这个通常是应用储存apk的目录/data/../*.apk。现在用来作为创建pathList。我们再看看new DexPathList里面做了什么。

APP项目如何与插件化无缝结合(二)

DexPathList里面调用makeDexElements方法创建dexElements。我们跟进去看看做了什么。

APP项目如何与插件化无缝结合(二)

可以看到,DexClassLoader不支持".so"后缀。那么small是怎么做的呢,看看伪代码。

APP项目如何与插件化无缝结合(二)

为了让应用启动时能自动复制插件包到应用存储目录,需要支持".so"后缀。做法就是模拟压缩包加载代码块,创建一个dex元素,再反射添加到宿主class loader里的dexPathList。后面的演示过程中,你会看到small更新的所谓插件,就是编译过后的so文件。

2.动态加载resources

APP项目如何与插件化无缝结合(二)

安卓资源由AssetManager加载。应用启动时,系统会为其创建一个AssetManager实例,并由addAssetPath方法添加资源搜索路径,默认添加:"/framework/base.apk" - Android base resources (base),"/data/app/*.apk" - The launching apk resources (host)

APP项目如何与插件化无缝结合(二)

APP项目如何与插件化无缝结合(二)

所有的资源需要通过一个唯一的id来访问,通常是形如0xPPTTNNNN,每个字段PPT的那个图有相应的介绍,我就不多说了。那么如何处理这个资源id分配的问题呢?有下面几种方案

APP项目如何与插件化无缝结合(二)

但是这几种方案都有问题,为什么有问题的方案还会提?我是觉得这样可以养成一种思考的能力。第一种会导致插件之间不能访问资源。2.1字段有限,不好维护;2.2插件间无法访问资源;2.3修改aapt源码,不好维护。如果修改aapt生成产物,无缝连接,支持极致剪裁。资源包进行重新打包,重设资源id,small就是采取这种方式。具体深入的实现,这里就不提了。感兴趣的可以继续查看源码看看。

3.动态注册activities

APP项目如何与插件化无缝结合(二)

每一个activity由Activity的startActivityForResult方法启动,通过instrumentation的execStartActivity方法激活生命周期。这个地方请大家留意下,后面也会提到这里。

APP项目如何与插件化无缝结合(二)

在ActivityThread的performLaunchActivity方法中通过instrumentation的newActivity方法实例化。

APP项目如何与插件化无缝结合(二)

如果要动态注册Activity,首先在宿主manifest中注册一个命名特殊的占坑activity来欺骗mInstrumentation.execStartActivity以获得生命周期,再欺骗mInstrumentation.newActivity来获得插件activity实例。Small封装一个instrumentation,来替换掉宿主。可以看到small里面的占坑。


(责任编辑:ioter)

用户喜欢...

滴滴插件化方案 VirtualApk 源码解析

之前一直没有写过插件化相关的博客,刚好最近滴滴和360分别开源了自家的插件化方案,赶紧学习下,写两篇博客,第一篇是滴滴的方案: https://github.com/didi/VirtualAPK 那么其中的难点很明显是...


Android开发周报:微信模块化重构实践、滴滴插件化项目开源

7月份安卓各版本份额:牛轧糖终于突破两位数:谷歌近日给出了安卓系统各版本最新的份额数据,去年推出牛轧糖版本(7.0,7.1)终于达到了两位数的市场份额,占11.5%。2015年推出的棉花糖...


如何解决 Android Studio 上远程依赖包重复的问题(com.android.dex.DexException)

你们是不是会经常遇到这样的一个错误:com.android.dex.DexException: Multiple dex files define XXXX,一般情况下,是我们项目中引用了重复的库或者jar包引起的,我们找到去掉即可解决,但是如果你远程...


Android Project 检查依赖库和插件版本

随着项目的开发,引用的库也不断增加,维护引用的版本也是一个耗时的问题.比如一个项目的依赖库如下: compile libraries.supportAppCompatcompile libraries.rxJavacompile libraries.rxAndroidcompile libraries.retrofit...


Android项目流程、设计原则、编码规范、技术特点和过时技术

Android开发者故事 该流程不仅适用于Android项目开发,也部分适用于其他互联网和IT产品。 史上最全APP前期、开发、后期工具 : 一、产品前期 1.市场调研: 可委托第三方调研机构 调研宝 问卷...


说一说Android Studio和IDEA中一个很有用的内存调试插件

JetBrains JVM Debugger Memory View plugin 在我最近的研发活动期间寻找新的工具,以提高我的开发经验,使Android Studio的生活更轻松,我发现一个有用的插件,我从来没有听说过。 这就是为什么,我决...


详解如何使用代码进行音频合成,以Java为示例语言,以Android为示例平台

音频合成在现实生活中应用广泛,在网上可以搜索到不少相关的讲解和代码实现,但个人感觉在网上搜索到的音频合成相关文章的讲解都并非十分透彻,故而写下本篇博文,计划通过讲解如何...


Android滑动效果是如何产生的

相对于Android2.X版本中常见的长按、点击操作,滑动的操作方式具有更好的用户体验性。因此,从Android4.X版本开始,滑动操作就大量出现在了Android系统中,各种第三方应用也竞相模仿这种效果...


Android 如何编写基于编译时注解的项目

在Android应用开发中,我们常常为了提升开发效率会选择使用一些基于注解的框架,但是由于反射造成一定运行效率的损耗,所以我们会更青睐于编译时注解的框架,例如: butterknife 免去我们...


如何提高 Android 代码质量 -工具篇

这是一篇翻译文章,原文: How to improve quality and syntax of your Android code ,为了理解连贯,翻译过程中我修改了一些陈述逻辑和顺序,同时也加了一些自己的补充。 在这片文章中,我将从工具使...