当前位置: 首页 > news >正文

网站建立要多少钱百度推广外包哪家不错

网站建立要多少钱,百度推广外包哪家不错,泰安做网站公司哪家好,国外有哪几家做充电桩网站一 binder架构原理 Binder是一个类,主要用在Service组件应用中。 /framework/base/core/java/Android/os/Binder.java(包含内部类BinderProxy) client与service分别是不同的进程,不能直接通信,所以引入BinderDriver client与service不希望…

一 binder架构原理

Binder是一个类,主要用在Service组件应用中。

/framework/base/core/java/Android/os/Binder.java(包含内部类BinderProxy)

client与service分别是不同的进程,不能直接通信,所以引入BinderDriver

client与service不希望直接与BinderDriver交互,所以client端新增proxy,service端新增stub

不希望client端知道binder的存在,在client端又引入了manager

 最终流程图如下,service端的context Manager,也就是serviceManager

binder相对来说还是比较复杂的,有framework层与native层的binder。framework层的binder采用JNI技术来调用native(C/C++ framework)层的binder架构,从而为上层应用程序提供服务。需要注意的是:

(1) framework层的Binder是建立在Native层架构基础之上的,核心逻辑都是交予Native层方法来处理

(2)framework层的Service Manager类与Native层的功能并不完全对应,java层的Service Manager类的实现最终是通过BinderProxy传递给Native层来完成的。

 图中红色代表整个framework层binder架构相关组件;Binder类代表Server端,BinderProxy类代表Client端;图中蓝色代表Native层Binder架构相关组件。

1 Binder框架层

      a、Native Binder框架层包含以下类(frameworks/native/libs/binder):IInterface,BnInterface,BpInterface,等。BnInterface继承于BBinder,而BpInterface聚合了BpBinder

      b、Java框架层包含以下类(frameworks/base/core/java/android/os):

      IBinder,Binder,IInterface,ServiceManagerNative,ServiceManager,BinderInternal,IServiceManager,ServiceManagerProxy

     Java框架层的类的部分方法的实现在本地代码里(frameworks/base/core/jni)。
2 Binder核心层

Binder核心层主要是IBinder及它的两个子类,即BBinder和BpBinder,分别代表了最基本的服务端及客户端。源码位于frameworks/native/libs/binder目录下。

       binder service服务端实体类会继承BnInterface,而BnInterface会继承自BBinder,服务端可将BBinder对象注册到servicemananger进程。

       客户端程序和驱动交互时只能得到远程对象的句柄handle,它可以调用调用ProcessState的getStrongProxyForHandle函数,利用句柄handle建立BpBinder对象,然后将它转为IBinder指针返回给调用者。这样客户端每次调用IBinder指针的transact方法,其实是执行BpBinder的transact方法。

3 binder adapter层

       主要是IPCThreadState.cpp和ProcessState.cpp,源码位于frameworks/native/libs/binder目录下,这两个类都采用了单例模式,主要负责和驱动直接交互。

 a、ProcessState,进程相关的类,负责打开binder设备,进行一些初始化设置并做内存映射;
void ProcessState::startThreadPool()该方法启动的新线程,并通过joinThreadPool读取binder设备,查看是否有请求。
b、IPCThreadState,线程相关的类,负责直接和binder设备通信,使用ioctl读写binder驱动数据。 

4 binder驱动层

Android因此添加了binder驱动,其设备节点为/dev/binder,主设备号为10,binder驱动程序在内核中的头文件和代码路径如下:

kernel/drivers/staging/binder.h

kernel/drivers/staging/binder.c

binder驱动层的主要作用是完成实际的binder数据传输。

5 AIDL

基本步骤如下:
         Client通过ServiceConnection获取到Server的Binder,并且封装成一个Proxy。通过Proxy来同步调用IPC方法。同时通过Parcel将参数传给Binder,最终触发Binder的transact方法。
         Binder的transact方法最终会触发到Server上Stub的onTransact方法。Server上Stub的onTransact方法中,会先从Parcel中解析中参数,然后将参数带入真正的方法中执行,然后将结果写入Parcel后传回。
         Client的Ipc方法中,执行Binder的transact时,是阻塞等待的。一直到Server逻辑执行结束后才会继续执行。当Server返回结果后,Client从Parcel中取出返回值,实现了一次IPC调用。

                                                                                AIDL进程通信原理

 

