搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
繁依Fanyi0
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Samba服务器的搭建与配置_samba用户数据共享系统总体结构设计怎么写
2
linux进程系统调用_linux创建进程的系统调用
3
Android关于侧边栏的简单使用(drawerLayout,navigationview,动态添加menu)_android drawerlayout 动态添加
4
Mysql一列拆分多列例子_sql将一列数据拆分成多列
5
鸿蒙os未来前景,华为:如果鸿蒙成功 未来20年将属于中国
6
前端面试题汇总(vue+html基础)最新最全_vue和html面试题
7
Fiddler抓不到浏览器包的原因_fiddler打开了没有收到浏览器请求
8
Android中的回调Callback
9
不能说最全但是也很全的MyBatis学习笔记_尚硅谷杨博超mybatis笔记
10
论文阅读——《Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement》
当前位置:
article
> 正文
安卓底层开发学习经验第十八期_zygote preload多线程
作者:繁依Fanyi0 | 2024-03-13 05:07:38
赞
踩
zygote preload多线程
这一期我们学习
Zygote
在启动过程中的预加载分析与优化
下面我们来看一下我们
preload
加载资源的一个过程
我们加载资源分为三种,第一个就是preloadClasses
预加载我们的系统类,这个系统类定义的文件是在
frameworks/base/preloaded-classes
,我们加载的一个过程其实是
Class.forName
来真正的加载这个类,加载完之后我们就会在
zygote
中查找到这个类,这就是预加载的一个过程;第二个是我们要预加载一些资源,这个资源分为两种,第一个是我们的图片,第二个是我们一个颜色的设置,我们所说的图片以及颜色设置,它定义在我们的
frameworks/base/core/res/res/values/arrays.xml
中,当他编译生成
jar
包时,我们会把一些图片资源,以及一些颜色的定义全部生成相关的
xml
,然后我们可以在
zygote
启动的时候,使用
preloadResource()
把这些资源提前加载进来,在加载的过程中,我们会把它保存在一个全局变量中;第三个预加载就是加载我们的
OPengl
资源
下面我们来看一下我们预加载资源的目的是什么
首先我们知道我们的每一个APP
都是我们的
zygote
创建的,如果我们的
zygote
提前把我们所需要的一些系统的类,和
resource
全部加载完之后,当我们使用
fork
这个系统调用去创建一个子进程的时候,我们的子进程就会把这个系统资源,以及系统类全部继承过来,然后我们在调用
java
的方法再去启动我们的应用,这是我们就会发现我们新的应用已经把这两个资源给继承过来了,这样的话我们的应用就不会去重新加载我们的资源和我们的类了,这样我们就能提高应用的启动和运行速度,为什么说提高应用的启动和运行速度呢,说可以提高启动速度是因为,我们在启动一个应用的时候,不需要再去加载这些资源,这样就可以提高应用的启动速度了,因为我们加载这个资源和类,这个耗时是几秒钟的事,如果我们省去这一个步骤,不做预加载,那么启动应用的时候,它就会自己去找这些资源和类,如果在运行过程中再去找这些资源和类,那么他的运行速度肯定就会受到影响,这些资源是所有应用都需要的,所以说在
zygote
启动时把这些资源和类与加载进来,能提高应用的启动和运行速度
下面我们再来看一下
preloadClasses
他的一个过程
preloadClasses
其实就是导入我们类的一个配置文件,这个配置文件在我们的
frameworks/base
下面定义好了,他有我们系统里边的每一个类,然后把这个文件打开,然后把他读出来,在使用
Class.forName
把这些类加载到
zygote
中。
下面我们看一下他的具体实现过程,打开
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
这个文件,查找到
preloadClasses
这个方法
首先他会打开我们这个资源文件,这个资源文件的定义是在
frameworks/base/preloaded-classes
里边,我们可以打开它看一下,可以看到它里边使我们
Android
下的所有的类,这个
preloadClasses
所做的事情就是,把这些类提前加载进来。它加载的过程首先就是打开这个文件,然后把这个文件一条条的读进来,如果看到一个
#
号,那么说明这一行是不需要
load
的,如果不是
#
号,那么就会调用
Class.forName
把他加载进来,直到加载完成。在最后我们会打印一下加载时间,和加载了多少类,这个就是
preloadClasses
的一个过程
下面我们来看一下是如何加载我们系统资源的
我们加载系统资源分为两部分,第一是加载资源,第二是加载颜色的一些设置,首先调用的是preloadResource()
来加载系统资源,加载时我们会首先创建一个
resource
,然后把它赋值给我们的全局变量,
mResource
,他用来保存我们系统的资源,加载资源时首先是
preloadDrawables()
,就是把刚才看到的所有的
xml
的所有文件给
load
进来,第二个就是加载一些颜色的设置,这个也在我们的
xml
中,我们来看一下代码的具体实现
他所的就是把我们com.android.internal.R.array.preloaded_drawables
给他
load
进来,我们来看一下这个文件,这个文件是在
frameworks/base/core/res/res/values/arrays.xml
中,打开它可以看到,这里面是一些图片文件,然后会把它预加载到这个
mResource
中,
preloaded_drawables
所做的事情就是,把我们的图片资源使用
mResources.getDrawable
的方法把它加载进来,这就是我们加载资源的一个过程,然后会将我们加载资源的个数给显示出来,再加载我们预先设置好的颜色,加载颜色的过程也是一样的,它是用
mResources.getColourStateList
的方法,加载到我们的
mResources
中,这样就完成了图片和颜色的预加载
我们用
adb
来看一下我们预加载这些资源用的时间
我们可以看到总的时间大概是4
秒多,这个时间是在我们
Android
启动过程中所要花费的时间,所以
Android
手机启动慢就有这个方面的原因
下面我们来看一下如何利用我们的硬件资源来加快我们
load
的一个效率,我们可以看到,我们加载类的时间基本大于
2
秒,加载
Resource
的时间基本大于
1
秒,这时我们可以考虑采用多线程的方式去加载我们的类,和
Resource
,我们可以使用线程池的方法实现这个多线程加载
我们加载的过程首先是,在zygote
中创建一个线程池,这个线程池去实现一个类和资源的加载,当我们执行
preloadClass
时,将加载类的操作串行添加到线程池中,添加完之后我们去解析我们的
resource
,然后将我们
resource
中加载的资源操作串行的添加到我们的线程池中,然后就会等待线程池工作结束,当他工作完成之后,我们就可以知道,我们加载资源和类的一个过程已经完成了,完成之后就可以去做其他的操作了,如果说线程池的个数是
4
个,并且
CPU
也是
4
核的话,那么他的执行效率肯定比我们使用一个线程快很多,这就是用多线程的方法优化
zygote
的一个启动过程
下面我们来看一下我们使用多线程或者线程池优化的一个前提
我们使用多线程优化的实质是:使我们的
zygote
进程最大限度的抢占
CPU
,所以说我们的执行才能更快一些。
除了使用多线程优化之外呢,还有另一种方法,就是
BLCR
,这种方法现在还不成熟,有兴趣的朋友可以去了解一下
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/227941
推荐阅读
article
zygote
forkSystemServer
及
system
Server启动_
system
zygo...
可以知道
zygote
是从rc中启动的,
zygote
本质上就是一个socket,不会关闭和销毁,而创建
zygote
时携带的...
赞
踩
article
Zygote
启动过程_
zygote
:
java
.
lang
.runtimeexception: s...
1.在Android系统中,所有应用程序进程以及系统服务进程都是由
Zygote
进程孕育(fork)出来的。 而在Linu...
赞
踩
article
Android T user软件重启卡log问题_
system
zygote
died
with
f...
添加到 bootclasspath,
zygote
起来在初始
system
serviceregistry 类的时候,里面...
赞
踩
article
Zygote
进程
【2】——
Zygote
的分裂_starting vm
process
through
...
在
Zygote
的诞生一文中init
进程
是如何一步步创建
Zygote
进程
的,也了解了
Zygote
的
进程
的作用。
Zygote
...
赞
踩
article
Android
Framework——
zygote
启动
SystemServer
_
system
_s...
在
Android
系统中,所有的应用程序进程以及系统服务进程
SystemServer
都是由Zygote进程孕育(fork)...
赞
踩
article
Framework原理分析之——
Zygote
进程
流程
分析_
android
zygote
fork
进程
...
Zygote
进程
作为开启Java世界大门的重要
进程
,简单总结一下其启动
流程
和作用:在Native层:1.创建Java虚拟...
赞
踩
article
Android
学习
---
zygote
(上)
_
android
zygote
预
加载
...
解析
Android
源码
---
zygote
,进入Java世界的第一个进程
_
android
zygote
预
加载
android
...
赞
踩
相关标签
zygote
android
java
Zygote
孵化器
进程启动
Zygote请求响应过程
Android进程创建
linux
Android开发
移动开发
framework