从linux看Android之一--init进程
2024-08-23 01:49:37
准备环境:
- 熟悉linux环境和shell脚本
- 用SSHDROID和XShell搭建android的命令行环境(帮助找到熟悉的linux界面,因为android删除了很多标准linux平台上很多的shell工具,安装SSHDROID实际上还安装了BusyBox这个linux平台上的瑞士军刀)方法参见:SSHDroid(SSH Server for Android)通过PC或命令连接android
- 推荐资料:深入理解Android
开始:
- 我们知道Android的底层使用的还是linux的核心。android的Framework对于linux来说如同运行在linux上的一个程序。
- linux下第一个用户级的进程是init,那么安卓的第一个用户级进程当然也是init。android下的linux进程的作用概括为以下四点:a)解析init.rc和init.bravo.rc两个配置文件 b) 执行各个阶段的动作,创建zygote的工作就是在其中的某个阶段完成的 c)调用property_init初始化属性相关的资源,并且通过property_start_service启动属性服务 d)init进入无限循环,并且等待一些事情的发生。
- 第一步的init.rc是系统配置文件,所有的linux的系统都会有这个配置文件在/etc目录下。并且linux系统启动的6个level也就是在这里确认引导的。
- 第二步的执行各个阶段的antion,也是对应与linux系统init.d文件夹下面的启动脚本。android的zygote服务类似于在linux系统的init.d文件夹下写了一个java服务。android开发中的action也是对应这个概念。init作为用户空间进程的天字第一号,完成了很多重要的功能。比如根目录/的mount,等所有的文件mount都是在这里完成的。我们知道init进程以前所有的信息都是处于核心态的,用户态的进程并不能进入核心态,只有核心态的数据能进入用户态,所有在内核态进入用户态的第一个进程init还把共享的内存/process,加载的设备/dev也挂载在了目录书上。既然用户态的进程不能访问核心态的数据,也只有把核心态的数据降到内核态才能访问了。
- 第三步的调用property_init初始化属性相关的资源,相当于window的注册表服务,这个服务无论在linux还是在android里面都是存在的。也就是android继承了linux的这个服务特性。
- 第四步是无限循环就是一直等待命令的输入,一直在监听命令的输入,之所以init会是所有用户级进程的天字第一号正式因为这里就是所有进程出生的地方。
- 查看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过程(二):初始化语言(init.rc)解析
《深入理解Android》
最新文章
- struts2 拦截器 interceptor
- 百度,你家云管家能靠谱点不?替你脸红!Shame on you!
- 从零开始学android-一行两个按钮居中 布局
- Android attrs.xml文件中属性类型format值的格式
- 开心菜鸟系列学习笔记-------javascript(3)
- Servlet程序开发--WEB开发模式(Mode I, Mode II)
- vb是如何连接数据库的
- AtCoder Regular Contest 076
- Hbase出现ERROR: Can't get master address from ZooKeeper; znode data == null正确找到解决思路
- 2018上IEC计算机高级语言(C)作业 第3次作业_说明
- Hexo使用细节及各种问题
- Python3 与 C# 基础语法对比(Function专栏)
- 『Python』装饰器
- MySQL备份---lvm snapshot
- Android 工程目录
- 自定义jquery公用方法切换当前tab栏
- 基于express框架的Token实现方案
- jquery ajax返回html乱码解决
- CentOS 6.5 下keepalived服务的配置
- Shiro登录校验
热门文章
- Android面试收集录13 Android虚拟机及编译过程
- 10,python开发之virtualenv与virtualenvwrapper
- JsBridge ";Uncaught TypeError: Cannot call method 'callHandler' of undefined";, source
- ios tcpdump
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)
- Javascript在浏览器中的加载顺序详解!
- (原)Unreal-GamePlayer-Actor解析(1)
- Elasticsearch自定义分析器
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 I: 寻找大富翁
- linux运维文章