首页 04_Android的底层库和程序

04_Android的底层库和程序

举报
开通vip

04_Android的底层库和程序 Android 的底层库和程序 Android 的底层库和程序  第一部分 底层库和程序的结构  第二部分 标准 C/C++ 库 bionic  第三部分 C 语言底层库 libcutils  第四部分 Init 进程  第五部分 Shell 工具  第六部分 C++ 工具库 libutils  第七部分 Android 的系统进程 第一部分 软件的结构 1.1 本地实现底层的结构 1.2 增加本地程序和库的方法 1.1 本地实现底层的结构 ...

04_Android的底层库和程序
Android 的底层库和程序 Android 的底层库和程序  第一部分 底层库和程序的结构  第二部分 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 C/C++ 库 bionic  第三部分 C 语言底层库 libcutils  第四部分 Init 进程  第五部分 Shell 工具  第六部分 C++ 工具库 libutils  第七部分 Android 的系统进程 第一部分 软件的结构 1.1 本地实现底层的结构 1.2 增加本地程序和库的方法 1.1 本地实现底层的结构 Android的本地实现层次具有基本 的库和程序。这些库和程序是 Android基 本系统运行的基础。 主要包含了以下的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 :  C 语言底层库 libcutils  Init 进程  Shell 工具  C++ 工具库 libutils 1.2 增加本地程序和库的方法 Android中增加本地的程序或者 库,这些程序和库与它们所在的路径没有 关系,只和它们的 Android.mk文件有关 系。 Android.mk具有统一的写法,主要 包含了一些系统公共的宏。 选项参考以下文件: build/core/config.mk 默认的值在以下文件中定义: build/core/base_rules.mk 在一个 Android.mk中也可以生成多 个可执行程序、动态库或者静态库。 1.2 增加本地程序和库的方法 可执行程序的 Android.mk: # Test Exe LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ main.c LOCAL_MODULE:= test_exe #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_EXECUTABLE) 1.2 增加本地程序和库的方法 # Test Static lib LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ helloworld.c LOCAL_MODULE:= libtest_static #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_STATIC_LIBRARY) 静态库(归档文件)的 Android.mk: 1.2 增加本地程序和库的方法 # Test shared lib LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ helloworld.c LOCAL_MODULE:= libtest_shared TARGET_PRELINK_MODULE := false #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_SHARED_LIBRARY) 动态库(共享库)的 Android.mk: 1.2 增加本地程序和库的方法 可执行程序、动态库和静态库生成的女表分别在 以下的文件夹中: out/target/product/generic/obj/EXECUTABLE out/target/product/generic/obj/STATIC_LIBRARY out/target/product/generic/obj/SHARED_LIBRARY 其目标的文件夹分别为: XXX_intermediates XXX_shared_intermediates XXX_static_intermediates 对于可执行程序和动态库,生成的 LINK子目录 中的包含带有符号的库(没有经过 strip)。 1.2 增加本地程序和库的方法 编译模板的区别如下所示: 目标的模板:可执行程序,动态库,静态库 include $(BUILD_EXECUTABLE) include $(BUILD_SHARED_LIBRARY) include $(BUILD_STATIC_LIBRARY) 如果编译主机的:可执行程序,动态库,静态库 include $(BUILD_HOST_EXECUTABLE) include $(BUILD_HOST_SHARED_LIBRARY) include $(BUILD_HOST_STATIC_LIBRARY) 1.2 增加本地程序和库的方法 安装路径的问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH 增加以下可以安装到不同的文件系统: LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED) 文件系统的选择: TARGET_ROOT_OUT : 表示根文件系统 out/target/product/generic/root TARGET_OUT : 表示 system 文件系统 out/target/product/generic/system TARGET_OUT_DATA : 表示 data 文件系统 out/target/product/generic/data 1.2 增加本地程序和库的方法 进行安装工作的 Android.mk: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) copy_from := \ A.txt \ B.txt copy_to := $(addprefix $(TARGET_OUT)/txt/,$(copy_from)) $(copy_to) : PRIVATE_MODULE := txt $(copy_to) : $(TARGET_OUT)/txt/% : $(LOCAL_PATH)/% | $(ACP) $(transform-prebuilt-to-target) ALL_PREBUILT = $(copy_to) # create some directories DIRS := $(addprefix $(TARGET_OUT)/, \ txt \ $(DIRS): @echo Directory: $@ @mkdir -p $@ 1. 创建路径: system/txt 2. 在其中安装: A.txt 和 B.txt 第二部分 标准 C/C++ 库 bionic bionic 提供 C/C++ 标准库的功能,它是一个专为 嵌入式系统设计的轻量级标准库实现。 bionic 的源码和头文件在以下的目录中: bionic/ 相对传统的标准库实现,如 glibc , bionic 的体积 和内存占用更小。 bionic 支持标准 C/C++ 库的绝大 部分功能,支持数学库,以及 NPTL 线程库。它还实 现了自己的 Linker 以及 Loader ,用于动态库的创建 和加载。 bionic 加入了一些 Android 独有的功能,比如 log 的底层支持。另外它还实现了一套 property 系统,这 是整个 Android 的全局变量的存储区域, bionic 使用 共享内存的方式来实现维护 property 系统。 第三部分 C 语言底层库 libcutils C 语言底层库提供了 C 语言中最基本的 工具功能。这是 Android 本地中最为基础的 库,基本上 Android 中所有的本地的库和程 序都连接了这个库。 头文件的路径: system/core/include/cutils 库的路径 system/core/libcutils 编译的结果是: libcutils.so 第三部分 C 语言底层库 libcutils libcutil 中主要的头文件: threads.h :线程 sockets.h : Android 的套接字 properties.h : Android 的属性 log.h : log 信息 array.h :数组 ashmem.h :匿名共享内存 atomic.h :原子操作 mq.h :消息队列 第四部分 Init 进程 Android 启动后,系统执行的第一个进程是一个名 称为 init 的可执行程序。提供了以下的功能:  设备管理  解析启动脚本  执行基本的功能  启动各种服务 代码的路径: system/core/init 编译的结果是一个可执行文件: init 启动脚本的路径: system/core/rootdir/init.rc 第四部分 Init 进程 init 的可执行文件是系统运行的第一个用户空间的程序,它 以守护进程的方式运行。 int main(int argc, char **argv) { /* ...... */ umask(0); /* 创建文件系统的基本目录 */ open_devnull_stdio(); /* 打开 3 个文件 */ log_init(); /* 初始化 log */ parse_config_file("/init.rc"); /* 处理初始化脚本 */ /* 获取比内核命令行参数 */ qemu_init(); import_kernel_cmdline(0); /* 初始化驱动设备,创建文件系统节点 */ device_fd = device_init(); /* 属性相关处理和启动 logo */ /* 初始化 struct pollfd ufds[4];*/ for(;;) { /* 进入循环,处理 ufds[4] 的事件 */ nr = poll(ufds, fd_count, timeout); if (nr <= 0) continue; /* ...... */ } return 0; } 第四部分 Init 进程 init.rc 是在 init 启动后被执行的启动脚本,其语法 包含了 Actions , Triggers , Services , Options , Comm ands , Properties 等。 on init export PATH /sbin:/system/sbin:/system/bin:/system/xbin mkdir /system on property:ro.kernel.qemu=1 start adbd service vold /system/bin/vold socket vold stream 0660 root mount 使用方法参考 system/core/init/readme.txt, 关键 字参考 system/core/init/keyword.h 。 第五部分 Shell 工具 Android 系统的启动后,提供了基本 shell 界面 供开发调试使用。需要启动了一个名称为 console 的服务,实际上执行的程序: /system/bin/sh sh 代码的路径: system/core/sh toolbox 代码的路径: system/core/toolbox 生成的文件 /system/bin/toolbox ,目标文 件系统 /system/bin/ 中的具有一些符号将连接到 toolbox 上。 第六部分 C++ 工具库 libutils libutils 是 Android 的底层库,这个库以 C++ 实 现,它提供的 API 也是 C++ 的。 Android 的层次 的 C 语言程序和库,大都基于 libutils 开发。 头文件的路径: frameworks/base/include/utils 库的路径 frameworks/base/libs/utils 编译的结果是: libutils.so RefBase -m_ptr <> sp +m_ptr() +m_refs() <> wp Parcel IBinder +onTransact() +transact() BBinder BpRefBase +asBinder() +onAsBinder () IInterface +queryLocalInterface() +getInterfaceDescriptor() #onAsBinder() <> BnInterface +BpInterface() #onAsBinder() <> BpInterface BpBinder ProcessState IPCThreadState +checkPermission() IPermissionController +onTransact() BnPermissionController +getHeapID() +getBase() +getSize() +getFlags() IMemoryHeap +onTransact() BnMemoryHeap +getMemory() +fastPointer() +fastPointer() +size() +offset() IMemory +onTransact() BnMemory +onTransact() +getMemory() MemoryBaseMemoryHeapBase HeapInterface MemoryDealer MemoryHeapPmem 基础类部分 应用类部分 AllocatorInterface SharedHeap SimpleBestFitAllocator MemoryDealer::Allocation +getService() +checkService() +addService() +listServices() IServiceManager +onTransact() BnServiceManager 第六部分 C++ 工具库 libutils Errors.h : 定义宏表示错误代码 Endian.h : 定义表示大小端的宏 misc.h : 几个字符串和文件相关的功能函数 TextOutput.h : 定义文本输出的基类 TextOutput BufferedTextOutput.h : 类 BufferedTextOutput ,它是一个 TextOutput 的实现 Pipe.h : 定义管道类 Pipe Buffer.h : 定义内存缓冲区域的类 Buffer List.h : 定义链表的模版类 第六部分 C++ 工具库 libutils SharedBuffer.h : 定义类 SharedBuffer 表示共享内存。 String16.h : 定义表示双字节字符串的类 String16 String8.h : 定义表示单字节字符串的类 String8 ,并包含了从 String16转换功 能 VectorImpl.h : 定义表示向量的类 VectorImpl Vector.h : 定义继承 VectorImpl 的类模版 Vector SortedVector.h : 定义排序向量的模版 SortedVector KeyedVector.h : 定义使用关键字的向量模板 KeyedVector 第六部分 C++ 工具库 libutils threads.h : 定义线程相关的类,包括线程 Thread 、互斥量 Mutex 、条件 变量 Condition 、读写锁 ReadWriteLock 等 socket.h : 定义套结字相关的类 Socket Timers.h : 定义时间相关的函数和定时器类 DurationTimer 。 ZipEntry.h 、 ZipFileCRO.h 、 ZipFile.h 、 ZipFileRO.h 、 ZipUtils.h : 与 zip 功能相关的类。 第六部分 C++ 工具库 libutils Binder 用于进程间的通讯( IPC ),它的实 现基础是运行与 kernel 空间的 binder驱动。 RefBase -m_ptr <> sp +m_ptr() +m_refs() <> wp Parcel IBinder +onTransact() +transact() BBinder BpRefBase +asBinder() +onAsBinder () IInterface +queryLocalInterface() +getInterfaceDescriptor() #onAsBinder() <> BnInterface +BpInterface() #onAsBinder() <> BpInterface BpBinder ProcessState IPCThreadState RefBase.h IBinder.h Binder.h BpBinder.h IInterface.h Parcel.h ProcessState.h IPCThreadState.h 第六部分 C++ 工具库 libutils Binder驱动程序 Binder Adapter (IPCThreadState .cpp, ProcessState .cpp) Binder 的核心部分 (BBinderàIBinderßBpBinder) Java Binder 框架 CPP Binder 框架 Binder JAVA的 服务器/客户端 Binder C++的 服务器/客户端 第六部分 C++ 工具库 libutils RefBase.h : 引用计数,定义类 RefBase 。 Parcel.h : 为在 IPC 中传输的数据定义容器,定义类 Parcel IBinder.h : Binder 对象的抽象接口, 定义类 IBinder Binder.h : Binder 对象的基本功能, 定义类 Binder 和 BpRefBase BpBinder.h : BpBinder 的功能,定义类 BpBinder IInterface.h : 为抽象经过 Binder 的接口定义通用类, 定义类 IInterface ,类模板 BnInterface ,类模板 BpInterface ProcessState.h 表示进程状态的类,定义类 ProcessState IPCThreadState.h 表示 IPC 线程的状态,定义类 IPCThreadState 第六部分 C++ 工具库 libutils 某程序接口 ABC IServiceManager BnABC (本地功能) BpABC (代理功能) 服务器的实现 (具体实现功能) 客户端程序 注册服务 进程间 通讯 获得接口ABC 调用接口 ABC 程序框架部分 ② ① 进程1 进程2 第六部分 C++ 工具库 libutils 参考 PermissionController 的实现,这个在 IPermissionController .h IPermissionController.cpp 框架内定义接口 IPermissionController ,并 且实现了 BpPermisionController 。 这个类的使用方式是:  实现类继承 BnPermissionController  调用者调用类 IPermissionController 第六部分 C++ 工具库 libutils class IPermissionController : public IInterface { public: DECLARE_META_INTERFACE(PermissionController); virtual bool checkPermission(const String16& permission, int32_t pid, int32_t uid) = 0; enum { CHECK_PERMISSION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION }; }; class BnPermissionController : public BnInterface { public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); }; IPermissionController .h 第六部分 C++ 工具库 libutils class BpPermissionController : public BpInterface { public: BpPermissionController(const sp& impl) ( : BpInterface(impl) { } virtual bool checkPermission(const String16& permission, int32_t pid, int32_t uid) i { Parcel data, reply; data.writeInterfaceToken(IPermissionController:: getInterfaceDescriptor()); data.writeString16(permission); data.writeInt32(pid); data.writeInt32(uid); remote()->transact (CHECK_PERMISSION_TRANSACTION, data, &reply); if (reply.readInt32() != 0) return 0; return reply.readInt32() != 0; } }; IMPLEMENT_META_INTERFACE(PermissionController, "android.os.IPermissionController"); IPermissionController .cpp(1) 第六部分 C++ 工具库 libutils status_t BnPermissionController::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) u { switch(code) { case CHECK_PERMISSION_TRANSACTION: { CHECK_INTERFACE(IPermissionController, data, reply); String16 permission = data.readString16(); int32_t pid = data.readInt32(); int32_t uid = data.readInt32(); bool res = checkPermission(permission, pid, uid); reply->writeInt32(0); reply->writeInt32(res ? 1 : 0); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } } IPermissionController .cpp(2) 第六部分 C++ 工具库 libutils status_t BnPermissionController::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) u { switch(code) { case CHECK_PERMISSION_TRANSACTION: { CHECK_INTERFACE(IPermissionController, data, reply); String16 permission = data.readString16(); int32_t pid = data.readInt32(); int32_t uid = data.readInt32(); bool res = checkPermission(permission, pid, uid); reply->writeInt32(0); reply->writeInt32(res ? 1 : 0); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } } IPermissionController .cpp(2) 第七部分 Android 的系统进程 Android 中几个重要系统进程为: /init /system/bin/servicemanager , /system/bin/mediaserver system_server zygote 前面 init 分析章节提到 init通过解析 init.rc ,启动 对应的服务程序。 servicemanager , zygote 和 mediaserver 都通过这种方式启 动。 system_server则是通过 zygote孵化出来。 这几个进程是 Android 系统运行的基础 谢谢! Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35
本文档为【04_Android的底层库和程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_158972
暂无简介~
格式:pdf
大小:380KB
软件:PDF阅读器
页数:0
分类:互联网
上传时间:2011-06-05
浏览量:5