作者: 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。