日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
解讀Android虛擬機(jī)工作原理

下面講述下Android虛擬機(jī)的組成部分和一些構(gòu)造原理,在介紹Android虛擬機(jī)之前,先要了解下什么是Android操作系統(tǒng),所謂的Android:是基于Linux內(nèi)核的軟件平臺(tái)和操作系統(tǒng),早期由Google開發(fā),后由開放手機(jī)聯(lián)盟Open Handset Alliance)開發(fā)。

我們提供的服務(wù)有:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、天津ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的天津網(wǎng)站制作公司

Linux系統(tǒng)中進(jìn)程間通信的方式有:socket, named pipe,message queque, signal,share memory。Java系統(tǒng)中的進(jìn)程間通信方式有socket, named pipe等。android應(yīng)用程序理所當(dāng)然可以應(yīng)用JAVA的IPC機(jī)制實(shí)現(xiàn)進(jìn)程間的通信,

取而代之的是Binder通信。Google為什么要采用這種方式呢,這取決于Binder通信方式的高效率。 Binder通信是通過(guò)linux的binder driver來(lái)實(shí)現(xiàn)的。Binder通信操作類似線程遷移(thread migration),兩個(gè)進(jìn)程間IPC看起來(lái)就象是一個(gè)進(jìn)程進(jìn)入另一個(gè)進(jìn)程執(zhí)行代碼然后帶著執(zhí)行的結(jié)果返回。

Binder的用戶空間為每一個(gè)進(jìn)程維護(hù)著一個(gè)可用的線程池,線程池用于處理到來(lái)的IPC以及執(zhí)行進(jìn)程本地消息,Binder通信是同步而不是異步。Android中的Binder通信是基于Service與Client的,所有需要IBinder通信的進(jìn)程都必須創(chuàng)建一個(gè)IBinder接口。

系統(tǒng)中有一個(gè)進(jìn)程管理所有的system service,Android虛擬機(jī)不允許用戶添加非授權(quán)的System service,當(dāng)然現(xiàn)在源碼開發(fā)了,我們可以修改一些代碼來(lái)實(shí)現(xiàn)添加底層system Service的目的。

對(duì)用戶程序來(lái)說(shuō),我們也要?jiǎng)?chuàng)建server,或者Service用于進(jìn)程間通信,這里有一ActivityManagerService管理JAVA應(yīng)用層所有的service創(chuàng)建與連接(connect)。disconnect,所有的 Activity也是通過(guò)這個(gè)service來(lái)啟動(dòng),加載的。ActivityManagerService也是加載在Systems Servcie中的。

Android虛擬機(jī)啟動(dòng)之前系統(tǒng)會(huì)先啟動(dòng)service Manager進(jìn)程,service Manager打開binder驅(qū)動(dòng),并通知binder kernel驅(qū)動(dòng)程序這個(gè)進(jìn)程將作為System Service Manager。然后該進(jìn)程將進(jìn)入一個(gè)循環(huán),等待處理來(lái)自其他進(jìn)程的數(shù)據(jù)。用戶創(chuàng)建一個(gè)System service后,通過(guò)defaultServiceManager得到一個(gè)遠(yuǎn)程ServiceManager的接口。

通過(guò)這個(gè)接口我們可以調(diào)用 addService函數(shù)將System service添加到Service Manager進(jìn)程中,然后client可以通過(guò)getService獲取到需要連接的目的Service的IBinder對(duì)象。這個(gè)IBinder是 Service的BBinder在binder kernel的一個(gè)參考,所以service IBinder 在binder kernel中不會(huì)存在相同的兩個(gè)IBinder對(duì)象。

每一個(gè)Client進(jìn)程同樣需要打開Binder驅(qū)動(dòng)程序。對(duì)用戶程序而言,我們獲得這個(gè)對(duì)象就可以通過(guò)binder kernel訪問(wèn)service對(duì)象中的方法。Client與Service在不同的進(jìn)程中,通過(guò)這種方式實(shí)現(xiàn)了類似線程間的遷移的通信方式,對(duì)用戶程序而言當(dāng)調(diào)用Service返回的IBinder接口后,訪問(wèn)Service中的方法就如同調(diào)用自己的函數(shù)。

實(shí)現(xiàn)接口時(shí)有幾個(gè)原則:

拋出的異常不要返回給調(diào)用者. 跨進(jìn)程拋異常處理是不可取的。IPC調(diào)用是同步的。如果你知道一個(gè)IPC服務(wù)需要超過(guò)幾毫秒的時(shí)間才能完成地話,你應(yīng)該避免在Activity的主線程中調(diào)用。

也就是IPC調(diào)用會(huì)掛起應(yīng)用程序?qū)е陆缑媸ロ憫?yīng). 這種情況應(yīng)該考慮單起一個(gè)線程來(lái)處理,能在AIDL接口中聲明靜態(tài)屬性。IPC的調(diào)用步驟:

1. 聲明一個(gè)接口類型的變量,該接口類型在.aidl文件中定義。

 2. 實(shí)現(xiàn)ServiceConnection。

 3. 調(diào)用ApplicationContext.bindService(),并在ServiceConnection實(shí)現(xiàn)中進(jìn)行傳遞. 

 4. 在ServiceConnection.onServiceConnected()實(shí)現(xiàn)中,你會(huì)接收一個(gè)IBinder實(shí)例(被調(diào)用的Service). 調(diào)用    YourInterfaceName.Stub.asInterface((IBinder)service)將參數(shù)轉(zhuǎn)換YourInterface類型。

 5. 調(diào)用接口中定義的方法。 你總要檢測(cè)到DeadObjectException異常,該異常在連接斷開時(shí)被拋出。它只會(huì)被遠(yuǎn)程方法拋出。

 6. 斷開連接,調(diào)用接口實(shí)例中的ApplicationContext.unbindService()


文章名稱:解讀Android虛擬機(jī)工作原理
當(dāng)前鏈接:http://www.5511xx.com/article/dphgepg.html