日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android之IPC通信中的UID和PID识别

發(fā)布時(shí)間:2023/12/4 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之IPC通信中的UID和PID识别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
PCThreadState對(duì)象維護(hù)了2個(gè)變量

??????????? pid_t?????????????? mCallingPid;

??????????? uid_t?????????????? mCallingUid;

??? 從變量名稱(chēng)來(lái)看,這2個(gè)變量保存了進(jìn)程的PID和UID,并且由于這兩個(gè)變量由IPCThreadState對(duì)象維護(hù),可見(jiàn)它們是與IPC相關(guān)的。具體它們保存的是IPC發(fā)送方的PID和UID還是當(dāng)前進(jìn)程的IPD和UID,視情況而定。

??? 在IPC調(diào)用過(guò)程中,被調(diào)用方需要知道調(diào)用方的UID和PID,以便被調(diào)用方用于權(quán)限檢測(cè);所以需要一種方式來(lái)提供調(diào)用方的UID和PID,因此上述2個(gè)變量的主要作用就是用于權(quán)限檢測(cè)。

??? 那么我們想象一下,下面描述的情況下,mCallingPid和mCallingUid又應(yīng)該保存誰(shuí)的UID和PID?假如有2個(gè)進(jìn)程process A和process B,我們站在process B的角度來(lái)分析,process A IPC調(diào)用process B, 而process B 又調(diào)用同樣處于process B的Service的接口(盡管此時(shí)實(shí)際上不是遠(yuǎn)程調(diào)用,并且開(kāi)發(fā)者是知道的,但是對(duì)于Binder調(diào)用機(jī)制來(lái)說(shuō),它本身并不知道當(dāng)前的調(diào)用是否為遠(yuǎn)程調(diào)用,前幾篇文章中有分析系統(tǒng)如何確定是否為遠(yuǎn)程調(diào)用,這個(gè)過(guò)程是在binder driver中實(shí)現(xiàn)的),那么此時(shí)mCallingPid和mCallingUid是不是應(yīng)該保存process B的UID和PID?

1.?????? process B在被process A IPC調(diào)用時(shí), process B需知道process A的UID和PID,來(lái)檢查process A的訪問(wèn)權(quán)限,此時(shí)mCallingUid和mCallingPid保存的是process A的UID和PID。

2.?????? 在IPC遠(yuǎn)程調(diào)用process B的過(guò)程中,process B的方法調(diào)用了同進(jìn)程中的service的接口,process B既是調(diào)用方也是被調(diào)用方,雖然這個(gè)過(guò)程比較無(wú)聊,但是鑒于IPC過(guò)程的不透明性,因此process B仍然需要進(jìn)行權(quán)限檢測(cè)。


前面的文章中分析過(guò),binder driver會(huì)判斷當(dāng)前的Binder調(diào)用是否為遠(yuǎn)程調(diào)用,如果是同進(jìn)程調(diào)用的話,BD就不會(huì)再向應(yīng)用提供進(jìn)程的PID和UID。因此在process B中需要顯示的設(shè)置當(dāng)前的PID和UID。

??? 為實(shí)現(xiàn)以上case, Android提供了一組函數(shù)

??? public static final native long clearCallingIdentity();

??? public static final native void restoreCallingIdentity(long token);

??? process B的方法調(diào)用了同進(jìn)程中的service的接口前,clearCallingIdentity()方法會(huì)清除process A的UID和PID,重置為process B的UID和PID。

??? process B的方法調(diào)用了同進(jìn)程中的service的接口后,此時(shí)仍然處在process A遠(yuǎn)程調(diào)用process B方法的過(guò)程中,此時(shí)需要restore? process A的UID和PID。

??? 本文描述的case,雖然在application 開(kāi)發(fā)中并不常見(jiàn),但是在system_server中很常見(jiàn),比如client調(diào)用ActivityManagerService的方法,而ActivityManagerService又調(diào)用了PackageManagerService的方法,并且ActivityManagerService和PackageManagerService均會(huì)運(yùn)行在system_server進(jìn)程中。

總結(jié)

以上是生活随笔為你收集整理的Android之IPC通信中的UID和PID识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。