Android init.rc 服务启动不成功
问题
在开发过程中发现一个问题,我们需要在开机的时候判断硬件版本号去启动服务,
服务的名字是ledservice和ledservice4,但是发现每次烧录完固件后,服务启动不
成功,需要再复位重启一次,服务才可以正常启动。
日志如下
[ 5.328699] init: Service 'logd-reinit' (pid 257) exited with status 0 [ 5.329681] init: Starting service 'ledservice'... [ 5.331442] init: Starting service 'exec 2 (/system/bin/vdc)'... [ 5.353605] init: Service 'exec 2 (/system/bin/vdc)' (pid 269) exited with status 0 [ 5.355534] init: Service 'ledservice' is being killed... [ 5.364499] init: Service 'ledservice' (pid 268) killed by signal 9 [ 5.364531] init: Service 'ledservice' (pid 268) killing any children in process group [ 5.365442] init: Not bootcharting.
分析
1、我们自己刚开始修改的代码如下
service ledservice /system/bin/ledserviceclass mainconsoledisabledonrestartservice ledservice4 /system/bin/ledservice4class mainconsoledisabledonrestarton property:ro.boot.wzb210_audio_hw_rev=3start ledserviceon property:ro.boot.wzb210_audio_hw_rev=4start ledservice4on property:ro.boot.wzb210_audio_hw_rev=5start ledservice4
第一次实验
刚开始一直担心是因为我们服务本身有问题,所以在我们的两个服务里面不做任何操作,直接打一个Log
实验的结果还是有问题,服务启动不成功。
第二次试验
后面我考虑到有可能是因为增加了版本号的原因,然后我把代码修改成下面,结果还是服务启动不成功
service ledservice /system/bin/ledservice class main console disabled onrestartstart ledservice
最后
我考虑到android 的adbd也是刷机就要起来的,然后我参照了adbd的编写,看到了差异,修改如下,服务可以正常启动
参照adbd,把class main改成class core就可以了。 service ledservice /system/bin/ledservice - class main + class core console disabled onrestart
class core 和class main有何不同
在分析Kitkat加密功能的时候,在一些资料上看到一句话“对于加密后的系统,重启后,进入到输入密码界面,此时并没有完全加载Android系统,仅仅加载必要的服务”
那么这个必要的服务又是指的是那些服务呢?
在解答这个问题前我们先区分一下class core ,class main, class late_start。
这三个“class”,只是标识这个服务的类型是哪一个,然后通过调用class_start, class_reset, class_stop等命令的时候,来统一操作同一类的服务。
举个例子,从system/core/rootdir/init.rc文件中搜索“class main”可以搜到许多,例如有netd, ril-deamon服务被标识为class main,那么当我们调用class_start main命令时,所有标识为main的服务都会被启动,这里的netd ril-deamon就会被启动。对于core, late_start类的服务也是这样的。
这里以源代码中三星的manta为例进行演示:
class core 的服务如下:
序号 | service名称 | 所属文件 | 命令bin文件位置 |
1 | watchdogd | init.manta.rc | /sbin/watchdogd |
2 | watchdogd | init.recovery.manta.rc | /sbin/watchdogd |
3 | setup_fs | init.smdk5250.rc | /system/bin/setup_fs |
4 | ueventd | init.rc | /sbin/ueventd |
5 | logd | init.rc | /system/bin/logd |
6 | healthd | init.rc | /sbin/healthd |
7 | console | init.rc | /system/bin/sh |
8 | adbd | init.rc | /sbin/adbd |
9 | servicemanager | init.rc | /system/bin/servicemanager |
10 | vold | init.rc | /system/bin/vold |
可以看到,core服务都是系统最基本的服务,只要core服务全部启动,手机此时是可以运行的,但是却看不到东西,原因是framework没有启动。此时启动的都是C,C++的进程。此时是不能打电话的,因为ril-deamon没有启动
class main的服务如下:
序号 | service名称 | 所属文件 | 命令bin文件位置 |
1 | p2p_supplicant | init.manata.rc | /system/bin/wpa_supplicant |
2 | wpa_supplicant | init.manata.rc | /system/bin/wpa_supplicant |
3 | dhcpcd_wlan0 | init.manata.rc | /system/bin/dhcpcd |
4 | dhcpcd_p2p | init.manata.rc | /system/bin/dhcpcd |
5 | dhcpcd_eth0 | init.manata.rc | /system/bin/dhcpcd |
6 | dhcpcd_bt-pan | init.manata.rc | /system/bin/dhcpcd |
7 | dhcpcd_bt-pan | init.manata.rc | /system/bin/dhcpcd |
8 | iprenew_p2p | init.manata.rc | /system/bin/dhcpcd |
9 | iprenew_eth0 | init.manata.rc | /system/bin/dhcpcd |
10 | iprenew_bt-pan | init.manata.rc | /system/bin/dhcpcd |
11 | gpsd | init.manata.rc | /system/vendor/bin/gpsd |
12 | mobicore | init.manata.rc | /system/bin/mcDriverDaemon |
13 | bugreport | init.manata.rc | /system/bin/dumpstate |
14 | netd | init.rc | /system/bin/netd |
15 | debuggerd | init.rc | /system/bin/debuggerd |
16 | debuggerd64 | init.rc | /system/bin/debuggerd64 |
17 | ril-daemon | init.rc | /system/bin/rild |
18 | surfaceflinger | init.rc | /system/bin/surfaceflinger |
19 | drm | init.rc | /system/bin/drmserver |
20 | media | init.rc | /system/bin/mediaserver |
21 | bootanim | init.rc | /system/bin/bootanimation |
22 | installd | init.rc | /system/bin/installd |
23 | flash_recovery | init.rc | /system/etc/install-recovery.sh |
24 | racoon | init.rc | /system/bin/racoon |
25 | mtpd | init.rc | /system/bin/mtpd |
26 | keystore | init.rc | /system/bin/keystore |
27 | dumpstate | init.rc | /system/bin/dumpstate |
28 | sshd | init.rc | /system/bin/start-ssh |
29 | mdnsd | init.rc | /system/bin/mdnsd |
30 | zygote | init.zygote32_64.rc | /system/bin/app_process |
31 | zygote | init.zygote32.rc | /system/bin/app_process |
32 | zygote | init.zygote64.rc | /system/bin/app_process64 |
可以看到main的服务相对多一些,看到zygote了吧,由此可见main服务大部分是建立在java层或者与java层息息相关的系统服务。
class late_start 的服务如下:
序号 | service名称 | 所属文件 | 命令bin文件位置 |
1 | sdcard | init.manta.rc | /system/bin/sdcard |
2 | sdcard | init.msmdk5250.rc | /system/bin/sdcard |
在看Android手机加密的资料的时候,看到late_start服务,以为有很多呢.,但是一搜索才知道,坑爹啊,只有一个。
由以上的简单分析,再来分析Kitkat手机加密功能的流程,和加密后的启动过程,就更加清晰了。
其实手机加密完毕后,重启手机,进入输入密码界面,此时系统的core,main服务都已经启动,只有late_start服务没有启动,可以直接无视late_start。这样说来,此时手机的系统服务和正常状态下是一样的。我们想利用系统服务做什么都行啊。^_^
那么为什么在该界面只能做很少的事情呢?
例如可以拨打紧急呼救号码,弹出输入法,显示设置中的CryptKeeper界面,可以锁屏。但是却玩不了游戏,无法调用我们已经设置的“百度输入法”,而是使用很丑的Ladin输入法。锁屏也是系统默认的,拨号的界面也是系统原生的等等问题。这些问题,将在下一篇文章《Kitkat的加密功能对应用做了什么?》中解答
Android init.rc 服务启动不成功相关推荐
- android init.rc中启动的service 默认是disable的,后续如何启动此服务
如果 android init.rc中启动的service 默认是disable的,如何才能启动此服务呢? init.rc中可以直接启动service 附带的参数决定启动程序的状态,例如数据业务中配置 ...
- Android程序暂停sh,init进程 解析Android启动脚本init.rc 修改它使不启动android init.rc中启动一个sh文件...
Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序.提供了以下的功能:设备管理.解析启动脚本.执行基本的功能.启动各种服务.代码的路径: system/core/init,编 ...
- Android init.rc如何启动service去执行sh脚本
在Android开发中经常会遇到,在应用层想去执行一个脚本来完成某些底层相关的操作,但在应用层又没有root权限. 所以,老大给出一种方法完美解决此问题,又把上层和底层进行了隔离,非常好的策略. 1. ...
- Android init.rc文件解析过程详解(三)
Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...
- Android init.rc文件格式解析
/****************************************************************************** Android init.rc文件格式解 ...
- Android init.rc文件解析过程详解(一)
Android init.rc文件解析过程详解(一) 一.init.rc文件结构介绍 init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字 ...
- Android 系统(242)---Android init.rc执行顺序
Android init.rc执行顺序 1. 所有的action运行于service之前 2. 下面为各个section的执行顺序,英文编号的section是系统内建的(写死在init.c中的命令) ...
- 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
最新文章
- CentOS 7.0,启用iptables防火墙
- 面试官问:对象池技术了解吗?apache common pool2呢?
- java 反射 注解 运用_Java注解与反射的使用
- Python的浅拷贝和深拷贝
- Android UncaughtExceptionHandler 全局异常监控
- Tableau上面地图与条形图结合_何为计算的详细级别,认识Tableau中的Level of Detail...
- wxPython--学习笔记(一)
- heap堆(自己做菜)(空间很大),stack栈(餐馆吃饭)(能从栈获得的空间较小),static(全局变量和静态变量的存储),文字常量区,程序代码区,以及ROM,RAM,Flash
- Android反编译软件android killer教程
- usaco - Raucous Rockers
- 探索性与验证性因子分析
- K8s 中 iptables 和ipvs 的理解
- Git从远程仓库取代码
- 这个毕业季,让海马体照相馆为简历添“战斗力”
- Win11如何取消任务栏隐藏?Win11取消任务栏隐藏的方法
- 树莓派4B无线鼠标延迟解决办法
- CSS-基础选择器、字体文本属性、引入方式
- ACM入门及STL简介(转)
- FFmpeg之sws_scale库的应用(sws_getContext、sws_scale、sws_freeContext)
- mysql 日期减10分钟_获取当前时间减去10分钟的话SQL语句怎么写
热门文章
- Sublime 资源汇总
- 去除桌面图标的小箭头
- Python多线程--UDP聊天器
- mongo的php查询,使用PHP进行简单查询的mongo查询速度慢
- k8s dashboard_windows10 部署 docker+k8s 集群
- html表单input file,input标签type=file的文件上传
- ImageJ Nikon_科研论文作图之ImageJ
- html股票数据代码,股票数据的网站抓取(4.2)代码优化
- 数据结构:神奇的B树实现解析(有图有代码有真相!!!)
- 富士 FinePix F401