2023年6月28日发(作者:)
androidaidl参数限制,Android之解决aidl⾥⾯函数参数太⼤不能跨进程通信的问题问题:因为做的截屏拍照是跨进程通信的,所以需要⽤aidl,但是参数传递⽤的byte[] image,⽹上查了下aidl传递的基本参数类型,没有byte[], 然后把图⽚转化成String,结果时候接受得到有时候接受不到,不知道什么原因,然后其它传递参数⼜可以与服务端通信,后来推测,应该是aidl传递参数⼤⼩有限制。分析:1、不能把图⽚转成字符串,即使能传过去,也不⾏。2、参数传递太⼤了。3、可⽤序列化。4、先把图⽚保存到本地,然后传图⽚的路径。aidl中⽀持的参数类型为:基本类型(int,long,char,boolean等),String,CharSequence,List,Map,其他类型必须使⽤import导⼊,即使它们可能在同⼀个包⾥,⽐如上⾯的Student,尽管它和IMyService在同⼀个包中,但是还是需要显⽰的import进来。⼯程实现通过service实现aidl实体类⼯程通过发起bindservice,根据action去启动远程(跨进程的)bus上的aidl。那么问题来了,我们知道,linux系统进程间通信,各个进程间资源是隔离的,两个进程间需要通信,就要把msg转换成底层os系统能够识别的数据单元,在Android⾥⾯的⽅案是aidl+parcelbal的序列化。为了模拟和测试aidl的性能问题,我做了个简单实验,在Android中,进程间通信通过binder实现,bind是通信的数据载体,当序列化后的数据单元过⼤时,就会出问题,报出ctionTooLargeException。官⽅⽂档⾥有说明,最⼤通常限制为1M.也就是说如果⼤于1M数据的话,就应该分开传。理论上说,应该都是对象和字符串类型的数据为主,只要不是⼤图⽚实体等问题,⼀般应该够⽤。我这边做了⼀个测试,序列化传送了450k的String被序列化 后的数据,耗时使⽤了33秒的时间。try {StringBuilder sb = new StringBuilder();for(int i = 0;i< 30;i++){(new String (stringMsg));}n( "actor time start :" + tTimeMillis());g("msg from actor : " + ng());} catch (RemoteException e) {// TODO Auto-generated catch tackTrace();}------public static BusCore coreBinder = new () {@Overridepublic void sendMsg(String msg) throws RemoteException {Log.d("", " RemoteBusCoreService msg:" + msg);n("buscore time end :" + tTimeMillis());}};对于远程服务,必须调⽤ bindService()⽅法,⽽不是 startService()⽅法。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687955305a60603.html
评论列表(0条)