barriers / 阅读 / 详情

请问歌华(机电盒)怎么看CHC家庭影院的回放呢?

2023-06-17 23:13:26
TAG: chc
共1条回复
可可

就是6月7号开始一模一样的~以前是不一样的!6月7号的时候还能看出CHC家庭影院的节目和下面的节目单不一致~今天到好~两频道的节目单都一样了~真tm无耻!!!

相关推荐

chc动作电影频道的开通

2006年4月27日,由国家广电总局电影频道节目中心开办的“CHC高清电影频道”和“CHC动作电影频道”两个全新的付费电影频道正式进行试播。
2023-06-17 14:54:101

chc高清电影介绍 chc高清电影资料

1、《CHC高清电影》频道是全国唯一一个专业播放电影的高清频道。 2、2006年4月,为满足广大付费电视订户个性化和专业化的收视诉求,由国家广电总局电影频道节目中心(CCTV-6)开办的《CHC高清电影》频道应运而生。 3、在节目的编排上,《CHC高清电影》频道将秉承电影频道节目中心在电影资源上的优势,每天上午9:00开始,连续播出18小时。每晚21:30黄金时间推出一部重点影片,每周日同一时间推荐一部重量级院线大片。
2023-06-17 14:54:441

为什么我的CHC高清电影只有2.0声道,而不是5.1?

我家的机顶盒HDMI到电视,再从电视HDMI ARC回传到功放,只有2声道;但是机顶盒直接光纤到功放,有5.1声道。
2023-06-17 14:55:134

chc高清频道和chc家庭影院有什么区别,chc家庭影院也是高清吗?

《CHC家庭影院》频道以故事片为主,突出新片、大片,每天一部新片国内首播,世界各国电影精彩纷呈,适合全家老少共同收看; 《CHC高清电影》频道是中国唯一一个全高清的电影频道,无论从音质、画质都是其他高清频道无可比拟的,全程杜比5.1环绕立体声以及16:9的高清画质,真实还原电影场景,带给您身临其境的影音享受。chc家庭影院也是高清
2023-06-17 14:55:221

CHC高清电影这个频道怎么样

好像有不用付费的
2023-06-17 14:56:463

CHC动作电影?

?什么意思?
2023-06-17 14:57:102

chc动作电影2016年1月12日节目单

92频道动作影院在2018年1月12日晚到演的啥
2023-06-17 14:57:352

dividers for binder 是什么意思?

Dividers 名词 隔板。for介词 为。 binder 名词 粘接剂。合起来意思是: 供粘接剂用的隔板。
2023-06-17 14:56:382

darling in the franz中文是什么意思

你好,高兴为你回答。请采纳,谢谢!!darling in the franz在弗朗兹的亲爱的但是franz是个人名, 说in the franz很奇怪
2023-06-17 14:56:451

Binder文档中的 “Binder通信是同步而不是异步”,如何理解?

binder通信是阻塞的,发出方要一直等到接收方的回复。
2023-06-17 14:56:461

binder和adhesive的区别

binder n. 粘合剂; 包扎物,包扎工具; [法] 临时契约; 装订工 adhesive n. 黏合剂,粘着剂; adj. 可黏着的,黏性的;
2023-06-17 14:56:551

Android-zygote进程通信为什么不使用Binder?

首先,zygote进程在创建之后,才会创建SystemServer进程,而SystemServer进程是由zygote进程fock自身得到的,在fock自身的过程中,首先会结束自身的其他子线程,这样一来除了自身线程以外,其他线程都会被结束然后GC,而Binder是多线程模型,如果使用Binder进行进程间通信的话,则Binder线程也会被结束,而使用Binder进行进程间通信就无法做到。在fork新进程后,启动Zygote的4个Daemon线程,java堆整理,引用队列,以及析构线程。而在zygote通过fock自身创建子进程之后,如果该进程不是zygote进程,则会调用ZygoteInit.zygoteInit方法 而在zygoteInit方法中,才会对新创建的进程进行运行环境初始化工作以及启动Binder线程池。 其实Binder线程池的启动,是在SystemServer进程创建过程启动的,而在启动SystemServer的过程中,就需要传入ZygoteServer这个Zygote作为Server端的Socket,所以Zygote进程并不能使用Binder进程进行通信,而只能使用Socket。 而且,Binder线程池是在zygote进程启动之后启动的SystemServer进程中启动的,而SystemServer进程是由zygote进程fock自身得到的,所以zygote进程在启动之后,循环等待SystemServer进程的消息的时候,其实还没有Binder线程池。而且fock只支持当前线程的fock,而不支持多线程的fock,但是Binder又是一个多线程模型,在fock的时候会杀死多余的线程,这样一来,binder线程也就会被杀死,这样就没办法使用binder与SystemServer进程进行进程间通信。 fork 的行为是这样的:复制整个用户空间的数据(通常使用 copy-on-write 的策略,所以可以实现的速度很快)以及所有系统对象,然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的
2023-06-17 14:57:021

Binder NDK接口介绍

从android Q开始,binder添加了ndk使用的接口,相关使用接口示例如下: iface.h iface.cpp 使用 为什么要引入binder ndk的接口呢? 答案很简单就是使用简单。像iface.h和iface.cpp 这两个文件完全可以通过aidl文件自动生成,接口使用简单,ABI稳定。谷歌相关的commit log
2023-06-17 14:57:211

急!!!求不二周助DARLING歌词,只有日文也行,好的加分!

南风に乗って 高く空の向こうへ青い夏 追いかけて Darling暑けりゃ脱いじゃえばいいイライラ忧郁を全部今日くらい惰性で生きてもいいんじゃない都会は渋滞してる366日今すぐ抜け出して行こう海へ!君の嬉しそうな 笑颜が好きさ仆たちの夏だね南风に乗って 高く空の向こうへ青い夏 追いかけて耳をすませばもっと 感じるこの世界で君の答えを 闻かせてね Darling涙は嬉し时も悲しい时にも流れるそれって深いと思うんだけど…あれっ?空からこぼれてる 光に心もってかれそうだよ南风に乗って BIG WAVE 飞び越えてまた夏がやってくる灼けるくらいにもっと 近づくて欲しいからこの夏の日を 抱きしめて Darling 南风に乗って 高く空の向こうへ青い夏 追いかけて耳をすませばもっと 感じるこの世界で君の答えを 闻かせてね南风に乗って BIG WAVE 飞び越えてまた夏がやってくる灼けるくらいにもっと 近づくて欲しいからこの夏の日を 抱きしめて Darling
2023-06-17 14:57:344

范晓萱的《Darling》 歌词

Darling演唱:范晓萱每当你叫我 darling 这字眼给我信心因为这就表示我目前是你的唯一每当你叫我 darling我就必须相信你说的花言巧语和设的温柔陷阱oh ! darlingi love you oh ! darlingi believe you oh ! darlingi hate darlingbut i need you每当你向我靠近我就不能抗拒你下的温柔命令因为我害怕失去每次你一不想听我就不能生气这一场爱情游戏我对你充满怀疑oh ! darling你的魅力 oh ! darling可不可以 oh ! darling我不想听 oh ! darling这问题oh ! darlingi love you oh ! darlingi believe you oh ! darlingi hate darling but i need youhttp://music.baidu.com/song/221198
2023-06-17 14:57:421

捆绑机病毒是什么

不是但是捆绑机一般就是用于病毒制作,所以会被一些杀毒软件给拦截了一些正规的捆绑机软件也有不过他做出来的捆绑软件不会在后台进行安装,需进同意后才会进行安装。
2023-06-17 14:57:422

