准备环境:

  • 熟悉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 (v7l)
    processor :
    BogoMIPS : 1592.52 processor :
    BogoMIPS : 2786.91 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls
    CPU implementer : 0x41
    CPU architecture:
    CPU variant : 0x2
    CPU part : 0xc09
    CPU revision : Hardware : SMDK4210 #机器的Hardware名
    Revision :
    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- tty17 ttyGS3
    i2c- tty18 ttyS0
    i2c- tty19 ttyS1
    i2c- tty2 ttyS2
    i2c- tty20 ttyS3
    i2c- tty21 ttySAC0
    i2c- tty22 ttySAC1
    i2c- tty23 ttySAC2
    i2c- tty24 ttySAC3
    i2c- tty25 tun
    i2c- tty26 uinput
    i2c- tty27 ump
    i2c- tty28 umts_boot0
    i2c- 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]: []
    [audio.stub]: []
    [audioflinger.bootsnd]: []
    [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]: []
    [dev.powersave_fps]: []
    [dev.sfbootcomplete]: []
    [dhcp.ip6tnl0.reason]: [CARRIER]
    ...

参考资料:

Android的init过程详解(一)

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

《深入理解Android》

从linux看Android之一--init进程的更多相关文章

  1. Android系统init进程启动及init.rc全解析

    转:https://blog.csdn.net/zhonglunshun/article/details/78615980 服务启动机制system/core/init/init.c文件main函数中 ...

  2. 第一个用户进程 - Android 的 Init 进程

    本文尝试对着 <深入理解 Android 5.0 系统>来对 android 9.0 的启动代码进行分析,但是分析过程中发现自己缺乏操作系统方面的知识,以致于只能做一些简单分析.最近也买了 ...

  3. 从linux看android之二--java世界的盘古女娲

    在linux从内核态进入用户态运行init进程后启动的一个进程就是zygote.zygote是在android系统中创建java世界的盘古,他创建了第一个java虚拟机,同时他又是女娲,他成功地繁殖了 ...

  4. Android Init进程命令的执行和服务的启动

    这里开始分析init进程中配置文件的解析,在配置文件中的命令的执行和服务的启动. 首先init是一个可执行文件,它的对应的Makfile是init/Android.mk. Android.mk定义了i ...

  5. Android4.4的init进程

    1背景 前些日子需要在科室内做关于Android系统启动流程的培训.为此,我在几年前的技术手记的基础上,重新改了一份培训文档.在重新整理文档期间,我也重读了一下Android 4.4的相关代码,发现还 ...

  6. init进程 && 解析Android启动脚本init.rc && 修改它使不启动android && init.rc中启动一个sh文件

    Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序.提供了以下的功能:设备管理.解析启动脚本.执行基本的功能.启动各种服务.代码的路径:system/core/init,编译 ...

  7. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动Linux内核启动Android系统启动,Launcher/app启动 ...

  8. Android 内核初识(3)init进程

    init是一个进程,确切地说,它是Linux系统中用户空间的第一个进程.由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程,它的进程号是1.作为天字第一 ...

  9. 动静结合学内核:linux idle进程和init进程浅析

    刘柳 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 + titer1@qq.com 退休的贵族进程 ...

随机推荐

  1. Win7更换锁屏和开机画面

    技术交流群:233513714 每次开机被Windows千年不变的开机画面和锁屏画面丑到的小伙伴们可以看过来,通过简单的几步就可以改掉系统默认的开机画面. 1.首先Windows+r键输入regedi ...

  2. 【HTML&CSS】 第二章:标准模式下的页面与怪异模式下的页面区别

    盒模型 前面提到,盒模型(box mode)是浏览器 Quirks Mode 和 Standards Mode 的主要区别. 描述 对于“盒模型”一词并没有明确的文档定义,它是开发人员描述 CSS 中 ...

  3. Spring进阶—如何用Java代码实现邮件发送(一)

    相关文章: <Spring进阶—如何用Java代码实现邮件发送(二)> 在一些项目里面如进销存系统,对一些库存不足发出预警提示消息,招聘网站注册用户验证email地址等都需要用到邮件发送技 ...

  4. 剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)

    剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)2013-11-23 16:25 题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后, ...

  5. 《Cracking the Coding Interview》——第12章:测试——题目4

    2014-04-25 00:35 题目:没有专门的测试工具,你要如何对一个网页进行压力测试? 解法:拼手速,拼电脑数量呗.快捷键+复制粘贴网址,狂搞一番.话说回来,有脚本语言的情况下,直接写个脚本来模 ...

  6. Java基础-1简单了解与原理

    简单了解: Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的.因为Java没有结构,数组和串都是对象,所以不需要指 ...

  7. input()报错:TypeError: '>=' not supported between instances of 'str' and 'int'

    今天学习python基础—分支与循环,接触到了if.在练习一个if语句的时候,出现了错误. 题目是: 根据分数划分成四个级别:优秀.良好.及格.不及格,分数是72: grade = 72if grad ...

  8. NOIP2018 集训(一)

    A题 Simple 时间限制:1000ms | 空间限制:256MB 问题描述 对于给定正整数\(n,m\),我们称正整数\(c\)为好的,当且仅当存在非负整数\(x,y\)使得\(n×x+m×y=c ...

  9. 第一章 C++编程基础

    第一章 C++编程基础 1.1 如何撰写C++程序 赋值 assignment复合赋值 (compound assignment) += 函数(function)是一块独立的程序代码序列(code s ...

  10. PAT——甲级1065:A+B and C(64bit) 乙级1010一元多项式求导

    甲级1065 1065 A+B and C (64bit) (20 point(s)) Given three integers A, B and C in [−2​63​​,2​63​​], you ...