⑴ android Binder具體是干什麼用的
Binder主要能提供以下一些功能:
用驅動程序來推進進程間的通信。
通過共享內存來提高性能。
為進程請求分配每個進程的線程池。
針對系統中的對象引入了引用計數和跨進程的對象引用映射。
進程間同步調用。
Android Binder設計與實現 – 設計篇:
目前linux支持的IPC包括傳統的管道、System V IPC、即消息隊列/共享內存/信號量,以及socket中只有socket支持Client-Server的通信方式。
當然也可以在這些底層機制上架設一套協議來實現Client-Server通信,但這樣增加了系統的復雜性,在手機這種條件復雜,資源稀缺的環境下可靠性也難以保證。
另一方面是傳輸性能:
socket作為一款通用介面,其傳輸效率低,開銷大,主要用在跨網路的進程間通信和本機上進程間的低速通信。
消息隊列和管道採用存儲-轉發方式,即數據先從發送方緩存區拷貝到內核開辟的緩存區中,然後再從內核緩存區拷貝到接收方緩存區,
至少有兩次拷貝過程。共享內存雖然無需拷貝,但控制復雜,難以使用。
還有一點是出於安全性考慮:
Android作為一個開放式,擁有眾多開發者的平台,應用程序的來源廣泛,確保智能終端的安全是非常重要的。
終端用戶不希望從網上下載的程序在不知情的情況下偷窺隱私數據,連接無線網路,長期操作底層設備導致電池很快耗盡等等。傳統IPC沒有任何
安全措施,完全依賴上層協議來確保。首先傳統IPC的接收方無法獲得對方進程可靠的UID/PID(用戶ID/進程ID),從而無法鑒別對方身份。
Android為每個安裝好的應用程序分配了自己的UID,故進程的UID是鑒別進程身份的重要標志。使用傳統IPC只能由用戶在數據包里填入UID/PID,
但這樣不可靠,容易被惡意程序利用。可靠的身份標記只有由IPC機制本身在內核中添加。其次傳統IPC訪問接入點是開放的,無法建立私有通道。
比如命名管道的名稱、system V的鍵值、socket的ip地址或文件名都是開放的,只要知道這些接入點的程序都可以和對端建立連接,不管怎樣都無法
阻止惡意程序通過猜測接收方地址獲得連接。
基於以上原因,Android需要建立一套新的IPC機制來滿足系統對通信方式,傳輸性能和安全性的要求,這就是Binder。
Binder基於 Client-Server通信模式,傳輸過程只需一次拷貝,為發送發添加UID/PID身份,既支持實名Binder也支持匿名Binder,安全性高。
面向對象的 Binder IPC:
面向對象思想的引入將進程間通信轉化為通過對某個Binder對象的引用調用該對象的方法,而其獨特之處在於Binder對象是一個
可以跨進程引用的對象,它的實體位於一個進程中,而它的引用卻遍布於系統的各個進程之中。最誘人的是,這個引用和java里引用
一樣既可以是強類型,也可以是弱類型,而且可以從一個進程傳給其它進程,讓大家都能訪問同一Server,就像將一個對象或引用賦
值給另一個引用一樣。Binder模糊了進程邊界,淡化了進程間通信過程,整個系統彷彿運行於同一個面向對象的程序之中。
面向對象只是針對應用程序而言,對於Binder驅動和內核其它模塊一樣使用C語言實現,沒有類和對象的概念。
Binder驅動為面向對象的進程間通信提供底層支持。
⑵ android手機中PID和UID有什麼聯系
PID就是各進程的身份標識,獨一無二。
UID在linux中就是用戶的ID,表明時哪個用戶運行了這個程序,主要用於許可權的管理。
找了一個詳細講解的網頁,你看下。http://www.cnblogs.com/perseus/articles/2354173.html
⑶ Android上如何查看CPU和內存信息
1.進入adb shell
2.輸入top -m 10 -s cpu 可查看佔用cpu最高的前10個程序(-t 顯示進程名稱,-s 按指定行排序,-n 在退出前刷新幾次,-d 刷新間隔,-m 顯示最大數量)
參數含義:
PID:progressidentification,應用程序ID
S: 進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數。
#THR:程序當前所用的線程數
VSS:Virtual Set Size虛擬耗用內存(包含共享庫佔用的內存)
RSS: Resident Set Size實際使用物理內存(包含共享庫佔用的內存)
PCY:不知道什麼意思,期待解答
UID:UserIdentification,用戶身份ID
Name:應用程序名稱
查看內存消耗
1.進入adb shell ;
2.輸入mpsys meminfo(PID或者是包名)
⑷ android 增加了vid與uid,但是還是默認值
先來理下什麼是pid vid的概念
使用USB插入android設備,點擊我的電腦—管理—設備管理器—圖象處理設備—設備屬性—詳細信息,之後會出現「USB\VID_05A9&PID_2800\5&1BFE1C47&0&8」等字樣;實際上是一個USB設備在Windows系統下作為其唯一標識的ID,准確的名稱叫做DevicePath,當然那個還不是完整的。在USB\VID_05A9&PID_2800\5&1BFE1C47&0&8裡面,USB代表設備類型,5&1BFE1C47&0&8代表設備連接位置,包括匯流排位置,控制器位置,控制器編號,埠編號這幾項,而VID_05A9&PID_2800則是設備信息,而USB的驅動也正是依賴於這個,VID其實是Vendor ID,而PID則是Proct ID,分別代表生產商的編號和生產商內部的產品編號。原則上說一個USB設備必須有PID和VID,屬於USB介面晶元的可選設置,但是現在貌似很多生產商都是隨意寫的,尤其是國內好多廠商申請vid比較難,索性使用知名的廠商的vid。
vendor ID 廠家ID和proct ID。 VID是要申請的(當然你也可以隨便寫),PID是廠家自己定義的。
PID / VID可以唯一標識一個設備
最近再弄關於android的PC端管理工具,發現好多android手機的pid,vid並不唯一(PID / VID可以唯一標識一個設備好像不成立),比如一台摩托羅拉XT800+和摩托羅拉的里程碑的pid,vid是一模一樣的,至少我這邊從設備管理器獲取的信息是這樣的,當兩台手機同時插入PC端,在未安裝驅動的時候(這個時候adb拿不到設備序列號)檢測出2台設備屬於同一款機型,因為後台資料庫裡面只有一份數據,基本上提示用戶是某某手機屬於扯淡,不知道各位有啥好的辦法支撐不?苦於後台資料庫的數據不足,我們只能通過PC客戶端手機用戶的一些手機的model,pid,vid然後人工統計,進行有效的補足措施。談到mac下的android管理工具的開發,貌似少了驅動這邊的一些繁瑣的事情,由於見識和經驗不足,談到此處,如果問題及時聯系。
⑸ 如何獲取Android正在運行的應用和它的pid
ActivityManager mActivityManager = (ActivityManager)
this
.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo>
mRunningProcess = mActivityManager
.getRunningAppProcesses();
int i =
1;
for (ActivityManager.RunningAppProcessInfo amProcess :
mRunningProcess)
{
Log.i("Application", (i++) + "PID: " +
amProcess.pid
+ "(processName=" + amProcess.processName +
"UID="+amProcess.uid+")");
}
直接看看代碼吧。
⑹ android系統的uid問題
不對,UID不是數字,PID才是,PID也沒有你說的那種情況。應用程序的UID是app_#,#代表數字。而系統進程的UID是root或者system
連上android設備或者模擬器,進入adb shell,top就可以看到當前所有進程。
⑺ 如何獲取Android正在運行的應用和它的pid
ActivityManager mActivityManager = (ActivityManager)
this
.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo>
mRunningProcess = mActivityManager
.getRunningAppProcesses();
int i =
1;
for (ActivityManager.RunningAppProcessInfo amProcess :
mRunningProcess)
{
Log.i("Application", (i++) + "PID: " +
amProcess.pid
+ "(processName=" + amProcess.processName +
"UID="+amProcess.uid+")");
}