Android杂谈:感性看下系统与应用的类装载器

Android杂谈:感性看下系统与应用的类装载器_第1张图片
艾玛.png

ClassLoader,叫做类装载器。是用来把类装载进内存的,我们知道Android的类是保存到dex文件的,装载的大概过程就是读取这些dex文件,然后保存到内存的数据结构中去啦。Android大概可以分为系统和应用两个块,这个没毛病吧。那这两块的类装载器ClassLoader是长咋样的呢?

打印出系统与应用的类装载器,一目了然

系统的类装载器怎么获取呢?下面这样子就是了

systemClassLoader = ClassLoader.getSystemClassLoader();

应用的类装载器呢?

appClassLoader = this.getClassLoader();

好了,我们获取到类装载器了,要打印些啥?
1.首先我们循环打印父类ClassLoader。因为ClassLoader有一个很重要的特性,叫做双亲委托机制。就是装载类的时候,先让自己父亲去装载,防止重复装载。(他奶奶的,这个机制谁翻译的,明明就是单亲委托机制,委托他父亲嘛)。

2.打印ClassLoader的类查找路径。类装载就是根据这个路径,去查找类的。例如ClassLoader A的查找路径是/sdcard/hehe,他就会去hehe去找类了,O(∩_∩)O哈哈哈~

好了,我们来欢快地打印吧~

public class InheritDemo extends AppCompatActivity {
    public static final String TAG = "InheritDemoWf";
    ClassLoader appClassLoader;
    ClassLoader systemClassLoader;
    ClassLoader tempLoader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_inherit_demo);
        appClassLoader = this.getClassLoader();
        tempLoader = appClassLoader;
        while (tempLoader != null) {   //打印应用类装载器
            Log.i(TAG, "appclassloader inherit :" + tempLoader.toString());
            tempLoader = tempLoader.getParent();
        }

        systemClassLoader = ClassLoader.getSystemClassLoader();
        tempLoader = systemClassLoader;
        while (tempLoader != null) {    //打印系统类装载器
            Log.i(TAG, "systemClassLoader inherit :" + tempLoader.toString());
            tempLoader = tempLoader.getParent();
        }

    }

}

打印结果如下:

看到上面结果了吧~

简单下个结论吧

应用ClassLoader
1.他的类装载器是一个PathClassLoader,类搜索路径是应用安装路径下的base.apk
2.他的父类装载器是BootClassLoader

系统ClassLoader
1.他的类装载器是一个PathClassLoader,类搜索路径是一个点".",我嚓,点是什么鬼。说明还是的靠他的父亲BootClassLoader去装载类罗。
2.他的父类装载器是BootClassLoader

BootClassLoader是ClassLoader链条中最老的一环,就是大爷级人物。

例子传送门
https://github.com/wenfengtou/WfPlung

你可能感兴趣的:(Android杂谈:感性看下系统与应用的类装载器)