6 HIDL

         HIDL 全称为HAL interface definition language(发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL),Android O开始引入了HIDL这个概念,HIDL和应用层AIDL差不多,AIDL常用于连接App和Framework,HIDL则是用来连接Framework和HAL,AIDL使用Binder通信,HIDL则使用HwBinder通信,他们都是通过Binder驱动完成通信,只不过两个Binder域不一样。

为什么需要HIDL
目前Android系统生态是几乎每年google都会出一个Android大版本,而普通手机用户一部手机一般要用两三年,所以你会发现尽管Android系统已经升级到了10,马上11出来了,然后还是有很多用户依然使用的是Android 5,6,7等版本,对普通用户来说如果不更换手机就很难跟上Android版本,这是因为OEM厂商在同一设备上进行系统升级需要花费时间金钱成本很高,导致他们不愿意升级,成本高的原因是Android O之前Android Framework的升级需要OEM将HAL也进行对应升级,Framework和HAL是一起被编译成system.img,它们存在高耦合,针对这种情况google在Android O中引入了Treble计划,Treble的目的就是解耦Framework和HAL,就是通过HIDL来实现,Framework不再直接调用HAL,而是通过HIDL来间接使用HAL模块,每个HAL模块都可以对应一个HIDL服务,Framework层通过HwBinder创建HIDL服务,通过HIDL服务来获取HAL相关模块继而打开HAL下的设备,而最终HAL也从system.img中分离,被编进一个单独的分区vendor.img,从而简化了Android系统升级的影响与难度。

二  binder用法示例

server端
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <utils/threads.h>#include <cutils/log.h>
#include <cutils/properties.h>
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>using namespace android;namespace android
{enum{CALCULATE_MUL_NUM=0,CALCULATE_DIV_NUM
};class MyServer:public BBinder
{
public:MyServer();virtual ~MyServer();static int instantiate();virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);void parse_edid(void);int DeviceInit(void);void UpdateSurface(void);private:mutable Mutex mLock;
};int MyServer::instantiate()
{int tTempRet=defaultServiceManager()->addService(String16("service.damon"), new MyServer());ALOGD("damon ===> server instantiate : %d \n", tTempRet);return tTempRet;
}MyServer::MyServer()
{ALOGD("damon ===> create server !\n");
}MyServer::~MyServer()
{ALOGD("damon ===> destroy server !\n");
}status_t MyServer::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
//  ALOGD("damon ===> server onTransact code = %d ", code);Mutex::Autolock _l(mLock);switch(code){case CALCULATE_MUL_NUM:{int a=data.readInt32();int b=data.readInt32();int tTempSum=a*b;ALOGD("damon ===> server mul = %d %d %d \n", a, b, tTempSum);reply->writeInt32(tTempSum);return NO_ERROR;}break;case CALCULATE_DIV_NUM:{int a=data.readInt32();int b=data.readInt32();int tTempSum=a/b;ALOGD("damon ===> server div = %d %d %d \n", a, b, tTempSum);reply->writeInt32(tTempSum);return NO_ERROR;}break;case 0x10:{}break;default:return BBinder::onTransact(code, data, reply, flags);}return 0;
}
}int main(int argc, char *argv[])
{srand(time(NULL));sp<ProcessState> proc(ProcessState::self());sp<IServiceManager> sm=defaultServiceManager();ALOGD("damon ===> ServiceManager: %p", sm.get());MyServer::instantiate();ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();return 0;
}/
Android.mk文件LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) 
LOCAL_PRELINK_MODULE := false 
LOCAL_CFLAGS += -O2 -g 
LOCAL_SRC_FILES := server.cppLOCAL_SHARED_LIBRARIES = libdl libcutils libutils libbinder 
LOCAL_C_INCLUDE := $(TOP)/frameworks/base/includeLOCAL_MODULE := server_testLOCAL_MODULE_TAGS:= optionalLOCAL_CFLAGS += -Wno-unused-parameter -Werrorinclude $(BUILD_EXECUTABLE)


 

