⑴ 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+")");
}