preloaded-classes
在Zygote初始化的时候,会调用到ZygoteInit.java的main()方法,在注册了ZygoteSocket的控制通道之后,就调用preload()方法去加载一些预加载的数据。
5.1.1源码分析
public static void main(String argv[]){
...
registerZygoteSocket(socketName);
..
preload();
...
}
static void preload(){
preloadClasses();
preloadResources();
preloadOpenGL();
preloadSharedLibraries();
WebViewFactory.prepareWebViewInZygote();
}
private static void preloadClasses(){
InputStream is;
try{
//预加载类的信息存储在PRELOADED_CLASSES变量中,实际值为“/system/etc/preloaded-classes”,可以在设备的这个目录下找到preloaded-classes文件;
is = new FileInputStream(PRELOADED_CLASSES);
}
}
private static void preloadResources(){
}
private static void preloadOpenGL(){
}
private static void preloadSharedLibraries(){
System.loadLibrary("android");
System.loadLibrary("compiler_rt");
System.loadLibrary("jnigraphics");
}
在preloaded-classes文件中,开头注释就说明了这个文件是由/framework/base/tools/preload/WritePreloadedClassFile.java类生成的,在WritePreloadedClassFile.java类中,有两个变量如下:
//最小的类加载时间,如果大于这个,才值得被装载进preload-classes;
static final int MIN_LOAD_TIME_MICROS = 1250;
//最少被多少个进程所装载,如果大于这个,被装载进preload-classes;
static final int MIN_PROCESSES = 10;
根据这两个变量判断每个类加载的时间是否大于1250微秒,是否被十个以上的进程调用,超过的就会被写到preload-classes文件中,最后由zygote预加载。
preloadClass()函数的执行时间比较长,这是导致Android系统启动慢的原因之一。
-
-
-
-
-
-
-
-
-
-
-
-
-
-----------------------last line for now---------------------