Android里用 C 语言编写的应用程序怎么通过 binder 节点通信

  我不懂你的意思,什么叫C程序?你要直接call binder driver么?如果只是想在native layer里通过servicemanager 注册一个service,然后用client 去call,我过去用过这个github的project去测android binder的readwrite performance:  mcr/Android-HelloWorldService · GitHub  然后你要想办法把service run 起来,我当时很hack,直接在zygote里改了代码,强行让helloworld在系统init的时候生成,但应该有命令行给你用的,你可以在看看。  而去直接去和binder driver做交互也没问题,只要做几个ioctl call,然后起两个process,一个注册一个节点,然后另一个去写message,但我没具体实现过,你玩玩应该就出来了,我感觉过程可能就像这个shmget的example差不多 IPC:Shared Memory。  此外,Binder这东西没什么独特的,它就是把最基本的message passing:一次传输要向kernel copy paste两次(一次sender 到kernel,一次kernel到receiver,每次都有context switch)和shared memory(kernel 和 userland share 一块 内存,不用context switch)合并起来了,就是receiver和kernel共享一块内存,而sender和kernel的交互必须要严格遵守message passing的原则,于是就取了一个折中,两次copy paste就变成了一次。  此外,service manager会在自己被生成的时候现将自己注册成binder里一个最特殊的service,其他程序想要进行ipc,就必须通过binder向service manager注册,在binder生成一个unique id,然后其他client向service manager查询时候就会得到那个id,于是就能通过binder与service process建立通讯。  我过去很喜欢玩这个,还很蛋疼的在minix上把binder原理实现了一遍,还有一个大神 老罗,他研究Android native非常透彻,你可以看他博客,能够对整个Android从init到Dalvik跑起来全部了解,我现在只知道他一个,因为他把Android source code全都读了一遍:老罗的Android之旅  
2023-06-17 14:57:511

android中Boundservice和 IBinder 还有Binder这三者有什么联系和区别???

IBinder 就是绑定服务的方式启动服务,即服务可以通过Binder与启动service的类通信用的。
2023-06-17 14:57:592

chaumet怎么读

1、Chaumetn.尚美。2、[例句]In2007,sheisdeclaredasTheArtistoftheYearbyChaumetInternationalofFranceandTheKoreanArtistsAssociation.2007年,她被著名的珠宝商法国尚美国际公司和韩国艺术家协会推举为「本年度之艺术家」。
2023-06-17 14:57:591

android Service中自定义的Binder如何操作service中的handler

