数据丢失找捷定数据恢复中心

Android 启动过程代码分析

开机过程中无线模块的初始化过程;如果sim卡锁开启,或者pin被锁住的时候,会要求输入pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能进行。(图形系统都还没有初始化怎么输入密码阿?)当系统初始化完成以后会调用 wm.systemReady()来通知大家。这时候该做什么就做什么。

开机过程中无线模块的初始化过程:

  rild 调用参考实现 Reference-ril.c (hardware\ril\reference-ril) 中的函数:

  const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)

  ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);

  static void *mainLoop(void *param)

  ret = at_open(fd, onUnsolicited);

  RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);

  在 initializeCallback 函数中对猫进行了初始化。

  static void initializeCallback(void *param)

  {

  ATResponse *p_response = NULL;

  int err;

  setRadioState (RADIO_STATE_OFF);

  at_handshake();

  /* note: we don't check errors here. Everything important will

  be handled in onATTimeout and onATReaderClosed */

  /* atchannel is tolerant of echo but it must */

  /* have verbose result codes */

  at_send_command("ATE0Q0V1", NULL);

  /* No auto-answer */

  at_send_command("ATS0=0", NULL);

  /* Extended errors */

  at_send_command("AT+CMEE=1", NULL);

  /* Network registration events */

  err = at_send_command("AT+CREG=2", &p_response);

  /* some handsets -- in tethered mode -- don't support CREG=2 */

  if (err < 0 || p_response->success == 0) {

  at_send_command("AT+CREG=1", NULL);

  }

  at_response_free(p_response);

  /* GPRS registration events */

  at_send_command("AT+CGREG=1", NULL);

  /* Call Waiting notifications */

  at_send_command("AT+CCWA=1", NULL);

  /* Alternating voice/data off */

  at_send_command("AT+CMOD=0", NULL);

  /* Not muted */

  at_send_command("AT+CMUT=0", NULL);

  /* +CSSU unsolicited supp service notifications */

  at_send_command("AT+CSSN=0,1", NULL);

  /* no connected line identification */

  at_send_command("AT+COLP=0", NULL);

  /* HEX character set */

  at_send_command("AT+CSCS=\"HEX\"", NULL);

  /* USSD unsolicited */

  at_send_command("AT+CUSD=1", NULL);

  /* Enable +CGEV GPRS event notifications, but don't buffer */

  at_send_command("AT+CGEREP=1,0", NULL);

  /* SMS PDU mode */

  at_send_command("AT+CMGF=0", NULL);

  #ifdef USE_TI_COMMANDS

  at_send_command("AT%CPI=3", NULL);

  /* TI specific -- notifications when SMS is ready (currently ignored) */

  at_send_command("AT%CSTAT=1", NULL);

  #endif /* USE_TI_COMMANDS */

  /* assume radio is off on error */

  if (isRadioOn() > 0) {

  setRadioState (RADIO_STATE_SIM_NOT_READY);

  }

  }

  默认状况下假设射频模块是好的,

  通过 setRadioState (RADIO_STATE_SIM_NOT_READY) 来触发对无线模块的初始化。

  通过 static void onRadioPowerOn() 对无线模块初始化。

  首先通过 pollSIMState(NULL); 轮询 sim卡状态 。

  static void pollSIMState (void *param)

  {

  ATResponse *p_response;

  int ret;

  if (sState != RADIO_STATE_SIM_NOT_READY) {

  // no longer valid to poll

  return;

  }

  switch(getSIMStatus()) {

  case RIL_SIM_ABSENT:

  case RIL_SIM_PIN:

  case RIL_SIM_PUK:

  case RIL_SIM_NETWORK_PERSONALIZATION:

  default:

  setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT);

  return;

  case RIL_SIM_NOT_READY:

  RIL_requestTimedCallback (pollSIMState, NULL, &TIMEVAL_SIMPOLL);

  return;

  case RIL_SIM_READY:

  setRadioState(RADIO_STATE_SIM_READY);

  return;

  }

  }

  读取sim卡状态的函数是:getSIMStatus()

  err = at_send_command_singleline("AT+CPIN?", "+CPIN:", &p_response);

  它向猫发送了at命令 AT+CPIN? 来查询无线模块的状态,如果无线模块还没有就绪,那么他隔1秒钟继续调用

  sim卡状态轮询函数 pollSIMState,直到获得sim卡状态。

  当sim卡状态为就绪,那么通过 setRadioState(RADIO_STATE_SIM_READY) 设置变量 sState 为:

  RADIO_STATE_SIM_READY,这时候会调用函数 static void onSIMReady()来进一步初始化无线模块。

  发送的at命令有:

  at_send_command_singleline("AT+CSMS=1", "+CSMS:", NULL);

  at_send_command("AT+CNMI=1,2,2,1,1", NULL);

  如果sim卡锁开启,或者pin被锁住的时候,会要求输入pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能

  进行。(图形系统都还没有初始化怎么输入密码阿?)当系统初始化完成以后会调用 wm.systemReady()来通知大家。

  这时候该做什么就做什么。

  wm.systemReady()的调用会触发解锁界面。具体流程如下:

  因为有: WindowManagerService wm = null;所以 wm.systemReady()

  调用的是 WindowManagerService 中的函数:

  public void systemReady() {

  mPolicy.systemReady();

  }

  WindowManagerService 中有:

  final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();

  PolicyManager.makeNewWindowManager 调用的是文件 PolicyManager.java 中的函数:

  public static WindowManagerPolicy makeNewWindowManager() {

  return sPolicy.makeNewWindowManager();

  }

  sPolicy.makeNewWindowManager 调用的是文件 Policy.java 中的函数:

  public PhoneWindowManager makeNewWindowManager() {

  return new PhoneWindowManager();

  }

  因为 PhoneWindowManager 继承自 WindowManagerPolicy

  所以 mPolicy.systemReady() 最终调用的是文件 PhoneWindowManager.java 中的函数:

  public void systemReady()

  mKeyguardMediator.onSystemReady();

  doKeyguard();

  showLocked();

  Message msg = mHandler.obtainMessage(SHOW);

  mHandler.sendMessage(msg);

  发送 SHOW 的消息。

  文件 KeyguardViewMediator.java 中的消息处理函数:

  public void handleMessage(Message msg) 对 SHOW 消息进行了处理。

  如果 msg.what 等于 SHOW 那么执行:

  handleShow();

当你遇到数据丢失情况时,为了避免更严重损坏,应立即停止操作,咨询专业数据恢复人员。
咨询电话: 021-31265210

捷定数据恢复中心 | 网站首页 - 介质送修流程 - 修复所需费用 - 站内地图 - 友情链接 - 联系我们