详细分析Android中实现Zygote的源码

2020-01-06 13:36:52丽君

preload函数里面分别调用了三个预加载函数,我们分别来分析一下这几个函数的实现。

首先是preloadClasses,函数实现如下:

 

 
  1. private static final int UNPRIVILEGED_UID = 9999;  private static final int UNPRIVILEGED_GID = 9999; 
  2.   private static final int ROOT_UID = 0; 
  3. private static final int ROOT_GID = 0;   
  4. private static void preloadClasses()  { 
  5. final VMRuntime runtime = VMRuntime.getRuntime();   
  6. InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(PRELOADED_CLASSES);  if (is == null) { 
  7. Log.e(TAG, "Couldn't find " + PRELOADED_CLASSES + ".");  } else { 
  8. Log.i(TAG, "Preloading classes...");  long startTime = SystemClock.uptimeMillis(); 
  9.   setEffectiveGroup(UNPRIVILEGED_GID); 
  10. setEffectiveGroup(UNPRIVILEGED_UID);   
  11. float defaultUtilization = runtime.getTargetHeapUtilization();  runtime.setTargetHeapUtilization(0.8f); 
  12.   System.gc(); 
  13. runtime.runFinalizationSync();  Debug.startAllocCounting(); 
  14.   try { 
  15. // 创建一个缓冲区为256字符的输入流  BufferedReader br = new BufferdReader(new InputStreamReader(is), 256); 
  16. int count = 0;  String line;