你描述不清出。至少我没看清楚。我尝试按照我自己对你描述的问题的理解来作答。binder.taskExecute()里头你没有涉及到“系统通知栏”的代码,所以当然没有变化!!!其次,你对于handler的理解有错误。我粗粗点下:thread A和thread B。A有B的Handler从而能和B通过Handler沟通。B也有A的Handler。当然,这个Handler都是在A或者B构造函数的时候传进去的(例如A exampleA = new A(B"s handler);)至于两个thread如何根据handler沟通?通过Message来沟通。线程A和B都有一个message queue(消息队列)。你构建一个message实例,然后将它加入到(此处具体化,例如放入B里头)线程的message queue里头中。这样线程(从队列里读一条处理一条就可以处理到你加入的Message,用Handler的handleMessage来处理)。(下面用aHandler,bHandler分别表示thread A的handler和B的hanler。)所以aHandler.sendEmptyMessage(int what)就是在添加一只带有what值的Message到A里头。bHandler....类似。所以,假设我现在是A,我为了告诉B一些东西,我就将我要告诉的B的东西(信息)放入到一个Message中,再将这个Message加入到B的消息队列中。(譬如你此问中,需要将“下载完成”“下载失败”这些信息添加进入message里头)。然后这个message怎么加入到B的消息的队列呢?这就是为什么要在A的构造函数里头传入B的Handler(bHandler)一个引用的原因。对于你的需求,Handler和Binder功能重复了。要么用Binder,要么用Handler。至于想在一个activity中调用自定义Binder里头的一个方法,不需要发送消息。只需要在需要调用的地方实例化一个Binder,然后通过这个实例.functionYouNeeded()就行。欢迎追问。
2023-06-17 14:58:071

日本的darling 是什么意思

亲爱的,英文的darling 就是他啊,意思一样的
2023-06-17 14:58:112

安卓系统的binder通信机制和intent通信机制的不同之处

它们都是串行通讯是没错的,区别I2C同步传送,也没是说每传一位都要一个同步时钟脉冲(脉冲是SCL发出),接收和发送数据都是用SDA,UART则不需要同步时钟脉冲,UART则是通过TXD发,RXD收,它是通过设置好一个固定通讯速率传送数据的,这个速率就是我们所说的波特率了。我相信楼主现在应该明白了哦!
2023-06-17 14:58:151

男生叫女生darling是什么意思

意思是亲爱的,心爱的,爱人。Darling是英文单词darling的音译,意思是亲爱的,心爱的,爱人。一般是情人或夫妻的称谓,口语化。类似的词还有宝贝,蜂蜜等等。另外,有个电商APP的名字也叫达令,主要卖世界各地的精品。亲爱的是什么意思?Darling是英文单词Darling的音译,意思是亲爱的,心爱的,爱人。一般是情人或者夫妻的称谓,口语化。蒋介石和他的妻子是众所周知的称对方为亲爱的人。其他类似Darling的词还有baby,honey等。是恋爱中恋人常用的。可以被男朋友用来叫女朋友,或者女朋友用来叫男朋友。
2023-06-17 14:58:181

Android Binder Hook的实现

Binder Hook可以Hook掉 当前App 用到的系统Service服务。 以LocationManager为例,在获取一个LocationManager时分为两步。第一,获取IBinder对象;第二:IBinder对象通过asInterface()转化为LocationMangerService对象。最后初始化LocationManager,application层用到的都是LocationManager。 Hook的大致原理是:ServiceManager在获取某个Binder时,如果本地有缓存的Binder,就不再跨进程请求Binder了。我们可以在缓存中加入自己的Binder,使得ServiceManager查询本地缓存时得到一个自定义的CustomBinder对象,不再跨进程向系统请求。并且ILocationManager.Stub.asInterface(CustomBinder)方法返回我们自定义的Service对象。 这里面有两个地方需要用到自定义的对象。由于我们只Hook其中一部分的功能,其他功能还需要保留,所以用动态代理的方式创建自定义的Binder和自定义的Service。 在理解后面的内容前你需要了解这些知识点: Activity等类在获取系统Service时,都是调用getSystemService(serviceName)方法获取的。 Context 的 getSystemService() 方法调用了 SystemServiceRegistry 的 getSystemService() 方法。 SystemServiceRegistry 中有一个常量 SYSTEM_SERVICE_FETCHERS,这是一个Map。保存了ServiceName和对应的ServiceFetcher。ServicFetcher是用于创建具体Service的类。ServiceFetcher 的关键方法是 createService() 方法。 在 ServiceFetcher 的 createService() 方法中,调用了 ServiceManager.getService(name) 方法。以 LocationManager 对应的 ServiceFetcher 为例,它的createService()方法源码如下: 假如我们要修改 LocationManager 的 getLastKnownLocation() 方法(下文都是)。我们要做的就是让ServiceManager.getService("location")返回我们自定义的Binder。先看一下这个方法简化后的源码: sCache是一个Map,缓存了已经向系统请求过的Binder。如果我们需要让这个方法返回我们我们自己的binder,只需要事先往sCache中put一个自定义的Binder就行了。 在put之前,需要先创建出一个自定义的Binder。这个Binder在被 ILocationManager.Stub.asInterface 处理后,可以返回一个自定义的 LocationManagerService。 先看一下Binder的 asInterface() 的实现: 如果把 queryLocalInterface()方法返回一个自定义的Service,使得走if语句内部,不走else,那就算是Hook成功了。 假设我们想让系统的LocationManager返回的位置信息全是在天安门(116.23, 39.54)。那我们需要使得 LocatitionManagerService 的 getLastLocation() 方法 返回的全是 (116.23, 39.54)。 由于我们不能直接拿到系统的这个Service对象,可以先用反射的方式拿到系统的LocationManagerService。然后拦截getLastLocation()方法。 原生的Binder对象在调用 queryLocalInterface() 方法时会返回原生的Service对象。我们希望返回3.1中的自定义Service。所以这里拦截 queryLocalInterface() 方法。 有了自定义的Binder后,将它注入到ServiceManger的sCache变量中就完成Hook了~ 当onClick被调用的时候,Toast和Log都会显示天安门的坐标(116.23, 39.54)。证明Hook成功! 你甚至可以用Binder Hook的方式Hook掉 ActivityManager 。
2023-06-17 14:58:231

dear和darling有什么区别

一个是书面语,一个是口语
2023-06-17 14:58:265

加拿大的纸和binder 都是什么规格的?

纸啊,问什么纸啊,放在BINDER里面的是三个孔,一般学校有打孔机,可以自己打。binder也使三孔的。确实便宜,1dollar多一点就可以买到。如果问打印纸,216X279mm的。
2023-06-17 14:58:332

frances covered her face with a veil

不是面罩,是伊斯兰那些民族用的那种遮脸的,具体叫什么。。。
2023-06-17 14:58:382

如何在Android下使用Binder

  实现一个binder通信实例,需要经过以下步骤:  (1)获得ServiceManager的对象引用  (2)向ServiceManager注册新的Service  (3)在Client中通过ServiceManager获得Service对象引用  (3)在Client中发送请求,由Service返回结果。  下面看具体的代码如何实现。  3.1 libmyservice代码实现  (1)新建目录frameworks/base/myservice/libservice,进入该目录  view plain  $ cd frameworks/base  $ mkdir myservice  $ cd myservice  $ mkdir libmyservice  $ cd libmyservice  (2)编写libmyservice/myservic.h文件  view plain  #include <utils/threads.h>    #include <utils/RefBase.h>    #include <binder/IInterface.h>    #include <binder/BpBinder.h>    #include <binder/Parcel.h>        namespace android {    class MyService : public BBinder    {    mutable Mutex mLock;    int32_t mNextConnId;    public:    static int instantiate();    MyService();    virtual ~MyService();    virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);    };    }; //namespace  (2)编写libservice/myservice.cpp文件  view plain  #include "myservice.h"    #include <binder/IServiceManager.h>    #include <binder/IPCThreadState.h>        namespace android {        static struct sigaction oldact;    static pthread_key_t sigbuskey;        int MyService::instantiate()    {    LOGE("MyService instantiate");    // defaultServiceManager ()获得ServiceManager的对象引用,addService()可向ServiceManager注册新的服务    int r = defaultServiceManager()->addService(String16("android.myservice"), new MyService());    LOGE("MyService r = %d/n", r);    return r;    }        MyService::MyService()    {    LOGV("MyService created");    mNextConnId = 1;    pthread_key_create(&sigbuskey, NULL);    }        MyService::~MyService()    {    pthread_key_delete(sigbuskey);    LOGV("MyService destroyed");    }    // 每个系统服务都继承自BBinder类,都应重写BBinder的onTransact虚函数。当用户发送请求到达Service时,系统框架会调用Service的onTransact函数,该函数分析接收到的数据包,调用相应的接口函数处理请求    status_t MyService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)    {    switch(code)    {    case 0: {    pid_t pid = data.readInt32();    int num = data.readInt32();    num = num + 100;    reply->writeInt32(num);    return NO_ERROR;    }    break;    default:    return BBinder::onTransact(code, data, reply, flags);    }    }    }; //namespace  (3)编写libservice/Android.mk文件  view plain  # File: Android.mk  LOCAL_PATH := $(call my-dir)  include $(CLEAR_VARS)  LOCAL_SRC_FILES := myservice.cpp  LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)  LOCAL_SHARED_LIBRARIES := libutils libbinder  LOCAL_MODULE_TAGS := optional  LOCAL_PRELINK_MODULE := false  LOCAL_MODULE := libmyservice    include $(BUILD_SHARED_LIBRARY)  (4)编译libmyservice.so动态库  在android源码主目录下  view plain  $ source build/envsetup.sh    including device/htc/passion/vendorsetup.sh    including device/samsung/crespo4g/vendorsetup.sh    including device/samsung/crespo/vendorsetup.sh      $ mmm frameworks/base/myservice/libmyservice/  编译成功后生成文件:out/target/product/generic/system/lib/libmyservice.so
2023-06-17 14:58:541

chaumet是什么牌子

chaumet是尚美巴黎。Chaumet尚美巴黎,由尼铎创始于1780年的巴黎。尼铎完成学徒训练,开设了自己的第一间珠宝店,并逐渐获得名媛贵族们的忠实拥簇,这就是尚美巴黎最早的雏形。尼铎先生是一位远见卓识的珠宝商,他完美地将令人眩目珠宝与拿破仑神话结合起来,因此创始人尼铎被称为拿破仑的御用珠宝匠,尚美巴黎(CHAUMET)也成为了拿破仑一世官方珠宝供货商。尚美巴黎简介尚美巴黎(CHAUMET)被称为皇家珠宝,不仅是因为其珠宝深受皇廷贵族和明星名流的喜爱,还因为尚美巴黎追求的就是尽善尽美,其不仅有奢靡华美之风,更在历史的洗涤中,逐渐沉淀,蜕变,称为精华中的精华。尚美巴黎(CHAUMET)承载着两个多世纪的历史底蕴,是被誉为“蓝血贵族”的法国珠宝及奢华腕表品牌,每一件饰品都如艺术品般璀璨,工艺精美,珠宝时尚。后来尚美巴黎成为奢侈品集团,LVMH路威酩轩集团旗下历史悠久的珠宝设计世家。LVMH集团为她铺就遍布全球的销售网点,令CHAUMET逐渐为全世界珍爱美好人士渴望与追逐的华美珠宝。
2023-06-17 14:58:551

FrancescoDeGregori是哪里人

FrancescoDeGregoriFrancescoDeGregori是一名演员,其代表作品有《现场八方演唱会》《失去的爱》等。外文名:FrancescoDeGregori职业:演员合作人物:NickHopkin代表作品:《现场八方演唱会》
2023-06-17 14:56:301

darling为什么叫国家队?

因为这部动漫的制作团队的成员,全部都是圈内的知名人员,无论是编剧,美术制作,分镜,或者剧本,都是日本国内最优秀最顶级的人,所以才叫做国家队。加上大家对于这部动漫的高要求已经完全达到了国家级别的层面。darlingin是最近一两年爆火的动漫剧,刚开始在日本播出的时候,立刻就掀起了一阵高收视热潮,而且darlingin一直被称作国家队,原因也很简单,因为觉得制作这部动漫的人都太优秀,全部都是国内顶级的人员,顶级编剧,顶级美术制作,顶级分镜,顶级剧本。完全就像一个国家队的标准,因此人们开始叫darlingin国家队。darlingin的故事背景放在了遥远的未来,在剧情中有很多科幻情节,以及不存在于现实世界的发展和科技。这部动漫的适合人群很广泛,适合动漫爱好者,适合中学生,以及二三十岁的上班族,如果四十几岁的人依然想找回自己的初心和梦想,那么也可以看,总之可以说老少皆宜。
2023-06-17 14:56:301

Android IPC机制 Binder

u2003每次 单向通信 拷贝次数为 1,server用户空间和内核空间通过内存映射可以直接交互。 u2003内核4M 上层限制1m-8k(传输Bitmap过大,就会崩溃的原因,Activity之间传输BitMap)。 u2003 《Android 基础组件 全家桶》 u2003 进程间通信IPC 为什么 Android 要采用 Binder 作为 IPC 机制? Android-Binder机制 Android Bander设计与实现 - 设计篇 Android跨进程通信:图文详解 Binder机制 原理 听说你Binder机制学的不错,来面试下这几个问题(一) Binder学习指南 Android中的Binder机制二(匿名Binder)
2023-06-17 14:56:291

FrancesPerkins是什么职业

FrancesPerkins外文名:FrancesPerkins职业:演员代表作品:《罗斯福家族百年史》合作人物:KenBurns电视剧作品
2023-06-17 14:56:231

FrancesConley多大了

FrancesConleyFrancesConley,是一名演员,主要作品有《大钟》、《TheRoyRogersShow》。外文名:FrancesConley职业:演员代表作品:《大钟》合作人物:约翰·法罗
2023-06-17 14:56:161

华为手机binder是病毒吗

不是。那个是华为云为你提供binder的精选文章等,同时提供包含binder相关的软件资源、产品活动、最佳实践以及常见问题文档等信息。工作原理:手机中的软件,嵌入式操作系统(固化在芯片中的操作系统,一般由 JAVA、C++等语言编写),相当于一个小型的智能处理器,所以会遭受病毒攻击。而且,短信也不只是简单的文字,其中包括手机铃声、图片等信息,都需要手机中的操作系统进行解释,然后显示给手机用户,手机病毒就是靠软件系统的漏洞来入侵手机的。手机病毒要传播和运行,必要条件是移动服务商要提供数据传输功能,而且手机需要支持Java等高级程序写入功能。许多具备上网及下载等功能的手机都可能会被手机病毒入侵。传播方式:利用蓝牙方式传播:“卡波尔”病毒会修改智能手机的系统设置,通过蓝牙自动搜索相邻的手机是否存在漏洞,并进行攻击。感染PC上的手机可执行文件:“韦拉斯科”病毒感染电脑后,会搜索电脑硬盘上的SIS可执行文件并进行感染。利用MMS多媒体信息服务方式来传播:。利用手机的BUG攻击:这类病毒一般是在便携式信息设备的“ EPOC”上运行,如“EPOC-ALARM”、“EPOC-BANDINFO.A”、“EPOC-FAKE.A”、“EPOC-GHOST.A”、“EPOC-ALIGHT.A”等。
2023-06-17 14:56:161

FrancesDunn出生于哪里

FrancesDunnFrancesDunn是一名演员,主要作品有《不义之财》。外文名:FrancesDunn职业:演员代表作品:《不义之财》合作人物:朱迪丝·安德森
2023-06-17 14:56:081

binder综合症国内比例

8:2。Binder综合症”又称先天性中面部凹陷,通俗点说就是中面部及鼻部在不同程度上发育不良,且这类病症在东方人中的发病率不算低,有研究人员称在我国发病比例在8:2;且这种病是遗传的,97例binder综合征的患儿进行研究,发现存在确切家族史的患者比率高达36%。
2023-06-17 14:56:081

12 Binder原理-基础知识点

Binder原理是掌握系统底层原理的基石,也是进阶高级工程师的必备知识点,这篇文章不会过多介绍Binder原理,而是讲解学习Binder前需要的掌握的知识点。 IPC全名为inter-Process Communication,含义为进程间通信,是指两个进程之间进行数据交换的过程。在Android和Linux中都有各自的IPC机制,这里分别来介绍下。 Linux中提供了很多进程间通信机制,主要有管道(pipe)、信号(sinal)、信号量(semophore)、消息队列(Message)、共享内存(Share Memory)、套接字(Socket)等。 管道 管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。管道的主要思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。这个共享文件比较特殊,它不属于文件系统并且只存在于内存中。另外还有一点,管道采用的是半双工通信方式的,数据只能在一个方向上流动。 简单的模型如下所示。 信号 信号是软件层次上对中断机制的一种模拟,是一种异步通信方式,进程不必通过任何操作来等待信号的到达。信号可以在用户空间进程和内核之间直接交互,内核可以利用信号来通知用户空间的进程发生了哪些系统事件。信号不适用于信息交换,比较适用于进程中断控制。 信号量 信号量是一个计数器,用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。主要作为进程间以及同一进程内不同线程之间的同步手段。 消息队列 消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识,并且允许一个或多个进程向它写入与读取消息。信息会复制两次,因此对于频繁或者信息量大的通信不宜使用消息队列。 共享内存 多个进程可以直接读写的一块内存空间,是针对其他通信机制运行效率较低而设计的。 为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大的提高效率。 套接字 套接字是更为基础的进程间通信机制,与其他方式不同的是,套接字可用于不同机器之间的进程间通信。 Android系统是基于Linux内核的,在Linux内核基础上,又拓展出了一些IPC机制。Android系统除了支持套接字,还支持序列化、Messenger、AIDL、Bundle、文件共享、ContentProvider、Binder等。Binder会在后面介绍,先来了解前面的IPC机制。 序列化 序列化指的是Serializable/Parcelable,Serializable是Java提供的一个序列化接口,是一个空接口,为对象提供标准的序列化和反序列化操作。Parcelable接口是Android中的序列化方式,更适合在Android平台上使用,用起来比较麻烦,效率很高。 Messenger Messenger在Android应用开发中的使用频率不高,可以在不同进程中传递Message对象,在Message中加入我们想要传的数据就可以在进程间的进行数据传递了。Messenger是一种轻量级的IPC方案并对AIDL进行了封装。 AIDL AIDL全名为Android interface definition Language,即Android接口定义语言。Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户端显然是不合适的。另外还有一点,Messenger用来进程间进行数据传递但是却不能满足跨进程的方法调用,这个时候就需要使用AIDL了。 Bundle Bundle实现了Parcelable接口,所以它可以方便的在不同的进程间传输。Acitivity、Service、Receiver都是在Intent中通过Bundle来进行数据传递。 文件共享 两个进程通过读写同一个文件来进行数据共享,共享的文件可以是文本、XML、JOSN。文件共享适用于对数据同步要求不高的进程间通信。 ContentProvider ContentProvider为存储和获取数据了提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的。ContentProvider底层实现也是Binder,但是使用起来比AIDL要容易许多。系统中很多操作都采用了ContentProvider,例如通讯录,音视频等,这些操作本身就是跨进程进行通信。 在讲到Linux的进程通信原理之前,我们需要先了解Liunx中的几个概念。 内核空间和用户空间 当我们接触到Liunx时,免不了听到两个词,User space(用户空间)和 Kernel space(内核空间),那么它们的含义是什么呢? 为了保护用户进程不能直接操作内核,保证内核的安全,操作系统从逻辑上将虚拟空间划分为用户空间和内核空间。Linux 操作系统将最高的1GB字节供内核使用,称为内核空间,较低的3GB 字节供各进程使用,称为用户空间。 内核空间是Linux内核的运行空间,用户空间是用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不会受到影响。内核空间的数据是可以进程间共享的,而用户空间则不可以。比如在上图进程A的用户空间是不能和进程B的用户空间共享的。 进程隔离 进程隔离指的是,一个进程不能直接操作或者访问另一个进程。也就是进程A不可以直接访问进程B的数据。 系统调用 用户空间需要访问内核空间,就需要借助系统调用来实现。系统调用是用户空间访问内核空间的唯一方式,保证了所有的资源访问都是在内核的控制下进行的,避免了用户程序对系统资源的越权访问,提升了系统安全性和稳定性。 进程A和进程B的用户空间可以通过如下系统函数和内核空间进行交互。 内存映射 由于应用程序不能直接操作设备硬件地址,所以操作系统提供了一种机制:内存映射,把设备地址映射到进程虚拟内存区。 举个例子,如果用户空间需要读取磁盘的文件,如果不采用内存映射,那么就需要在内核空间建立一个页缓存,页缓存去拷贝磁盘上的文件,然后用户空间拷贝页缓存的文件,这就需要两次拷贝。 采用内存映射,如下图所示。 由于新建了虚拟内存区域,那么磁盘文件和虚拟内存区域就可以直接映射,少了一次拷贝。 内存映射全名为Memory Map,在Linux中通过系统调用函数mmap来实现内存映射。将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间,反之亦然。内存映射能减少数据拷贝次数,实现用户空间和内核空间的高效互动。 了解Liunx中的几个概念后,就可以学习Linux的IPC通信原理了,如下图所示。 内核程序在内核空间分配内存并开辟一块内核缓存区,发送进程通过copy_from_user函数将数据拷贝到到内核空间的缓冲区中。同样的,接收进程在接收数据时在自己的用户空间开辟一块内存缓存区,然后内核程序调用 copy_to_user() 函数将数据从内核缓存区拷贝到接收进程。这样数据发送进程和数据接收进程完成了一次数据传输,也就是一次进程间通信。 Linux的IPC通信原理有两个问题: Binder是基于开源的OpenBinder实现的,OpenBinder最早并不是由Google公司开发的,而是Be Inc公司开发的,接着由Palm, Inc.公司负责开发。后来OpenBinder的作者Dianne Hackborn加入了Google公司,并负责Android平台的开发工作,顺便把这项技术也带进了Android。 Binder是基于内存映射来实现的,在前面我们知道内存映射通常是用在有物理介质的文件系统上的,Binder没有物理介质,它使用内存映射是为了跨进程传递数据。 Binder通信的步骤如下所示。 1.Binder驱动在内核空间创建一个数据接收缓存区。 2.在内核空间开辟一块内核缓存区,建立内核缓存区和数据接收缓存区之间的映射关系,以及数据接收缓存区和接收进程用户空间地址的映射关系。 3.发送方进程通过copy_from_user()函数将数据拷贝 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。 整个过程只使用了1次拷贝,不会因为不知道数据的大小而浪费空间或者时间,效率更高。 Android是基于Linux内核的 ,Linux提供了很多IPC机制,而Android却自己设计了Binder来进行通信,主要是因为以下几点。 性能方面 性能方面主要影响的因素是拷贝次数,管道、消息队列、Socket的拷贝次书都是两次,性能不是很好,共享内存不需要拷贝,性能最好,Binder的拷贝次书为1次,性能仅次于内存拷贝。 稳定性方面 Binder是基于C/S架构的,这个架构通常采用两层结构,在技术上已经很成熟了,稳定性是没有问题的。共享内存没有分层,难以控制,并发同步访问临界资源时,可能还会产生死锁。从稳定性的角度讲,Binder是优于共享内存的。 安全方面 Android是一个开源的系统,并且拥有开放性的平台,市场上应用来源很广,因此安全性对于Android 平台而言极其重要。 传统的IPC接收方无法获得对方可靠的进程用户ID/进程ID(UID/PID),无法鉴别对方身份。Android 为每个安装好的APP分配了自己的UID,通过进程的UID来鉴别进程身份。另外,Android系统中的Server端会判断UID/PID是否满足访问权限,而对外只暴露Client端,加强了系统的安全性。 语言方面 Linux是基于C语言,C语言是面向过程的,Android应用层和Java Framework是基于Java语言,Java语言是面向对象的。Binder本身符合面向对象的思想,因此作为Android的通信机制更合适不过。 从这四方面来看,Linux提供的大部分IPC机制根本无法和Binder相比较,而共享内存只在性能方面优于Binder,其他方面都劣于Binder,这些就是为什么Android要使用Binder来进行进程间通信,当然系统中并不是所有的进程通信都是采用了Binder,而是根据场景选择最合适的,比如Zygote进程与AMS通信使用的是Socket,Kill Process采用的是信号。 Binder机制在Android中的地位举足轻重,我们需要掌握的很多原理都和Binder有关: 上面只是列了一小部分,简单来说说,比如系统在启动时,SystemServer进程启动后会创建Binder线程池,目的是通过Binder,使得在SystemServer进程中的服务可以和其他进程进行通信了。再比如我们常说的AMS、PMS都是基于Binder来实现的,拿PMS来说,PMS运行在SystemServer进程,如果它想要和DefaultContainerService通信(是用于检查和复制可移动文件的系统服务),就需要通过Binder,因为DefaultContainerService运行在com.android.defcontainer进程。 还有一个比较常见的C/S架构间通信的问题,Client端的MediaPlayer和Server端的MeidaPlayerService不是运行在一个进程中的,同样需要Binder来实现通信。 可以说Binder机制是掌握系统底层原理的基石。 上图并没有给出Binder机制的具体的细节,而是先给出了一个概念,根据系统的Android系统的分层。
2023-06-17 14:56:011

Kurt Cobain的女儿叫什么名字?

Francis Bean Cobain
2023-06-17 14:56:013

《darling》官方对第二季的回复是什么?

官方没有解释。动漫的续作还是需要很长时间的等待的,你们看从零开始的异世界2016年第一季,2020年7月才要出第二季,进击的巨人2013年第一季,多少年后才有第二季,所以动漫还是要慢慢等待的。只要关注度一直高,官方一定会注意到的,毕竟第一季结尾还是有一些彩蛋的。介绍《DARLING in the FRANXX》是由TRIGGER和A-1Pictures(后更改为CloverWorks)共同制作的原创科幻电视动画作品,舞台设定在遥远的未来。动画于2018年1月13日起每周六在TOKYOMX、栃木电视台、群马电视台、BS11首播。全24集。据悉b站上说有第二季,在7月份,还有网友表示最后的boss都没有死透,应该有第二季或者OVO。
2023-06-17 14:55:571

华为手机binder是病毒吗

不是。那个是华为云为你提供binder的精选文章等,同时提供包含binder相关的软件资源、产品活动、最佳实践以及常见问题文档等信息。工作原理:手机中的软件,嵌入式操作系统(固化在芯片中的操作系统,一般由 JAVA、C++等语言编写),相当于一个小型的智能处理器,所以会遭受病毒攻击。而且,短信也不只是简单的文字,其中包括手机铃声、图片等信息,都需要手机中的操作系统进行解释,然后显示给手机用户,手机病毒就是靠软件系统的漏洞来入侵手机的。手机病毒要传播和运行,必要条件是移动服务商要提供数据传输功能,而且手机需要支持Java等高级程序写入功能。许多具备上网及下载等功能的手机都可能会被手机病毒入侵。传播方式:利用蓝牙方式传播:“卡波尔”病毒会修改智能手机的系统设置,通过蓝牙自动搜索相邻的手机是否存在漏洞,并进行攻击。感染PC上的手机可执行文件:“韦拉斯科”病毒感染电脑后,会搜索电脑硬盘上的SIS可执行文件并进行感染。利用MMS多媒体信息服务方式来传播:。利用手机的BUG攻击:这类病毒一般是在便携式信息设备的“ EPOC”上运行,如“EPOC-ALARM”、“EPOC-BANDINFO.A”、“EPOC-FAKE.A”、“EPOC-GHOST.A”、“EPOC-ALIGHT.A”等。
2023-06-17 14:55:471

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驱动为面向对象的进程间通信提供底层支持。
2023-06-17 14:55:401

FrancesGowens人物介绍

FrancesGowensFrancesGowens是一名演员,主要作品有《罪恶之家》《闯入者》。外文名:FrancesGowens职业:演员代表作品:《罪恶之家》合作人物:阿拉斯塔尔·西姆
2023-06-17 14:55:391

FrancesPyle做什么的

FrancesPyleFrancesPyle,演员,主要作品《对手》。外文名:FrancesPyle职业:演员代表作品:《对手》合作人物:梅尔文·勒罗伊电影作品
2023-06-17 14:55:321

FrancesHatton是谁

FrancesHattonFrancesHatton是一名演员,主要作品有《信念之日》。外文名:FrancesHatton职业:演员代表作品:《信念之日》合作人物:埃莉诺·博德曼
2023-06-17 14:55:251

darling是什么意思?

darling的意思是心爱的人;亲爱的。一、详细介绍darling 英 [u02c8dɑ:lu026au014b] 美 [u02c8dɑrlu026au014b] n.心爱的人;亲爱的(Darling)人名;(英)达林。adj. 倍受喜爱的,可爱的,迷人的;darling的近义词二、darling词组是什么1、baia perfect darling 极可爱的人2、curled darlings 花花公子,纨绔子弟3、mamma"s darling 母亲的宠儿,娇生惯养的儿女4、the darling of all hearts 众人喜欢的人,人人心爱的东西5、the darling(或child)of fortune 幸运儿,顺利发迹的人,事事顺利的人;天之骄子三、造句1、Thank you, darling.谢谢你,亲爱的。2、To have a darling baby boy was the greatest gift I could imagine.拥有一个心爱的小男孩是我所能想像的最好的礼物。3、He"s such a darling.他真是个宝贝。4、Have I your heart my darling?我得到你的心了吗?亲爱的?
2023-06-17 14:55:221

Android源码解析RPC系列(一)---Binder原理

看了几天的Binder,决定有必要写一篇博客,记录一下学习成果,Binder是Android中比较综合的一块知识了,目前的理解只限于JAVA层。首先Binder是干嘛用的?不用说,跨进程通信全靠它,操作系统的不同进程之间,数据不共享,对于每个进程来说,它都天真地以为自己独享了整个系统,完全不知道其他进程的存在,进程之间需要通信需要某种系统机制才能完成,在Android整个系统架构中,采用了大量的C/S架构的思想,所以Binder的作用就显得非常重要了,但是这种机制为什么是Binder呢?在Linux中的RPC方式有管道,消息队列,共享内存等,消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,这样就有两次拷贝过程。共享内存不需要拷贝,但控制复杂,难以使用。Binder是个折中的方案,只需要拷贝一次就行了。其次Binder的安全性比较好,好在哪里,在下还不是很清楚,基于安全性和传输的效率考虑,选择了Binder。Binder的英文意思是粘结剂,Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程中,这个进程一般是Server端,该对象提供了一套方法用以实现对服务的请求,而它的引用却遍布于系统的各个进程(Client端)之中,这样Client通过Binder的引用访问Server,所以说,Binder就像胶水一样,把系统各个进程粘结在一起了,废话确实有点多。 为了从而保障了系统的安全和稳定,整个系统被划分成内核空间和用户空间 内核空间:独立于普通的应用程序,可以访问受保护的内存空间,有访问底层硬件设备的所有权限。 用户空间:相对与内核空间,上层运用程序所运行的空间就是用户空间,用户空间访问内核空间的唯一方式就是系统调用。一个4G的虚拟地址空间,其中3G是用户空间,剩余的1G是内核空间。如果一个用户空间想与另外一个用户空间进行通信,就需要内核模块支持,这个运行在内核空间的,负责各个用户进程通过Binder通信的内核模块叫做Binder驱动,虽然叫做Binder驱动,但是和硬件并没有什么关系,只是实现方式和设备驱动程序是一样的,提供了一些标准文件操作。 在写AIDL的时候,一般情况下,我们有两个进程,一个作为Server端提供某种服务,然后另外一个进程作为Client端,连接Server端之后,就 可以使用Server里面定义的服务。这种思想是一种典型的C/S的思想。值得注意的是Android系统中的Binder自身也是C/S的架构,也有Server端与Client端。一个大的C/S架构中,也有一个小的C/S架构。 先笼统的说一下,在整个Binder框架中,由系列组件组成,分别是Client、Server、ServiceManager和Binder驱动程序,其中Client、Server和ServiceManager运行在用户空间,Binder驱动程序运行内核空间。运行在用户空间中的Client、Server和ServiceManager,是在三个不同进程中的,Server进程中中定义了服务提供给Client进程使用,并且Server中有一个Binder实体,但是Server中定义的服务并不能直接被Client使用,它需要向ServiceManager注册,然后Client要用服务的时候,直接向ServiceManager要,ServiceManager返回一个Binder的替身(引用)给Client,这样Client就可以调用Server中的服务了。 场景 :进程A要调用进程B里面的一个draw方法处理图片。 分析 :在这种场景下,进程A作为Client端,进程B做为Server端,但是A/B不在同一个进程中,怎么来调用B进程的draw方法呢,首先进程B作为Server端创建了Binder实体,为其取一个字符形式,可读易记的名字,并将这个Binder连同名字以数据包的形式通过Binder驱动发送给ServiceManager,也就是向ServiceManager注册的过程,告诉ServiceManager,我是进程B,拥有图像处理的功能,ServiceManager从数据包中取出名字和引用以一个注册表的形式保留了Server进程的注册信息。为什么是以数据包的形式呢,因为这是两个进程,直接传递对象是不行滴,只能是一些描述信息。现在Client端进程A联系ServiceManager,说现在我需要进程B中图像处理的功能,ServiceManager从注册表中查到了这个Binder实体,但是呢,它并不是直接把这个Binder实体直接给Client,而是给了一个Binder实体的代理,或者说是引用,Client通过Binder的引用访问Server。分析到现在,有个关键的问题需要说一下,ServiceManager是一个进程,Server是另一个进程,Server向ServiceManager注册Binder必然会涉及进程间通信。当前实现的是进程间通信却又要用到进程间通信,这就好象蛋可以孵出鸡前提却是要找只鸡来孵蛋,确实是这样的,ServiceManager中预先有了一个自己的Binder对象(实体),就是那只鸡,然后Server有个Binder对象的引用,就是那个蛋,Server需要通过这个Binder的引用来实现Binder的注册。鸡就一只,蛋有很多,ServiceManager进程的Binder对象(实体)仅有一个,其他进程所拥有的全部都是它的代理。同样一个Server端Binder实体也应该只有一个,对应所有Client端全部都是它的代理。 我们再次理解一下Binder是什么?在Binder通信模型的四个角色里面;他们的代表都是“Binder”,一个Binder对象就代表了所有,包括了Server,Client,ServiceManager,这样,对于Binder通信的使用者而言,不用关心实现的细节。对Server来说,Binder指的是Binder实体,或者说是本地对象,对于Client来说,Binder指的是Binder代理对象,也就是Binder的引用。对于Binder驱动而言,在Binder对象进行跨进程传递的时候,Binder驱动会自动完成这两种类型的转换。 简单的总结一下,通过上面一大段的分析,一个Server在使用的时候需要经历三个阶段 1、定义一个AIDL文件 Game.aidl GameManager .aidl 2、定义远端服务Service 在远程服务中的onBind方法,实现AIDL接口的具体方法,并且返回Binder对象 3、本地创建连接对象 以上就是一个远端服务的一般套路,如果是在两个进程中,就可以进程通信了,现在我们分析一下,这个通信的流程。重点是GameManager这个编译生成的类。 从类的关系来看,首先接口GameManager 继承 IInterface ,IInterface是一个接口,在GameManager内部有一个内部类Stub,Stub继承了Binder,(Binder实现了IBinder),并且实现了GameManager接口,在Stub中还有一个内部类Proxy,Proxy也实现了GameManager接口,一个整体的结构是这样的 现在的问题是,Stub是什么?Proxy又是什么?在上面说了在Binder通信模型的四个角色里面;他们的代表都是“Binder”,一个Binder对象就代表了所有,包括了Server,Clinet,ServiceManager,为了两个进程的通信,系统给予的内核支持是Binder,在抽象一点的说,Binder是系统开辟的一块内存空间,两个进程往这块空间里面读写数据就行了,Stub从Binder中读数据,Proxy向Binder中写数据,达到进程间通信的目的。首先我们分析Stub。 Stub 类继承了Binder ,说明了Stub有了跨进程传输的能力,实现了GameManager接口,说明它有了根据游戏ID查询一个游戏的能力。我们在bind一个Service之后,在onServiceConnecttion的回调里面,就是通过asInterface方法拿到一个远程的service的。 asInterface调用queryLocalInterface。 mDescriptor,mOwner其实是Binder的成员变量,Stub继承了Binder,在构造函数的时候,对着两个变量赋的值。 如果客户端和服务端是在一个进程中,那么其实queryLocalInterface获取的就是Stub对象,如果不在一个进程queryLocalInterface查询的对象肯定为null,因为不同进程有不同虚拟机,肯定查不到mOwner对象的,所以这时候其实是返回的Proxy对象了。拿到Stub对象后,通常在onServiceConnected中,就把这个对象转换成我们多定义AIDL接口。 比如我们这里会转换成GameManager,有了GameManager对象,就可以调用后querryGameById方法了。如果是一个进程,那直接调用的是自己的querryGameById方法,如果不是一个进程,那调用了就是代理的querryGameById方法了。 看到其中关键的一行是 mRemote就是一个IBinder对象,相对于Stub,Proxy 是组合关系(HAS-A),内部有一个IBinder对象mRemote,Stub是继承关系(IS-A),直接实现了IBinder接口。 transact是个native方法,最终还会回掉JAVA层的onTransact方法。 onTransact根据调用号(每个AIDL函数都有一个编号,在跨进程的时候,不会传递函数,而是传递编号指明调用哪个函数)调用相关函数;在这个例子里面,调用了Binder本地对象的querryGameById方法;这个方法将结果返回给驱动,驱动唤醒挂起的Client进程里面的线程并将结果返回。于是一次跨进程调用就完成了。 ***Please accept mybest wishes for your happiness and success ! ***
2023-06-17 14:55:191

Carson带你学Android:全面剖析Binder跨进程通信原理

从而全方位地介绍 Binder ,希望你们会喜欢。 在本文的讲解中,按照 大角度 -> 小角度 去分析 Binder ,即: 从而全方位地介绍 Binder ,希望你们会喜欢。 在讲解 Binder 前,我们先了解一些 Linux 的基础知识 具体请看文章: 操作系统:图文详解 内存映射 Binder 跨进程通信机制 模型 基于 Client - Server 模式 此处重点讲解 Binder 驱动作用中的跨进程通信的原理: 原因: 所以,原理图可表示为以下: 所以,在进行跨进程通信时,开发者只需自定义 Client & Server 进程 并 显式使用上述3个步骤,最终借助 Android 的基本架构功能就可完成进程间通信 注册服务后, Binder 驱动持有 Server 进程创建的 Binder 实体 此时, Client 进程与 Server 进程已经建立了连接 Client 进程 根据获取到的 Service 信息( Binder 代理对象),通过 Binder 驱动 建立与 该 Service 所在 Server 进程通信的链路,并开始使用服务 步骤1: Client 进程 将参数(整数a和b)发送到 Server 进程 步骤2: Server 进程根据 Client 进要求 调用 目标方法(即加法函数) 步骤3: Server 进程 将目标方法的结果(即加法后的结果)返回给 Client 进程 对比 Linux ( Android 基于 Linux )上的其他进程通信方式(管道、消息队列、共享内存、 信号量、 Socket ), Binder 机制的优点有: 特别地,对于从模型结构组成的Binder驱动来说: 不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。
2023-06-17 14:55:121

深入浅出Binder进程间通信机制

Linux传统IPC机制主要有已下几种:管道、消息队列、共享内存Socket等。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。socket作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。 同时从安全性角度考虑,Android作为一个开放式,拥有众多开发者的平台,应用程序的来源广泛,确保智能终端的安全是非常重要的。传统IPC没有任何安全措施,完全依赖上层协议来确保。首先传统IPC的接收方无法获得对方进程可靠的UID/PID(用户ID/进程ID),从而无法鉴别对方身份。Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。使用传统IPC只能由用户在数据包里填入UID/PID,但这样不可靠,容易被恶意程序利用。可靠的身份标记只有由IPC机制本身在内核中添加。其次传统IPC访问接入点是开放的,无法建立私有通道。比如命名管道的名称、system V的键值、socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。 由于传统的IPC机制有这样那样不让人满意的原因。Android自己开发了一套进程间通信机制Binder通信。Binder机制起源于一个简单的想法:将申请服务的请求和对应的响应信息,写入一个所有进程均能够访问的地址空间中。当进程需要使用这些数据时,只需要访问对应的内存地址,以减小内容复制引入的开销。为此,Binder机制利用kernel空间作为共享区域,并由Binder driver来建立起每个进程的内存地址与kernel空间中存储地址的映射。从而使数据只要拷贝一次就可以。同时为发送方添加UID/PID身份,既支持实名Binder也支持匿名Binder,提高安全性。 Binder通信采用C/S架构,从组件视角来说,包含Client、Server、ServiceManager以及Binder驱动,其中ServiceManager用于管理系统中的各种服务。如上图所示Binder在Framework层和Native层分别有对应的客户端(Client)、服务(Server)的和服务管理器(Service Manager)。同时在Kernel层(内核空间)有Binder的驱动设备。 这四个角色的作用分别是: ① Client进程:使用服务的进程。 ② Server进程:提供服务的进程。 ③ ServiceManager进程:ServiceManager的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。 ④ Binder驱动:驱动负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。 首先需要注册服务端,只有注册了服务端,客户端才有通讯的目标,服务端通过 ServiceManager 注册服务,注册的过程就是向 Binder 驱动的全局链表 binder_procs 中插入服务端的信息(binder_proc 结构体,每个 binder_proc 结构体中都有 todo 任务队列),然后向 ServiceManager 的 svcinfo 列表中缓存一下注册的服务。 注册完服务后客户端就能够查询并获取注册了的服务了。客户端向ServiceManager 发起获取服务的请求,传递要获取服务的名称。ServiceManager 从服务列表中查找到Client需要的对应服务信息,将该服务的代理Binder(BinderProxy)返回给客户端。其实查询服务相当于ServiceManager 作为服务端,客户端进行使用。所以这也是一次Binder使用服务的过程。 使用服务的过程如上图。 ① Binder驱动为跨进程通信做准备:通过调用mmap()系统函数实现内存映射。在Binder驱动中创建一块接收缓存区。同时将内核缓存区地址和Server端中用户空间一块地址同时都映射到该接收缓存区中。这时候就创建了虚拟区间和映射的关系。 ② Client进程将数据发送到Server进程。Client进程通过调用copy_from_user()发送数据拷贝到内核中(Binder驱动)的缓存区中,此时Client发起请求的线程会被挂起。由于在①中构建了映射关系,此时相当于也将数据发送到了Server端的用户空间中。之后Binder驱动通知Server端进程执行解包。 ③ Server进程根据Client进程发送来的数据,调用目标方法。收到Binder驱动通知后,Server进程对数据进行解包,并调用相关方法处理。 ④ Server进程将目标方法处理结果返回给Client进程。将处理结果放回自己的共享空间(即①中映射的Binder驱动缓存区中)。Binder驱动通知Client进程获取返回结果,此时②中被挂起的线程会被重新唤醒。Client进程通过系统调用copy_to_user(),从内核缓存区拷贝Server进程返回的结果。 从上面使用服务的过程可以看到,整个过程只拷贝了一次发送的数据和一次接收的数据。而正如开头所述,消息队列和管道这两种IPC拷贝次数为2次。 Binder模型的线程管理采用Binder驱动线程池,由Binder驱动进行管理,而不是由Server进程来管理。而一个进程的Binder线程默认线程数默认最大是16。也就是说Client的请求数一旦超过16个会被阻塞直到有空间的Binder线程。
2023-06-17 14:55:051

Android通信方式篇(七)-Binder机制(Native层(下))

本篇文章针对向ServiceManager注册服务 和 获取服务两个流程来做总结。在这两个过程中,ServiceManager都扮演的是服务端,与客户端之间的通信也是通过Binder IPC。 在此之前先了解下Binder的进程与线程的关系: 用户空间 :ProcessState描述一个进程,IPCThreadState对应一个进程中的一个线程。 内核空间 :binder_proc描述一个进程,统一由binder_procs全局链表保存,binder_thread对应进程的一个线程。 ProcessState与binder_proc是一一对应的。 Binder线程池 :每个Server进程在启动时会创建一个binder线程池,并向其中注册一个Binder线程;之后Server进程也可以向binder线程池注册新的线程,或者Binder驱动在探测到没有空闲binder线程时会主动向Server进程注册新的的binder线程。对于一个Server进程有一个最大Binder线程数限制15,(#define DEFAULT_MAX_BINDER_THREADS 15)。对于所有Client端进程的binder请求都是交由Server端进程的binder线程来处理的。我的理解是:binder线程是进程进行binder ipc时的一条数据处理路径。 MediaPlayerService向ServiceManager注册过程如下: 相关类: 整个过程总结如下: 1 获取BpServiceManager 与 BpBinder 由defaultServiceManager()返回的是BpServiceManager,同时会创建ProcessState对象和BpBinder对象。然后通过BpBinder执行transact,把真正工作交给IPCThreadState来处理。 2 BpBinder transact Binder代理类调用transact()方法,真正工作还是交给IPCThreadState来进行transact工作。 3 通过IPCThreadState 包装并转换数据并进行transact事务处理 每个线程都有一个IPCThreadState,每个IPCThreadState中都有一对Parcel变量:mIn、mOut。相当于两根数据管道: 最后执行talkWithDriver。 writeTransactionData:将BC Protocol + binder_transaction_data结构体 写入mOut, 然后执行waitForResponse: 由talkWithDriver将数据进一步封装到binder_write_read结构体,通过ioctl(BINDER_WRITE_READ)与驱动通信。同时等待驱动返回的接收BR命令,从mIn取出返回的数据。 mIn包装的数据结构(注册服务handle = 0 ,code 为ADD_SERVICE_TRANSACTION): 4 Binder Driver 把binder_write_read结构体write_buffer里数据取出来,分别得到BC命令和封装好数据的事务binder_transaction_data, 然后根据handler,在当前binder_proc中,找到相应的binder_ref,由binder_ref再找到目标binder_node实体,由目标binder_node再找到目标进程binder_proc。然后就是插入数据:当binder驱动可以找到合适的线程,就会把binder_transaction节点插入到servciemanager的线程的todo队列中,如果找不到合适的线程,就把节点之间插入servciemanager的binder_proc的todo队列。 5 ServiceManager 经过Binder Driver的处理,数据已经到了ServiceManager进程,在BR_TRANSACTION的引导下,在binder_loop()中执行binder_parser()取出数据,执行do_add_service()操作,最终向 svcinfo 列表中添加已经注册的服务(没有数据的返回)。最后发送 BR_REPLY 命令唤醒等待的线程,通知注册成功。结束MediaPlayerService进程 waitForResponse()的状态,整个注册过程结束。 获取服务的过程与注册类似,首先 ServiceManager 向 Binder 驱动发送 BC_TRANSACTION 命令携带 CHECK_SERVICE_TRANSACTION 命令,同时获取服务的线程进入等待状态 waitForResponse()。Binder 驱动收到请求命令向 ServiceManager 的发送 BC_TRANSACTION 查询已注册的服务,会区分请求服务所属进程情况。 查询到直接响应 BR_REPLY 唤醒等待的线程。若查询不到将与 binder_procs 链表中的服务进行一次通讯再响应。 以startService为例来简单总结下执行流程: 3.1 从方法执行流程来看: Client : 1 AMP.startService 标记方法以及通过Parcel包装数据; 2 BinderProxy.transact 实际调用native的 android_os_BinderProxy_transact 传递数据; 3 获取BpServiceManager 与 BpBinder 同时会创建ProcessState。然后通过BpBinder执行transact,把真正工作交给IPCThreadState来处理; 4 IPC.transact 主要执行writeTransactionData,将上层传来的数据重新包装成binder_transaction_data,并将BC Protocol + binder_transaction_data结构体 写入mOut; 5 IPC waitForResponse talkWithDriver + 等待返回数据; 6 talkWithDriver 将数据进一步封装成binder_write_read,通过ioctl(BINDER_WRITE_READ)与驱动通信; Kernel : 7 binder ioctl 接收BINDER_WRITE_READ ioctl命令; 8 binder_ioctl_write_read 把用户空间数据ubuf拷贝到内核空间bwr; 9 binder_thread_write 当bwr写缓存有数据,则执行binder_thread_write;当写失败则将bwr数据写回用户空间并退出; 10 binder_transaction 找到目标进程binder_proc并插入数据到目标进程的线程todo队列,最终执行到它 时,将发起端数据拷贝到接收端进程的buffer结构体; 11 binder_thread_read 根据binder_transaction结构体和binder_buffer结构体数据生成新的binder_transaction_data结构体,写入bwr的read_buffer,当bwr读缓存有数据,则执行binder_thread_read;当读失败则再将bwr数据写回用户空间并退出;最后,把内核数据bwr拷贝到用户空间ubuf。 12 binder_thread_write + binder_ioctl BR命令和数据传递 Server: 13 IPC.executeCommand 解析kernel传过来的binder_transaction_data数据,找到目标BBinder并调用其transact()方法; 14 IPC.joinThreadPool 采用循环不断地执行getAndExecuteCommand()方法, 处理事务。当bwr的读写buffer都没有数据时,则阻塞在binder_thread_read的wait_event过程. 另外,正常情况下binder线程一旦创建则不会退出. 15 BBinder.transact 到Binder.exeTransact 调用 AMN.onTransact 16 AMN.onTransact 把数据传递到AMS.starService去执行 17 AMS.starService Server处理了Client的请求了 然后原路replay回去,talkWithDriver 到Kernel ,然后找到Client进程,把数据拷贝到read_buffer里,最终唤醒IPC,把反馈传递回AMP.startService。完成启动服务。 3.2 从通信协议流程来看: 非oneWay: oneway: oneway与非oneway区别: 都是需要等待Binder Driver的回应消息BR_TRANSACTION_COMPLETE. 主要区别在于oneway的通信收到BR_TRANSACTION_COMPLETE则返回,而不会再等待BR_REPLY消息的到来. 另外,oneway的binder IPC则接收端无法获取对方的pid. 3.3 从数据流来看 从用户空间开始: 进入驱动后: 回到用户空间: 参考: http://gityuan.com/2016/09/04/binder-start-service/ http://gityuan.com/2015/11/28/binder-summary/ http://gityuan.com/2015/11/14/binder-add-service/ http://gityuan.com/2015/11/15/binder-get-service/
2023-06-17 14:54:581