首页 Android从上层到底层完整流程

Android从上层到底层完整流程

举报
开通vip

Android从上层到底层完整流程很久之前写的一个流程文档,从上层界面一直调用到内核的过程,最近同事跟我要,我看了下又在整理了下,纯属个人分析(不过都运行验证过),不对的请大牛指出。Alarm调用流程,alarm的流程实现了从上层应用一直到下面driver的调用流程,下面简单阐述:涉及代码;./packages/apps/DeskClock/src/com/android/deskclock/./frameworks/base/core/java/android/app/./frameworks/base/services/java/com/and...

Android从上层到底层完整流程
很久之前写的一个 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 文档,从上层界面一直调用到内核的过程,最近同事跟我要,我看了下又在整理了下,纯属个人分析(不过都运行验证过),不对的请大牛指出。Alarm调用流程,alarm的流程实现了从上层应用一直到下面driver的调用流程,下面简单阐述:涉及代码;./packages/apps/DeskClock/src/com/android/deskclock/./frameworks/base/core/java/android/app/./frameworks/base/services/java/com/android/server/./frameworks/base/services/jni/./kernel/kernel/drivers/rtc/./kernel/kernel/include/linux/./kernel/kernel/drivers/rtc/./kernel/kernel/drivers/rtc/./kernel/kernel/drivers/rtc//packages/apps/DeskClock/src/com/android/deskclock/./kernel/arch/arm/configs/mmp2_android_defconfig./kernel/kernel/kernel/.config?点击Clock应用程序,然后设置新闹钟,会调到里面的publicstaticlongsetAlarm(Contextcontext,Alarmalarm){....setNextAlert(context);....}然后这里面也会调用到?publicstaticvoidsetNextAlert(finalContextcontext){if(!enableSnoozeAlert(context)){Alarmalarm=calculateNextAlert(context);.....,atTimeInMillis,sender);...}然后就调用到了里面方法publicvoidset(inttype,longtriggerAtTime,PendingIntentoperation){try{(type,triggerAtTime,operation);}catch(RemoteExceptionex){}}然后就调用到了里面方法publicvoidset(inttype,longtriggerAtTime,PendingIntentoperation){setRepeating(type,triggerAtTime,0,operation);}然后继续调用publicvoidsetRepeating(inttype,longtriggerAtTime,longinterval,PendingIntentoperation){.....synchronized(mLock){Alarmalarm=newAlarm();=type;=triggerAtTime;=interval;=operation;removeLocked(operation);if(localLOGV)(TAG,"set:"+alarm);intindex=addAlarmLocked(alarm);if(index==0){setLocked(alarm);}}}然后就调用到privatevoidsetLocked(Alarmalarm){.........}这里就调用到jni了privatenativevoidset(intfd,inttype,longseconds,longnanoseconds);这就调用到了里面staticJNINativeMethodsMethods[]={/*name,signature,funcPtr*/{"init","()I",(void*)android_server_AlarmManagerService_init},{"close","(I)V",(void*)android_server_AlarmManagerService_close},{"set","(IIJJ)V",(void*)android_server_AlarmManagerService_set},{"waitForAlarm","(I)I",(void*)android_server_AlarmManagerService_waitForAlarm},{"setKernelTimezone","(II)I",(void*)android_server_AlarmManagerService_setKernelTimezone},};set对应的是android_server_AlarmManagerService_set,具体是staticvoidandroid_server_AlarmManagerService_set(JNIEnv*env,jobjectobj,jintfd,jinttype,jlongseconds,jlongnanoseconds){#ifHAVE_ANDROID_OSstructtimespects;=seconds;=nanoseconds;?intresult=ioctl(fd,ANDROID_ALARM_SET(type),&ts);if(result<0){LOGE("Unabletosetalarmto%lld.%09lld:%s\n",seconds,nanoseconds,strerror(errno));}#endif}然后ioctl就调用到了staticlongalarm_ioctl(structfile*file,unsignedintcmd,unsignedlongarg){....caseANDROID_ALARM_SET(0):if(copy_from_user(&new_alarm_time,(void__user*)arg,sizeof(new_alarm_time))){rv=-EFAULT;gotoerr1;}from_old_alarm_set:spin_lock_irqsave(&alarm_slock,flags);pr_alarm(IO,"alarm%dset%ld.%09ld\n",alarm_type,,;alarm_enabled|=alarm_type_mask;alarm_start_range(&alarms[alarm_type],timespec_to_ktime(new_alarm_time),timespec_to_ktime(new_alarm_time));spin_unlock_irqrestore(&alarm_slock,flags);if(ANDROID_ALARM_BASE_CMD(cmd)!=ANDROID_ALARM_SET_AND_WAIT(0)&&cmd!=ANDROID_ALARM_SET_AND_WAIT_OLD)break;/*fallthough*/....caseANDROID_ALARM_SET_RTC:if(copy_from_user(&new_rtc_time,(void__user*)arg,sizeof(new_rtc_time))){rv=-EFAULT;gotoerr1;}rv=alarm_set_rtc(new_rtc_time);spin_lock_irqsave(&alarm_slock,flags);alarm_pending|=ANDROID_ALARM_TIME_CHANGE_MASK;wake_up(&alarm_wait_queue);spin_unlock_irqrestore(&alarm_slock,flags);if(rv<0)gotoerr1;break;....}然后这边就调用到了alarm_start_range设置闹钟,alarm_set_rtc设置RTC这两个函数在声明,在里实现。这是里面的声明voidalarm_start_range(structalarm*alarm,ktime_tstart,ktime_tend);intalarm_try_to_cancel(structalarm*alarm);intalarm_cancel(structalarm*alarm);ktime_talarm_get_elapsed_realtime(void);/*setrtcwhilepreservingelapsedrealtime*/intalarm_set_rtc(conststructtimespects);下面看里面实现:intalarm_set_rtc(structtimespecnew_time){....ret=rtc_set_time(alarm_rtc_dev,&rtc_new_rtc_time);....}里面实现了alarm_suspendalarm_resume函数,就是如果系统没有suspend的时候,设置闹钟并不会往rtc芯片的寄存器上写数据,因为不需要唤醒系统,所以闹钟数据时间什么的就通过上层写到设备文件/dev/alarm,里面就可以了,AlarmThread会不停的去轮寻下一个时间有没有闹钟,直接从设备文件/dev/alarm里面读取。第二种,系统要是进入susupend的话,alarm的alarm_suspend就会写到下层的rtc芯片的寄存器上去,然后即使系统suspend之后,闹钟通过rtc也能唤醒系统,这里就调用到了里面..err=rtc->ops->set_time(rtc->,tm);....}然后set_time就看到具体的是那个RTC芯片,这边我们是staticconststructrtc_class_opspcf8563_rtc_ops={.read_time=pcf8563_rtc_read_time,.set_time=pcf8563_rtc_set_time,.read_alarm=pcf8563_rtc_read_alarm,.set_alarm=pcf8563_rtc_set_alarm,};然后就到了staticintpcf8563_rtc_set_time(structdevice*dev,structrtc_time*tm){unsignedcharbuf[TIME_NUM];intret;ret=data_calc(buf,tm,TIME_NUM);if(ret<0)gotoout;ret=i2c_smbus_write_i2c_block_data(pcf8563_info->client,PCF8563_RTC_SEC,TIME_NUM,buf);kernel/kernel/kernel/.config查看,这边的pcf8563rtc是当前系统正在使用的芯片型号?#CONFIG_RTC_DRV_ISL1208isnotset#CONFIG_RTC_DRV_X1205isnotsetCONFIG_RTC_DRV_PCF8563=y#CONFIG_RTC_DRV_PCF8583isnotset#CONFIG_RTC_DRV_M41T80isnotset下面是系统唤醒之后,闹钟怎么工作的流程,简单阐述系统没有suspend的话直接走下面流程,如果suspend的话会被RTC唤醒,然后还是走下面的流程privateclassAlarmThreadextendsThread{publicAlarmThread(){super("AlarmManager");}?publicvoidrun(){while(true){intresult=waitForAlarm(mDescriptor);..Alarmalarm=();try{if(localLOGV)(TAG,"sendingalarm"+alarm);(,,mResultReceiver,mHandler);....}}}staticjintandroid_server_AlarmManagerService_waitForAlarm(JNIEnv*env,jobjectobj,jintfd){#ifHAVE_ANDROID_OSintresult=0;?do{result=ioctl(fd,ANDROID_ALARM_WAIT);}while(result<0&&errno==EINTR);?if(result<0){LOGE("Unabletowaitonalarm:%s\n",strerror(errno));return0;}?returnresult;#endif}AlarmManagerService里面有个AlarmThread会一直轮询/dev/alarm文件,如果打开失败就直接返回,成功就会做一些动作,比如查找时间最近的alarm,比如睡眠被闹钟唤醒的时候,这边就发一个intent出去,然后在里面弹出里面会收到就会调用下面的(alarmAlert);然后弹出alarm这个界面Classc=;其中publicclassAlarmAlertextendsAlarmAlertFullScreen所以系统睡眠之后被alarm唤醒弹出的alarm就是这边start的publicclassAlarmReceiverextendsBroadcastReceiver{/**IfthealarmisolderthanSTALE_WINDOW,ignore.Itisprobablytheresultofatimeortimezonechange*/privatefinalstaticintSTALE_WINDOW=30*60*1000;@OverridepublicvoidonReceive(Contextcontext,Intentintent){.........IntentalarmAlert=newIntent(context,c);,alarm);|;(alarmAlert);........}到这里alarm就显示出来了我个人添加的log,验证了流程,suspend和不suspend的时候alarm的区别跟上面说的一样
本文档为【Android从上层到底层完整流程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
平忠
教育
格式:doc
大小:15KB
软件:Word
页数:0
分类:企业经营
上传时间:2021-08-24
浏览量:9