安卓系统核心库全解析

文章摘要

安卓系统的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.bpAndroid.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.mkshared_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方式供上层调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你一身傲骨怎能输

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值