《android培训课件04_android的底层库和程序》由会员分享,可在线阅读,更多相关《android培训课件04_android的底层库和程序(35页珍藏版)》请在金锄头文库上搜索。
1、 Android 的底层库和程序 Android 的底层库和程序 第一部分 底层库和程序的结构 第二部分 标准 C/C+ 库 bionic 第三部分 C 语言底层库 libcutils 第四部分 Init 进程 第五部分 Shell 工具 第六部分 C+ 工具库 libutils 第七部分 Android 的系统进程 第一部分 软件的结构 1.1 本地实现底层的结构 1.2 增加本地程序和库的方法 1.1 本地实现底层的结构 Android 的本地实现层次具有基本 的库和程序。这些库和程序是 Android 基 本系统运行的基础。 主要包含了以下的内容: C 语言底层库 libcutils I
2、nit 进程 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 : # Tes
3、t 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_SR
4、C_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 L
5、OCAL_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/ge
6、neric/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
7、_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
8、_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 m
9、y-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 := $(ad
10、dprefix $(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 线程库。它还实
11、现了自己的 Linker 以及 Loader ,用于动态库的创建 和加载。 bionic 加入了一些 Android 独有的功能,比如 log 的底层支持。另外它还实现了一套 property 系统,这 是整个 Android 的全局变量的存储区域, bionic 使用 共享内存的方式来实现维护 property 系统。 第三部分 C 语言底层库 libcutils C 语言底层库提供了 C 语言中最基本的 工具功能。这是 Android 本地中最为基础的 库,基本上 Android 中所有的本地的库和程 序都连接了这个库。 头文件的路径: system/core/include/cutils
12、 库的路径 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 的可执行程序。提供了以下的功能: 设备管理 解析启动
13、脚本 执行基本的功能 启动各种服务 代码的路径: 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(
14、“/init.rc“); /* 处理初始化脚本 */ /* 获取比内核命令行参数 */ qemu_init(); import_kernel_cmdline(0); /* 初始化驱动设备,创建文件系统节点 */ device_fd = device_init(); /* 属性相关处理和启动 logo */ /* 初始化 struct pollfd ufds4;*/ for(;) /* 进入循环,处理 ufds4 的事件 */ nr = poll(ufds, fd_count, timeout); if (nr sp +m_ptr() +m_refs() BnInterface +BpInter
15、face() #onAsBinder() sp +m_ptr() +m_refs() BnInterface +BpInterface() #onAsBinder() transact (CHECK_PERMISSION_TRANSACTION, data, if (reply.readInt32() != 0) return 0; return reply.readInt32() != 0; ; IMPLEMENT_META_INTERFACE(PermissionController, “android.os.IPermissionController“); IPermissionCont
16、roller .cpp(1) 第六部分 C+ 工具库 libutils status_t BnPermissionController:onTransact( uint32_t code, const Parcel 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); IPerm