Android进程间通信机制(Binder)介绍

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

先看下 Binder 相关的一个简单类图
以一个简单的 binder 应用示例来看 Android 中 binder 这一进程间通信机制,文件结构: ~/MyFolder/ans/packages/apps/bitest$ tree . . |-- Android.mk // 同时生成 libdxyhservice.so、dxyh_service、dxyh_client 的.mk |-- dxyhclient // 一可执行程序与 service 通信(当然也可是 java 通过 jni 来与服务通信) | `-- DxyhClient.cpp |-- dxyhservice // 服务程序(类似于 mediaserver 这一可执行程序) | |-- DxyhService.cpp | |-- DxyhService.h | `-- main_dxyhservice.cpp |-- include // 头文件 | `-- IDxyhService.h `-- libdxyhservice // 动态库 `-- IDxyhService.cpp 示例相关类图:
//! Flags for onIncStrongAttempted() enum { FIRST_INC_STRONG = 0x0001 }; virtual virtual virtual virtual void void bool void onFirstRef(); onLastStrongRef(const void* id); onIncStrongAttempted(uint32_t flags, const void* id); onLastWeakRef(const void* id);
//! DEBUGGING ONLY: Print references held on object. inline void printRefs() const { getWeakRefs()->printRefs(); } //! DEBUGGING ONLY: Enable tracking of object. inline void trackMe(bool enable, bool retain) { getWeakRefs()->trackMe(enable, retain); } // used to override the RefBase destruction. class Destroyer { friend class RefBase; public: virtual ~Destroyer(); private: virtual void destroy(RefBase const* base) = 0; }; // Make sure to never acquire a strong reference from this function. The // same restrictions than for destructors apply. void setDestroyer(Destroyer* destroyer); protected: RefBase(); virtual ~RefBase(); //! Flags for extendObjectLifetime() enum { OBJECT_LIFETIME_WEAK = 0x0001, OBJECT_LIFETIME_FOREVER = 0x0003 }; void extendObjectLifetime(int32_t mode);
private: friend class weakref_type; class weakref_impl; RefBase(const RefBase& o);
RefBase& };
operator=(const RefBase& o);
weakref_impl* const mRefs; class RefBase::weakref_impl : public RefBase::weakref_type { public: volatile int32_t mStrong; volatile int32_t mWeak; RefBase* const mBase; volatile int32_t mFlags; Destroyer* mDestroyer; weakref_impl(RefBase* base) : mStrong(INITIAL_STRONG_VALUE) // 初始强指针引用计数 , mWeak(0) // 初始弱指针引用计数 , mBase(base) // 指向 RefBase 类的指针 // 引用计数控制旗标,可以是: // OBJECT_LIFETIME_WEAK —— 对象受到弱指针引用控制 // OBJECT_LIFETIME_FOREVER —— 对象不受任何指针类型的控制,所以需用户手动 delete , mFlags(0) , mDestroyer(0) { } void void void void void void }; class ProcessState : public virtual RefBase { public: static sp<ProcessState> self(); // 返回 ProcessState 全局单例(整个系统就此一个) static void void sp<IBinder> void sp<IBinder> bool void setSingleProcess(bool singleProcess); setContextObject(const sp<IBinder>& object); getContextObject(const sp<IBinder>& caller); setContextObject(const const getContextObject(const const sp<IBinder>& object, String16& name); String16& name, sp<IBinder>& caller); addStrongRef(const void* /*id*/) { } removeStrongRef(const void* /*id*/) { } addWeakRef(const void* /*id*/) { } removeWeakRef(const void* /*id*/) { } printRefs() const { } trackMe(bool, bool) { }
sp<IBinder> wp<IBinder> void void int const char* const* void void
private: // IPCThreadState 类是此类的友元类 friend class IPCThreadState; ProcessState();// 构造函数为私有,则不能在类体外用 new 关键字生成对象 ~ProcessState(); ProcessState& ProcessState(const ProcessState& o); operator=(const ProcessState& o);
看到和上面一张很像,事实上就是参照 ServiceManager 而写的。 我们从 main_dxyhservice.cpp 这个文件开始,看一个 service 是如何注册到系统中的。 所有服务均挂在 service_manager.c 中的 struct svcinfo *svclist 这个链表中。 下面就进入到程序 main_dxyhservice.cpp 中的 main()函数: =============================================================== ==> 相关类 class RefBase { public: void incStrong(const void* id) const; void decStrong(const void* id) const; void forceIncStrong(const void* id) const;
//! This is only safe if you have set OBJECT_LIFETIME_FOREVER. bool attemptIncWeak(const void* id); //! DEBUGGING ONLY: Get current weak ref count. int32_t getWeakCount() const; //! DEBUGGING ONLY: Print references held on object. void printRefs() const; //! DEBUGGING ONLY: Enable tracking for this object. // enable -- enable/disable tracking // retain -- when tracking is enable, if true, then we save a stack trace // for each reference and dereference; when retain == false, we // match up references and dereferences and keep only the // outstanding ones. void }; weakref_type* weakref_type* createWeak(const void* id) const; getWeakRefs() const; trackMe(bool enable, bool retain);
这个automutex类很是特别原理就是在该类对象的生命周期内锁住所传入的锁在对象消亡时通过析构函数来解锁具体看其类定义就清楚了
Android 进程间通信机制( Binder)介绍
Author: E-mail: Date : PS : 灯下野狐 dengxiayehu@ 2012-02 欢迎交流,转载请务必注明出处。
//! DEBUGGING ONLY: Get current strong ref count. int32_t getStrongCount() const; cld void bool
refBase() const; incWeak(const void* id); decWeak(const void* id); attemptIncStrong(const void* id);
supportsProcesses() const; startThreadPool();
typedef bool (*context_check_func)(const String16& name, const sp<IBinder>& caller, void* userData); bool bool isContextManager(void) const; becomeContextManager( context_check_func checkFunc, void* userData); getStrongProxyForHandle(int32_t handle); getWeakProxyForHandle(int32_t handle); expungeHandle(int32_t handle, IBinder* binder); setArgs(int argc, const char* const argv[]); getArgC() const; getArgV() const; setArgV0(const char* txt); spawnPooledThread(bool isMain);
相关文档
最新文档