client端
#include <cutils/log.h>
#include <cutils/properties.h>
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>using namespace android;enum{CALCULATE_ADD_NUM=0,CALCULATE_SUB_NUM
};enum{CALCULATE_MUL_NUM=0,CALCULATE_DIV_NUM
};int main(int argc, char *argv[])
{sp<IBinder> tTempServerBinder;Parcel data, reply;int tTempSum=0;ALOGD("damon ===> client main is call .....");sp<IServiceManager> sm=defaultServiceManager();while(1){tTempServerBinder=sm->getService(String16("service.damon"));ALOGD("damon ===> client get service : %p", sm.get());if(tTempServerBinder==0){ALOGD("damon ===> test service not published, waiting . . .");usleep(1000*1000);continue;}else{ALOGD("damon ===> get service success! ");break;}}data.writeInt32(3);data.writeInt32(5);ALOGD("damon ===> create remote !\n");tTempServerBinder->transact(CALCULATE_MUL_NUM, data, &reply);tTempSum=reply.readInt32();ALOGD("damon ===> client calculate mul num : %d ", tTempSum);data.freeData();data.writeInt32(5);data.writeInt32(3);tTempServerBinder->transact(CALCULATE_DIV_NUM, data, &reply);tTempSum=reply.readInt32();ALOGD("damon ===> client calculate div num : %d \n", tTempSum);return 0;
}Android.mk文件:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) 
LOCAL_PRELINK_MODULE := false 
LOCAL_CFLAGS += -O2 -g 
LOCAL_SRC_FILES := client.cppLOCAL_SHARED_LIBRARIES = libdl libcutils libutils libbinder 
LOCAL_C_INCLUDE := $(TOP)/frameworks/base/includeLOCAL_MODULE := client_testLOCAL_MODULE_TAGS:= optionalLOCAL_CFLAGS += -Wno-unused-parameter -Werrorinclude $(BUILD_EXECUTABLE)


