oneshot
//开机铃声服务 /system/media/startupsound是铃声文件
service startupsound /system/bin/mplayer /system/media/startupsound
user media
group audio
disabled
oneshot
//关机铃声服务 /system/media/shutdownsound是关机铃声
service shutdownsound /system/bin/mplayer /system/media/shutdownsound
user media
group audio
disabled
oneshot
//定义了一个bootanim的服务,对应执行/system/bin/bootanimation
//disabled 表示init进程创建只是创建它,但不立刻执行
//oneshot 表示该服务只执行一次
service bootanim /system/bin/bootanimation
user graphics
group graphics
disabled
oneshot
当android系统boot时,开始加载动画和开机铃声,其代码位于
//源文件SurfaceFlinger.cpp
status_t SurfaceFlinger::readyToRun() {
// start boot animation service
property\_set("ctl.start", "bootanim");//注
{
char value\[PROPERTY\_VALUE\_MAX\];
property\_get("persist.sys.profile.silent", value, "0");
if (atoi(value)== 0){
LOGI("start:persist.sys.profile.silent is soundable");
// start startupsound service
property\_set("ctl.start","startupsound");//注
} else {
LOGI("start:persist.sys.profile.silent is silent");
}
}
return NO\_ERROR;
}
当Android完成boot后,关闭动画和开机铃声,代码位于
//源文件SurfaceFlinger.cpp
void SurfaceFlinger::bootFinished() {
const nsecs_t now = systemTime();
const nsecs_t duration = now - mBootTime;
LOGI(“Boot is finished (%ld ms)”, long(ns2ms(duration)) );
mBootFinished = true;
//stop bootanim service
property_set(“ctl.stop”, “bootanim”);
char value[PROPERTY_VALUE_MAX];
property_get(“persist.sys.profile.silent”, value, “0”);
if (atoi(value)== 0){
LOGI("stop:persist.sys.profile.silent is soundable");
//stop startupsound service
property\_set("ctl.stop","startupsound");
} else {
LOGI("stop:persist.sys.profile.silent is silent");
}
}
如何理解ctr.start和ctr.stop系统属性?
每一项服务必须在/init.rc中定义.Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“
ctl.start ”和“ ctl.stop ”是用来启动和停止服务的。一旦收到设置“ ctrl.start
”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中
。客户端应用程序可以轮询那个属性值,以确定结果。想更深入了解Android property系统可以参考博文《(翻译)Android属性系统》。
property\_set("ctl.start",ServiceName);就是启动ServiceName服务(在init.rc中定义);
property\_set("ctl.stop",ServiceName)相对的是关闭ServiceName服务。
A启动动画服务
由于开机动画和关机动画除了播放的动画文件不同,其他的完全一致,这里重复利用/system/bin/bootanimation代码,
仿照开机动画服务,我们新定义关机动画
service shutdownanim /system/bin/bootanimation -shutdown
user graphics
group graphics
disabled
oneshot
唯一要注意的是关机动画使用的/system/bin/bootanimation带了-shutdown参数,这个参数用来区分加载的动画文件为开机还是关机动画。当bootanimation服务启动时,进入/frameworks/base/cmds/bootanimation/bootanimation\_main.cpp主函数main
int main(int argc, char** argv)
{
总结
作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Jx-1714201768760)]
[外链图片转存中…(img-xIRUDma1-1714201768761)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!