前几天有一个小想法,计划把 libbinder 的实现从 Android 中拿出来,在 NDK 下编译后供目前还不知道是何用途的用途使用。作为先锋工作,第一步就是把智能指针先取出来。所使用的源代码对应 Android 版本为 5.1.0。
根据考察,binder 的实现代码主要位于 frameworks/native 下,其中的 include 和 libs 目录下均有名为 binder 的目录。当然,这个信息目前还没用上,因为现在聚焦于智能指针。智能指针的代码位于 system/core 下,它自身的实现与其依赖,主要分布于两个部分里,一个是 cutils,一个是 utils;这两个部件,在 include 目录下对应有同名子目录,其实现代码所在目录和 include 同级,目录名均有 lib 前缀。
智能指针的相关头文件在 utils 目录下,RefBase.h、StrongPointer.h、TypeHelpers.h 三个。它们同时依赖于同目录下的 Atomic.h、CallStack.h、Errors.h、Log.h、Mutex.h、threads.h(后文会提到,为了编译通过,CallStack.h 和 threads.h 会做一些手术);实现的源文件,则在 libutils 目录下,RefBase.cpp、Log.cpp、Timers.cpp,后两个是依赖。
utils 部件事实上又依赖于 cutils。好在智能指针这部分的依赖主要是原子操作这块,也就是说,为了编译智能指针,只需从 cutils 里提取 atomic 开头的头文件即可,顺带还有个 log.h 也取出来备用,至于源文件,只用取 atomic.c 就可以了。
原材料已经齐备,不过烹饪前,还有些洗切工作要做。第一个是 CallStack.h,这个类牵涉的其他东西就太多了,快刀斩乱麻,把它弄成个空实现;threads.h 被 RefBase.cpp 所包含,但是其实只用到了 Mutex 相关的东东,该头文件内有注释声称其即将被废弃,将之改造为其中只包含了 Mutex.h 即可;最后是 log.h(请注意文件名的大小写),这个文件需要全部重构。原内容只有一行 #include
如此即可建立 NDK 的静态库工程进行编译了。写本文的同时,浏览代码,发现 RefBase.cpp 中还有对 String8 的使用,可能也要处理一下。后文再叙。