• 从linux看Android之一--init进程


    准备环境:

    • 熟悉linux环境和shell脚本
    • 用SSHDROID和XShell搭建android的命令行环境(帮助找到熟悉的linux界面,因为android删除了很多标准linux平台上很多的shell工具,安装SSHDROID实际上还安装了BusyBox这个linux平台上的瑞士军刀)方法参见:SSHDroid(SSH Server for Android)通过PC或命令连接android
    • 推荐资料:深入理解Android

    开始:

    1. 我们知道Android的底层使用的还是linux的核心。android的Framework对于linux来说如同运行在linux上的一个程序。
    2. linux下第一个用户级的进程是init,那么安卓的第一个用户级进程当然也是init。android下的linux进程的作用概括为以下四点:a)解析init.rc和init.bravo.rc两个配置文件 b) 执行各个阶段的动作,创建zygote的工作就是在其中的某个阶段完成的 c)调用property_init初始化属性相关的资源,并且通过property_start_service启动属性服务 d)init进入无限循环,并且等待一些事情的发生。
    3. 第一步的init.rc是系统配置文件,所有的linux的系统都会有这个配置文件在/etc目录下。并且linux系统启动的6个level也就是在这里确认引导的。
    4. 第二步的执行各个阶段的antion,也是对应与linux系统init.d文件夹下面的启动脚本。android的zygote服务类似于在linux系统的init.d文件夹下写了一个java服务。android开发中的action也是对应这个概念。init作为用户空间进程的天字第一号,完成了很多重要的功能。比如根目录/的mount,等所有的文件mount都是在这里完成的。我们知道init进程以前所有的信息都是处于核心态的,用户态的进程并不能进入核心态,只有核心态的数据能进入用户态,所有在内核态进入用户态的第一个进程init还把共享的内存/process,加载的设备/dev也挂载在了目录书上。既然用户态的进程不能访问核心态的数据,也只有把核心态的数据降到内核态才能访问了。
    5. 第三步的调用property_init初始化属性相关的资源,相当于window的注册表服务,这个服务无论在linux还是在android里面都是存在的。也就是android继承了linux的这个服务特性。
    6. 第四步是无限循环就是一直等待命令的输入,一直在监听命令的输入,之所以init会是所有用户级进程的天字第一号正式因为这里就是所有进程出生的地方。
    7. 查看Android设备CPU信息
      / # cat /proc/cpuinfo 
      Processor    : ARMv7 Processor rev 1 (v7l)
      processor    : 0
      BogoMIPS    : 1592.52
      
      processor    : 1
      BogoMIPS    : 2786.91
      
      Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls 
      CPU implementer    : 0x41
      CPU architecture: 7
      CPU variant    : 0x2
      CPU part    : 0xc09
      CPU revision    : 1
      
      Hardware    : SMDK4210 #机器的Hardware名
      Revision    : 0008
      Serial        : 304d19b10777263f

      查看Android下的设备列表

      / # cd /dev/
      /dev # ls
      HPD                    ptmx                   tty48
      accelerometer          pts                    tty49
      akm8975                random                 tty5
      alarm                  rfkill                 tty50
      android_adb            rtc0                   tty51
      ashmem                 rtc1                   tty52
      binder#binder在这里    s3c-mem                tty53
      block                  s3c-mfc                tty54
      bus                    s5p-jpeg               tty55
      bus_dma_throughput     snd                    tty56
      console                socket                 tty57
      cpu_dma_latency        srp                    tty58
      cpuctl                 srp_ctrl               tty59
      device-mapper          tspdrv                 tty6
      display_frequency      tty                    tty60
      dun                    tty0 #开机的时候就是访问这个设备                  tty61
      dvfs_response_latency  tty1                   tty62
      ecryptfs               tty10                  tty63
      exynos-mem             tty11                  tty7
      fimg2d                 tty12                  tty8
      fmradio                tty13                  tty9
      full                   tty14                  ttyGS0
      fuse                   tty15                  ttyGS1
      graphics               tty16                  ttyGS2
      i2c-0                  tty17                  ttyGS3
      i2c-1                  tty18                  ttyS0
      i2c-11                 tty19                  ttyS1
      i2c-12                 tty2                   ttyS2
      i2c-14                 tty20                  ttyS3
      i2c-15                 tty21                  ttySAC0
      i2c-16                 tty22                  ttySAC1
      i2c-19                 tty23                  ttySAC2
      i2c-3                  tty24                  ttySAC3
      i2c-5                  tty25                  tun
      i2c-6                  tty26                  uinput
      i2c-7                  tty27                  ump
      i2c-8                  tty28                  umts_boot0
      i2c-9                  tty29                  umts_csd
      input                  tty3                   umts_ipc0
      k3g                    tty30                  umts_loopback0
      keychord#如果keychord设备初始化成功,则init也会关注来自这个设备的事件  tty31                  umts_ramdump0
      kmem                   tty32                  umts_rfs0
      kmsg                   tty33                  umts_router
      light                  tty34                  urandom
      link_pm                tty35                  usb_accessory
      log                    tty36                  usb_mtp_gadget
      mali                   tty37                  vcs
      mem                    tty38                  vcs1
      modem_br               tty39                  vcsa
      multipdp               tty4                   vcsa1
      network_latency        tty40                  video0
      network_throughput     tty41                  video1
      null                   tty42                  video14
      pipes                  tty43                  video2
      pmem                   tty44                  video21
      pmem_gpu1              tty45                  video3
      pn544                  tty46                  xt_qtaguid
      ppp                    tty47                  zero

      查看android下的配置文件和根目录

      /dev # cd /
      / # ls
      acct                  init                  res
      cache                 init.goldfish.rc      sbin
      config                init.rc#所有的linux平台都有这个配置文件,这个是init进程首先调用的,是系统相关的配置文件               sdcard
      customkernel          init.smdk4210.rc #这也是init进程首先解析的两个文件中的一个,不同的设备平台下中间的名字不同,因为smdk4210是硬件平台的名称 sys
      d                     init.smdk4210.usb.rc  system
      data                  lib                   tmp
      default.prop          lpm.rc                ueventd.goldfish.rc
      dev #系统有哪些硬件也是内核态首先检查然后回写在目录树下的    mnt                   ueventd.rc
      efs                   preload               ueventd.smdk4210.rc
      etc                   proc #这个文件夹是init进程运行时,从内核态回写的数据,存在的都是内核态的状态数据      vendor
      fota.rc               recovery.rc
      / #
      我们知道windows有个注册表保存一些key/value的键值对保存应用程序的一些初始环境信息,这样即使系统重启,应用程序也能根据key/value的信息使应用程序恢复指定的状态,android也提供了一个这样的机制就是属性服务property servie,可以用getprop命令查看所有的键值对信息
      /data/data/berserker.android.apps.sshdroid/home # getprop #查看属性服务维护的所有键值对信息(如同windows的注册表)
      [audio.country]: [0]
      [audio.stub]: [0]
      [audioflinger.bootsnd]: [1]
      [dalvik.vm.dexopt-flags]: [m=y]
      [dalvik.vm.heapgrowthlimit]: [64m]
      [dalvik.vm.heapsize]: [256m]
      [dalvik.vm.heapstartsize]: [8m]
      [dalvik.vm.stack-trace-file]: [/data/anr/traces.txt]
      [dev.bootcomplete]: [1]
      [dev.powersave_fps]: [0]
      [dev.sfbootcomplete]: [1]
      [dhcp.ip6tnl0.reason]: [CARRIER]
      ...

    参考资料:

    Android的init过程详解(一)

    Android的init过程(二):初始化语言(init.rc)解析

    《深入理解Android》

  • 相关阅读:
    盘的转——使用缓动函数完成动画
    espnet环境配置(window)
    2021.9.8 Hadoop集群
    2021.9.7 开学第一课
    RS-422与RS-485
    70 进程创建的优化设计 下
    RGB液晶接口
    matlab2018a安装激活教程
    sed初级教程
    centos无法添加默认网关
  • 原文地址:https://www.cnblogs.com/zhanghaiyublog/p/3613609.html
Copyright © 2020-2023  润新知