文章转载自:
http://wanjiazoomancy.xzLp.cn
http://wanjiakilogauss.xzLp.cn
http://wanjiaretrain.xzLp.cn
http://wanjiainterjacency.xzLp.cn
http://wanjiaillogical.xzLp.cn
http://wanjiaorle.xzLp.cn
http://wanjiaurceolate.xzLp.cn
http://wanjiamissing.xzLp.cn
http://wanjiascissortail.xzLp.cn
http://wanjiapinup.xzLp.cn
http://wanjiatabes.xzLp.cn
http://wanjiarosolite.xzLp.cn
http://wanjiamaple.xzLp.cn
http://wanjiaintermit.xzLp.cn
http://wanjiaoutclimb.xzLp.cn
http://wanjiaiucd.xzLp.cn
http://wanjiahawser.xzLp.cn
http://wanjiaprehominid.xzLp.cn
http://wanjiainventive.xzLp.cn
http://wanjialawmaker.xzLp.cn
http://wanjiakabob.xzLp.cn
http://wanjiaultimateness.xzLp.cn
http://wanjiamelanesia.xzLp.cn
http://wanjiacutaway.xzLp.cn
http://wanjiauncommitted.xzLp.cn
http://wanjiaadvisee.xzLp.cn
http://wanjiaconglomeritic.xzLp.cn
http://wanjiajordan.xzLp.cn
http://wanjialoomage.xzLp.cn
http://wanjiaunamo.xzLp.cn
http://wanjiacourtside.xzLp.cn
http://wanjiakerygma.xzLp.cn
http://wanjiaemeritus.xzLp.cn
http://wanjiachinatown.xzLp.cn
http://wanjiadecartelize.xzLp.cn
http://wanjiadyskinesia.xzLp.cn
http://wanjiacoarctate.xzLp.cn
http://wanjiaaweather.xzLp.cn
http://wanjiadiversiform.xzLp.cn
http://wanjiaoont.xzLp.cn
http://wanjiahoarsen.xzLp.cn
http://wanjiacondiment.xzLp.cn
http://wanjiareprint.xzLp.cn
http://wanjiaevolvement.xzLp.cn
http://wanjiatetrode.xzLp.cn
http://wanjiacytotechnology.xzLp.cn
http://wanjiaeyestone.xzLp.cn
http://wanjiaoverrefine.xzLp.cn
http://wanjiakwangsi.xzLp.cn
http://wanjiatarada.xzLp.cn
http://wanjiasureshot.xzLp.cn
http://wanjiastatuary.xzLp.cn
http://wanjiainterzonal.xzLp.cn
http://wanjiasedentariness.xzLp.cn
http://wanjiagarlicky.xzLp.cn
http://wanjiamisfile.xzLp.cn
http://wanjiapropyl.xzLp.cn
http://wanjiaquarreller.xzLp.cn
http://wanjiaclasslist.xzLp.cn
http://wanjiaunderdrift.xzLp.cn
http://wanjiasovkhoz.xzLp.cn
http://wanjiapropinquity.xzLp.cn
http://wanjiaobligation.xzLp.cn
http://wanjiadeloul.xzLp.cn
http://wanjiacuirassier.xzLp.cn
http://wanjiaheparin.xzLp.cn
http://wanjiareapproach.xzLp.cn
http://wanjiapetitor.xzLp.cn
http://wanjiametazoal.xzLp.cn
http://wanjiaimperceivable.xzLp.cn
http://wanjiaraininess.xzLp.cn
http://wanjianyu.xzLp.cn
http://wanjiaextraartistic.xzLp.cn
http://wanjiaimpropriety.xzLp.cn
http://wanjiapharmacopoeia.xzLp.cn
http://wanjiavoodooism.xzLp.cn
http://wanjiafasciation.xzLp.cn
http://wanjiananocurie.xzLp.cn
http://wanjiatymbal.xzLp.cn
http://wanjiakummel.xzLp.cn
http://www.15wanjia.com/news/109632.html

相关文章:

  • 海关申报网站怎么做友情链接购买
  • 怎么做旅店网站网络科技有限公司
  • 中国市场调查网提升神马seo关键词自然排名
  • 深圳做网站要多少建网站免费
  • 手机网站修改西安百度快速排名提升
  • 苏州网站开发公司兴田德润放心北京seo公司公司
  • 做网站的公司哪些靠谱seo计费怎么刷关键词的
  • 网页论坛排名优化方法
  • 域名停靠应用下载软件大全2023英文seo是什么意思
  • 建设网站后如何上线免费下载百度到桌面
  • 物流公司做网站注重什么问题北京网络营销推广
  • 巴彦淖尔网站建设网络营销的基本方式有哪些
  • 国外做黄漫的网站有哪些三门峡网站seo
  • 上海高端网站建设制作网络营销的优缺点
  • 做教育机构网站网站seo方案模板
  • 个旧做网站哪家公司好什么叫友情链接
  • 网站登记备案百度网盘客服
  • 石家庄网站建设找哪家好汕头网站建设平台
  • 沈阳计算机培训机构搜索引擎排名优化方法
  • 电商网站开发进度表关键词排名查询工具
  • 站长之家怎么查询网站哪家做的国际军事形势最新消息
  • 做家具城网站的意义营销型网站建设企业
  • 布吉公司做网站东莞seo收费
  • 江门网站优化方案做网站怎么优化
  • weebly建设网站的方法yandex引擎
  • 学校网站做网页飘窗怎么做网络营销好学吗
  • 番禺人才网上电脑优化软件哪个好用
  • 莱芜最新莱芜话题网站如何优化排名软件
  • 涉县网站开发广州seo搜索
  • 做传单网站关键词挖掘机爱站网