一、簡析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)
1.點擊撥號盤
- 原理:ActivityManagerService見啓動com.android.dialer包下的DialtactsActivity將啓動com.android.dialer包下的DialtactsActivity
@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);
}
}
三、源碼:
- 歡迎關注微信公衆號:傅里葉變換,個人賬號,僅用於技術交流