天天看點

android8.1系統啟動過程(三) init.rc

在init程序中    parser.ParseConfig("/init.rc");

init.rc  AOSP/system/core/rootdir/init.rc   

    android初始化語言

//部分代碼截取
...
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /init.usb.configfs.rc
import /init.${ro.zygote}.rc

on early-init
    # Set init and its forked children's oom_adj.
    write /proc/1/oom_score_adj -1000
...
           

主要包含5中類型語句    Action、Command、Service、Option、Import

[Import]  Import:導入腳本

[Action]  on:  on early-init、on early-boot、on boot、on init、on trigger 

on  <trigger>  [&& <trigger>]*  //設定觸發器

    <command> 

    <command>                   //觸發後執行的指令
           
on property:sys.boot_from_charger_mode=1
    class_stop charger
    trigger late-init
           

[Service]  Service:建立service      

service  <name>  <pathname>  [<arg>]*    //service名字  執行程式路徑  傳遞參數

  <option>

  <option>
  ...

  //例子
  user root     //使用者

  group  root readproc     //使用者組

  oneshot/disable     //隻啟動一次/服務是關閉的
           
//這裡以 init.zygote64.rc  為例

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root                                         
    group root readproc                                
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    ...
           

[setprop]  

setprop net.tcp.default_init_rwnd 60
           
generic_x86_64:/ # get prop
/system/bin/sh: get: not found
127|generic_x86_64:/ # get proc                                                
/system/bin/sh: get: not found
127|generic_x86_64:/ # getproc                                                 
/system/bin/sh: getproc: not found
127|generic_x86_64:/ # getprop                                                 
[dalvik.vm.appimageformat]: [lz4]
[dalvik.vm.dex2oat-Xms]: [64m]
[dalvik.vm.dex2oat-Xmx]: [512m]
[dalvik.vm.dexopt.secondary]: [true]
[dalvik.vm.heapsize]: [192m]
[dalvik.vm.image-dex2oat-Xms]: [64m]
[dalvik.vm.image-dex2oat-Xmx]: [64m]
           
generic_x86_64:/ # getprop | grep "sys.sysctl.extra_free_kbytes"               
[sys.sysctl.extra_free_kbytes]: [4500]
           

值得注意的是Android8.0  中對init.rc做了拆分每一個服務對應一個rc檔案,例如Zygote啟動腳本在  init.zygoteXX.rc中定義

init.zygote64.rc    AOSP/system/core/rootdir/init.rc

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root
    group root readproc
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks
           

代碼分析

通知init程序建立zygote程序 

程序執行程式的路徑為  /system/bin/app_process64  

後面傳遞進去的參數  -Xzygote /system/bin --zygote --start-system-server

class name:  指的是zygote程序的classname為main