Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

Android下PID, UID, TID相关知识

$
0
0
作者: Sam (甄峰)  sam_code@hotmail.com

0. 基础知识:
Android架构在Linux系统之上。
Linux系统下,每个Process拥有一个PID,Process ID. 每个用户拥有一个UID:User ID, 每个Thread也拥有一个TID。
使用Linux命令,ps, top等。均可以看到PID,User(非UID) UID等信息。
同一个用户,启动的程序,它们的UID相同。

如何看到某个User的UID呢? 使用id命令即可。
$id sam,uid=1000(sam)  gid=1000(sam) .......
(另一方面,top的PID是否就是Process ID, 其实也是存疑的,因为当在Thread模式下时,同一个Process的Thread的PID是不同的)


但在Android下,不少概念有所变化。最关键就是UID,由于Android不是多用户系统,所以,UID的概念有较大变化。每个应用程序都有一个UID。只有UID相同,资源才可以相互使用。所以,某种程度上可以认为,Android系统为每个APP指定一个UID。
每个UID对应一个User,比如:u0_a55。利用ps,可以在user那一栏中看到。



1. Android下如何获取PID, UID, TID
方法一:
使用android.os.Process 这个Class。可以很容易的获取本身的PID, UID, TID.
myPid();
myTid();
myUid();
分别可以得到当前APP的PID, Tid,UID。

方法二:
cat /data/system/packages.list
出现一系列:

com.android.example.spinner 10055 1 /data/data/com.android.example.spinner default 1028,1015
其中第二个数据就是UID。

方法三:
ApplicationInfo  appInfo = getApplicationInfo();
appInfo.uid 即为本App的UID。

方法四:
获取其它App的UID
List packs = getPackageManager().getInstalledApplications(0);
        for(ApplicationInfo info : packs)
        {
        if(info.packageName.equalsIgnoreCase("xxxxxx")  )
        {
        s = "PackageName:" +info.packageName + "\n";
                s = s + "UID:" + info.uid + "\n";
        }
        }


2. 察看某个User的UID:
Android为每个App(非系统) 分配一个User, 每个User对应一个UID。 那如果知道某个User的UID呢?
android.os.Process.getUidForName("u0_a55");

所以类似:
中的参数,都是ps的第一列中显示的User。





 

Viewing all articles
Browse latest Browse all 158

Trending Articles