文章摘要
安卓系统的Libraries层是连接硬件与上层框架的关键组件,主要由C/C++编写的.so文件构成,存储在/system/lib目录中。这些库分为多媒体(如libmedia、libstagefright)、图形显示(如libsurfaceflinger、libEGL)、系统基础(如libc、liblog)、数据库(libsqlite)、网络通信(如libbluetooth)等六大类别,为安卓应用提供底层功能支持。通过硬件抽象和高效实现,这些系统库构成了安卓平台的核心基础架构。
在安卓操作系统中,**Libraries(本地库/系统库)**是系统架构中的重要组成部分,位于HAL(硬件抽象层)和Framework之间,主要以C/C++实现,提供给上层Java Framework和应用调用。它们大多以.so(共享库)形式存在于/system/lib
(32位)或/system/lib64
(64位)目录下。
主要包含的库有:
1. 多媒体相关
- libmedia:多媒体框架核心库,音视频播放、录制等。
- libstagefright:多媒体编解码库,支持音视频编解码、封装、解封装。
- libaudioflinger:音频混音和输出库。
- libcamera_client / libcamera_service:摄像头服务和客户端库。
- libmediaplayerservice:媒体播放器服务库。
2. 图形与显示
- libsurfaceflinger:SurfaceFlinger合成器,负责屏幕合成和显示。
- libui:UI相关的底层库,窗口、Surface等。
- libgui:图形用户界面库,BufferQueue等机制。
- libEGL / libGLESv1_CM / libGLESv2:OpenGL ES图形渲染库。
- libskia:2D图形绘图库。
3. 系统基础库
- libc:C标准库(Bionic实现)。
- libm:数学库。
- libdl:动态链接库。
- libz:压缩库(zlib)。
- liblog:日志库(Android logcat)。
4. 数据库与存储
- libsqlite:SQLite数据库库。
- libcrypto / libssl:加密与安全库(OpenSSL)。
5. 网络与通信
- libnetutils:网络工具库。
- libnfc:NFC相关库。
- libbluetooth:蓝牙协议栈库。
6. 其他常用库
- libandroid_runtime:Java虚拟机与本地库的桥梁。
- libinput:输入设备处理库。
- libusbhost:USB主机库。
- libhardware:硬件抽象层接口库。
- libnativehelper:JNI辅助库。
总结
Android系统的Libraries层主要包括:
- 多媒体(音视频、摄像头、编解码)
- 图形显示(OpenGL、SurfaceFlinger、Skia等)
- 系统基础(libc、libm、liblog等)
- 数据库与安全(libsqlite、libcrypto等)
- 网络通信(libnetutils、libbluetooth等)
- 其他(libhardware、libinput等)
这些库为上层Java Framework和应用提供了高效、底层的功能支持,是Android系统不可或缺的基础组件。
自定义基础库(如你用C/C++写的libmybase.so)接入安卓系统,常见有以下几种方式,具体取决于你的库是给系统服务、Framework、App还是HAL用。下面详细介绍如何将自定义基础库优雅地接入Android系统:
1. 作为系统库集成到AOSP源码
步骤一:放置源码
将你的库源码(如libmybase/
目录)放到AOSP源码合适位置,比如system/libmybase/
或external/libmybase/
。
步骤二:编写Android.bp或Android.mk
-
Android.bp(推荐,Android 8.0及以后主流)示例:
cc_library_shared { name: "libmybase", srcs: ["mybase.c"], shared_libs: ["liblog"], // 依赖的系统库 export_include_dirs: ["include"], }
-
Android.mk(老版本)示例:
include $(CLEAR_VARS) LOCAL_MODULE := libmybase LOCAL_SRC_FILES := mybase.c LOCAL_SHARED_LIBRARIES := liblog LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include include $(BUILD_SHARED_LIBRARY)
步骤三:注册到构建系统
- 如果放在
external/
或system/
目录,通常会被自动扫描到。 - 如果是自定义目录,确保在
Android.bp
或Android.mk
中被上层Android.bp
/Android.mk
包含,或在build/target/product/
的PRODUCT_PACKAGES
中添加libmybase
。
步骤四:编译
在AOSP根目录下执行:
source build/envsetup.sh
lunch <target>
make libmybase
编译后会生成libmybase.so
,一般在out/target/product/<device>/system/lib[64]/
下。
步骤五:集成到系统镜像
-
确保
libmybase
被添加到PRODUCT_PACKAGES
,这样会自动打包进system.img。 -
例如在
device/<vendor>/<product>/device.mk
中添加:PRODUCT_PACKAGES += libmybase
2. 供系统服务/Framework/应用调用
方式一:JNI调用
- 如果要让Java层调用你的库,需写JNI桥接代码(如
libmybase_jni.so
),并在Java中System.loadLibrary("mybase")
。 - JNI注册时调用你的C/C++接口。
方式二:Native服务/守护进程调用
- 直接在native服务(如system_server、HAL、native daemon)中
#include
你的头文件,链接libmybase
。
方式三:HAL模块依赖
- 在HAL模块的
Android.bp
/Android.mk
中shared_libs
添加libmybase
。
3. 供App调用
- 如果是给App用,需将so放到
/system/lib
或/system/lib64
,App通过System.loadLibrary
加载。 - 或者以AAR/JNI方式集成到App工程。
4. 注意事项
- 命名规范:避免与系统已有库冲突。
- 接口稳定性:如要给多个模块用,接口要稳定,文档要清晰。
- 权限和安全:如涉及敏感操作,注意SELinux策略和权限声明。
- 多架构支持:如需支持arm/arm64/x86等,需分别编译。
总结流程图
external/libmybase/
Android.bp
mybase.c
include/mybase.h
device/<vendor>/<product>/device.mk
PRODUCT_PACKAGES += libmybase
Java/Native/HAL
#include <mybase.h>
System.loadLibrary("mybase")
参考官方文档
一句话总结:
自定义基础库接入Android系统,需写好Android.bp/Android.mk,注册到构建系统,配置PRODUCT_PACKAGES,编译后自动集成到system镜像,并通过JNI或native方式供上层调用。