Android的ClassLoader知多少
loadClass基本流程
/*** Loads the class with the specified <a href="#name">binary name</a>. The*/
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.c = findClass(name);}}return c;
}
复制代码
可以看出loadClass的基本流程如下:
首先判断是否已经加载过class,如果加载过,就直接返回对应的Class<?>对象;如果没有加载过,就查找它的父类是否加载过,如果父类加载过,就返回;如果父类未加载过,就自己去加载。
Android应用中ClassLoader对象
public class MainActivity extends AppCompatActivity {private static final String TAG = MainActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);printClassLoaders();setContentView(R.layout.activity_main);}private void printClassLoaders() {ClassLoader classLoader = getClassLoader();if (classLoader != null) {Log.e(TAG, "Current ClassLoader is: " + classLoader.toString());while (classLoader.getParent() != null) {classLoader = classLoader.getParent();Log.e(TAG, "ClassLoader's parent is: " + classLoader.toString());}}}
}
复制代码
我们创建一个Android项目,在Activity的onCreate方法中打印ClassLoader的值,如上。
打印结果如下:
2019-04-30 18:52:53.219 16456-16456/com.my.classloaderdemo E/MainActivity: Current ClassLoader is: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/base.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_dependencies_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_resources_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_0_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_1_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_2_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_3_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_4_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_5_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_6_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_7_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_8_apk.apk", zip file "/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.my.classloaderdemo-faSliZa20JPLlSUl0kPawg==/lib/x86, /system/lib, /vendor/lib] ]
]2019-04-30 18:52:53.219 16456-16456/com.my.classloaderdemo E/MainActivity: ClassLoader's parent is: java.lang.BootClassLoader@c8bb22f
复制代码
由打印日志可以看出,此App包含了两种ClassLoader,一个是PathClassLoader,一个是BootClassLoader。
BootClassLoader是系统启动时创建的,用于加载Android FrameWork层的class;PathClassLoader是在App启动时创建的,用于加载该App中的class文件。
ClassLoader的作用
1,共享作用:类加载过,后面用到时就不用再加载。
2,隔离作用:不同继承路线的类加载器,加载的类一定是不同的。
DexClassLoader与PathClassLoader异同点
DexClassLoader和PathClassLoader都是继承BaseDexClassLoader。
DexClassLoader:可加载jar/dex/apk,也可以加载SD卡中未安装的apk。
PathClassLoader:只可加载系统中已经安装的apk。
转载于:https://juejin.im/post/5cd27a51f265da036c57a096
Android的ClassLoader知多少相关推荐
- Android 开发者必知的开发资源
英文原文:Bongzimo 翻译: ImportNew-黄小非 译文链接:http://www.importnew.com/3988.html Android 开发者必知的开发资源 随着Androi ...
- android classloader异常,Android中ClassLoader类加载机制
Android中apk的构建过程 构建apk 如图 所示,典型 Android 应用模块的构建流程通常依循下列步骤: 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中 ...
- Android HTTP必知必会
HTTP协议使用如此广泛,开发者务必要做到"知","会". 引子 用curl请求百度首页全解析的过程: 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- android classloader的功能和工作模式,Android中ClassLoader和java中ClassLoader有什么关系和不同...
一.Java中的ClassLoader是什么? 当写好一个Java应用程序,程序都是由若干个.class类文件组织而成的,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都 ...
- 高仿知乎android客户端,仿知乎分享界面
前言 最近在做一个资讯类的APP,上面需要一个分享功能,项目不大,如果去使用官方的SDK还需要审查之类的,感觉太麻烦.偶然看到知乎的分享界面做得不错,拿到我这个项目中正合适,在网上查了一下资料,使用B ...
- 高仿知乎android,Android高仿知乎首页Behavior
Android自定义Behavior实现跟随手势滑动,显示隐藏标题栏.底部导航栏及悬浮按钮 Android Design包下的CoordinatorLayout是相当重要的一个控件,它让许多动画的实现 ...
- android app报告,知乎APP用户体验报告
一.设备信息 App版本:3.3.0 更新时间:2016年4月26日 手机信息:魅族MX5 Android版本:5.1 系统版本:Flyme OS 5.6.4.19beta 二.产品概述 知乎属于通讯 ...
- android ui设计 知乎,界面设计进化!知乎日报2.0新版发布下载
[PConline 资讯]"知乎"这个大名几年来在网上可谓风生水起,知乎网的网友来自各行各业,通过知乎这个知识问答社区,往往能够提供一些令人大开眼界的内容.而"知乎日报& ...
- 那些android你需要知道的事
转载 :https://www.uisdc.com/material-design-knowledge 为您准备了最新的 Material Design设计规范,请伴随笔记一口吃掉. 一.安卓是什么? ...
最新文章
- Win7如何改变用户文件夹位置
- Rocketmq原理最佳实践
- [html] 制作一个页面时,需要兼容PC端和手机端,你是要分别做两个页面还是只做一个页面自适应?为什么?说说你的理由
- 工作116:确定需求报告
- mysql 主键倒序查询速度慢_一亿条数据order by主键降序速度很慢
- LockSupport HotSpot里park/unpark的实现
- 【Hadoop Summit Tokyo 2016】欢迎来到Hadoop的青春时代
- 001 - CMake 安装
- Macbook pro 2015 13寸丐版更换512G固态流程记录
- dell 恢复介质_戴尔官方WIN10恢复介质镜像下载与安装教程 | Dell 中国
- idea社区版创建springboot_idea社区版+spring boot
- ajax authorization,ajax跨域,_ajax Authorization 鉴权失败,ajax跨域 - phpStudy
- NOIP 模拟题 国际跳棋
- matlab 还原内部函数,matlab内部函数
- python计算身份证最后一位数字代表什么_一个计算身份证号码校验位的Python小程序...
- CF1428 G1,G2 . Lucky Numbers题解
- [Games 101] Lecture 13-16 Ray Tracing
- 百钱百鸡问题(C++枚举法)
- Kibana:Kibana 入门 (二)
- 温暖别人就是温暖自己
热门文章
- boost::mp11::mp_fill相关用法的测试程序
- 宏BOOST_CHECK_EXCEPTION用法的测试程序
- boost::geometry::enrich_intersection_points用法的测试程序
- GDCM:gdcm::VM的测试程序
- VTK:Texture之TexturedSphere
- VTK:简单操作之DistancePointToLine
- VTK:图片之ImageOpenClose3D
- OpenCV捕获格雷码模式
- Qt Creator浏览项目内容
- OpenGL无边界的纹理实例