Android連載39-簡析HAL、撥號盤

一、簡析HAL結構

  • HAL是一個位於操作系統和驅動程序之上,運行在用戶空間中的服務程序。
  • 目的:對上層應用提供一個統一的查詢硬件設備的接口。
  • 好處:簡化了應用程序查詢硬件的邏輯
  • 注意:HAL所謂的抽象不提供對硬件的實際操作,對硬件的操作仍然由具體的驅動程序來完成。

1.android爲什麼引入HAL

  • 由於安卓是基於Linux內核進行開發,而linux內核使用GPL許可證,這就要求,使用到這個許可證的軟件,對開源軟件的任何修改擴充都必須開源,如果引入了HAL,就可以讓android系統層和內核靠HAL隔離開,而HAL是遵循APL許可證,這個就不要求,使用了開源軟件的修改必須開源的準則,所以能保證一些開發者的利益。

2.android中HAL運行結構

  • RIL(Radio Interface Layer 無線通信接口層
  • HAL Stub運行原理:上層調用底層,通過底層HAL提供的函數,而底層在處理完上層請求後或硬件狀態發生變化的時候回調上層,而通過Runtime提供的callback接口完成。
  • Hal Stub有一種包含關係,也就是HAL裏包含了很多Stub,Runtime只要說明請求類型,就可以取得並操作Stub對應的operations方法,其實現都是在hardware.c和hardware.h中,實質是通過dlopen方法加載.so動態鏈接庫,從而調用*.so裏的符號實現。

二、深入解析通話流程

  • AndoridTelephony主要包括四個方面的手機通信能力:
    • ServiceState/SIM(網絡服務,包好SIM)
    • Call(通話能力)
    • DataCall(移動數據上網能力)
    • SMS/MMS(短信/彩信能力)

1.點擊撥號盤

@DialtactsActivity
.......
## 省略上面的代碼
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    Trace.beginSection(TAG + " onCreate");
    LogUtil.enterBlock("DialtactsActivity.onCreate");
    super.onCreate(savedInstanceState);

    firstLaunch = true;
    isLastTabEnabled =
        ConfigProviderComponent.get(this).getConfigProvider().getBoolean("last_tab_enabled"false);
........
# 根據layout中的你的id來註冊這個按鈕
FloatingActionButton floatingActionButton = findViewById(R.id.floating_action_button);
    floatingActionButton.setOnClickListener(this);
    floatingActionButtonController = new FloatingActionButtonController(this, floatingActionButton);
...........
# 查看DialtacksActivity類的onClick方法
private void showDialpadFragment(boolean animate) {
...........
    final FragmentTransaction ft = getFragmentManager().beginTransaction();
    if (dialpadFragment == null) {
      dialpadFragment = new DialpadFragment();
      ft.add(R.id.dialtacts_container, dialpadFragment, TAG_DIALPAD_FRAGMENT);
    } else {
      ft.show(dialpadFragment);
    }
..........
    setTitle(R.string.launcherDialpadActivityLabel);
  }
@DialpadFragment
..........
  @Override
  public void onClick(View view) {
    int resId = view.getId();
    if (resId == R.id.dialpad_floating_action_button) {
      view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
      handleDialButtonPressed();
    } else if (resId == R.id.deleteButton) {
      keyPressed(KeyEvent.KEYCODE_DEL);
    } else if (resId == R.id.digits) {
      if (!isDigitsEmpty()) {
        digits.setCursorVisible(true);
      }
    } else if (resId == R.id.dialpad_overflow) {
      overflowPopupMenu.show();
    } else {
      LogUtil.w("DialpadFragment.onClick""Unexpected event from: " + view);
    }
  }

  • 撥號盤裏面的邏輯
  • 未完待續

三、源碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章