作者:Y_虞儿 | 来源:互联网 | 2024-10-26 16:55
在使用开发工具连接手机时,我们经常能看到进程编号,如PID和UID。在Android系统中,PID代表进程标识符,而UID则是用户标识符。与传统计算机系统不同,Android中的每个应用程序都对应一个唯一的UID,这不仅用于区分不同的应用程序,还用于实现系统的安全性和资源管理。通过这种方式,Android能够有效控制应用的权限和资源使用,确保系统的稳定性和安全性。
大家在用开发工具连接手机时一定见过下图的进程编号:
PID和UID存在的意义
Pid是进程ID,Uid是用户ID,只是Android和计算机不一样,计算机每个用户都具有一个Uid,哪个用户start的程序,这个程序的Uid就是那个用户,而Android中每个程序都有一个Uid,默认情况下,Android会给每个程序分配一个普通级别互不相同的 Uid,如果应用之间要互相调用,只能是Uid相同才行,这就使得共享数据具有了一定安全性,每个软件之间是不能随意获得数据的。而同一个application 只有一个Uid,所以application下的Activity之间不存在访问权限的问题。
uid共享数据实例
假设我们有这样一个需求,A和B是两个应用,现在要求在A中获取B的一张名字为icon_home的图片资源(以Drawable实例的形式呈现),那我们可以考虑将A和B的注册文件的manifest节点添加sharedUserId,并且赋值相同,然后在A中可以用如下方式实现:
Context subCOntext= null;
try {
//首先根据B应用的包名获取其上下文,注意这个方法是Context的,如果没找到会抛出异常
subCOntext= createPackageContext("com.geo.plugin",
Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//然后根据上下文获取资源
Resources res = subContext.getResources();
//然后根据图片的名字获取其id
int menuIcOnId= res.getIdentifier("icon_home", "drawable",
"com.geo.plugin");
//最后根据id生产Drawable实例
Drawable drawable = res.getDrawable(menuIconId);
最后需要注意的是,一个应用只有一个uid,但是可以有多个pid(通过process属性来指定进程)。