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---------------------