Android的插件化和组件化

来源:互联网 发布:linux arping 编辑:程序博客网 时间:2024/06/05 18:26

原本说每周都要写文章的,刚开始接打脸了。这周把上周的补上,说以这周这要写插件好和组件化(小小偷懒)。
先从插件化开始写起,我会从android插件化的的原理涉及到的技术都会提到,东西比较多我慢慢写(还好没人关注我,能慢慢来搞)。
我现在主要负责的项目是从去年三月底开始做的,去年五月中旬上线,从1.0到现在版本跟新迭代了18版,项目大变样经历了4次(改动7成左右的动能),剩下的功能都是一些小改动和热修复框架不能修复的bug了,一直到去年十月份吧我意识到这样不行,每个月都要上线两个版本(有时候就是很小很小的改动),这就让我不爽不爽的了,同时这个项目的另外一个重要模块要上马(公司小,所有的业务都想通过一个app来展现),为了以后的迭代和维护不得不改动项目,集成热修复,也就是这个时候开始去主动了解插件化和使用它。

***以下都是个人理解,如有不足之处请大家多多指教。***

一、插件化要解决的问题

        ①、65535的天花板        ②、动态加载apk和修复,也有人说是动态升级(一个意思了,哈。。。)        ③、资源加载、代码加载        ④、。。。。。。。

二、个人对插件化的一句话认识:类加载器+反射+代理。

android再启动的时候机会Boot类型的ClassLoader,不用想肯定是用来加载Framwork层的东西,这个classloader会在app启动的时候传进来,当然我们的程序也有类,也需要一个类加载器来加载。所以说一个程序至少有两个类加载器。

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取classloader        ClassLoader classLoader = getClassLoader();        System.out.println("*--------获取到的classloader---------*"+classLoader);        ClassLoader bootClassLoader=classLoader.getParent();        System.out.println("*--------获取父classloader-----------*"+bootClassLoader);    }}

打印结果

07-03 08:10:12.480 3020-3020/? I/System.out: *--------获取到的classloader---------*dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/demo.zzh.com.myclassloader-1/base.apk"],nativeLibraryDirectories=[/data/app/demo.zzh.com.myclassloader-1/lib/x86, /vendor/lib, /system/lib]]]07-03 08:10:12.480 3020-3020/? I/System.out: *--------获取父classloader-----------*java.lang.BootClassLoader@7c234e6

很直观的显示出我们的程序里不知有一个classloader这里就有PathClassLoader和BootClassLoader。所以说一个程序至少有两个

Android ClassLoader详解