Android中的系统级共享库

native lib的作用以及使用

  1. 开发时

    • 编译
    • 链接
  2. 运行时

    • 安装路径
    • 加载

Android上面由于分区的限制,libbinder_nkd.so可以帮助vendor分区的native 进程访问system分区的libbinder.so,这个是针对运行时。

对于第三方Native 代码,从编译和链接的层面要使用NDK中提供的libbinder_ndk。从运行时考虑,如果相关代码安装在system分区那么libbinder_ndk也是可以正常链接的,如果安装在vendor分区那么libbinder_ndk也是可以正常链接的。
libbinder_ndk.so
libbinder.so
binder driver

AAOS中的native code无需使用libbinder_ndk,可以直接使用libbinder,比如SurfaceFlinger。


libnativewindow.so定义标准接口

libgui.so提供具体实现
第三方native 应用
libnativewindow.so
libgui.so
SurfaceFlinger


Android中的系统级共享库

这里只总结了system分区的系统级共享库,system_ext、vendor和product分区内的可以类比,具体库因项目而异,因为都是OEM或者Vendor开发的。

1. Java 系统级共享库

安装条件

  1. 要在mk脚本的PRODUCT_PACKAGES中列出,这样才会被编译到。

    比如 build/make/target/product/base_system.mk中的:

    mk 复制代码
    PRODUCT_PACKAGES += \ 
    framework-graphics \
    framework-location \
    framework-minus-apex \
  2. Android.bp或Android.mk中要配置相关属性

    编译脚本属性 功能
    installable true 标记为可安装到系统
    sdk_version "system_current" 使用系统级SDK
    visibility 适当范围 控制模块可见性

    min_sdk_version 和 visibility是可选的

    比如:

    mk 复制代码
     java_library {
         name: "framework-minus-apex",
         defaults: ["framework-minus-apex-defaults"],
         installable: true,
         // For backwards compatibility.
         stem: "framework",
             visibility: [
             "//frameworks/base",
             // TODO(b/147128803) remove the below lines
             "//frameworks/base/apex/blobstore/framework",
             "//frameworks/base/apex/jobscheduler/framework",
             "//frameworks/base/packages/Tethering/tests/unit",
             "//packages/modules/Connectivity/Tethering/tests/unit",
         ],
     }
     
    java_defaults {
        name: "framework-minus-apex-defaults",
        ...
        sdk_version: "core_platform",
        ...
    }

常见的Java系统级共享库

系统级Java共享库安装在system/framework目录下,下面是几个常用的:

库名称 功能
framework.jar framework核心库
framework-res.jar framework资源库
framework-graphic.jar graphic相关的库
services.jar 系统服务相关的库
android.car.jar Android Car相关
uiinput.jar input相关
telephony-common.jar telephony相关

2. native系统级共享库

对第三方的native开发,NDK可以辅助编译和链接;另外对于Android 14和Android 8的Android开发,需要了解VNDK

安装条件

  1. 要在mk脚本的PRODUCT_PACKAGES中列出,这样才会被编译到。
    比如 build/make/target/product/base_system.mk中的:

    mk 复制代码
    PRODUCT_PACKAGES += \ 
    libEGL \
    libgui \
    libinput \
    libui \
  2. 满足下面条件中的一种:

    • 显示要求安装

      在源码中未发现installable: true的native 系统共享库。

      mk 复制代码
      cc_library_shared {
          ...
          installable: true
          ...
      }

      or

      mk 复制代码
      cc_library {
          ...
          installable: true
          ...
      }
    • 被另一个需要安装的模块通过shared_libsstatic_libs等属性所依赖

      比如 libinput.so

    • 是VNDK库

      比如 libgui.so

      mk 复制代码
      cc_library_shared {
      name: "libgui",
      vendor_available: true,
      vndk: {
          enabled: true,
          private: true,
      },
      ...
    • NDK 库

      比如 libvulkan.so

      mk 复制代码
      ndk_library {
       name: "libvulkan",
       symbol_file: "libvulkan.map.txt",
       first_version: "24",
       unversioned_until: "current",
       export_header_libs: [
           "ndk_vulkan_headers",
       ],
      }
      
      cc_library_shared {
        name: "libvulkan",
         llndk: {
             symbol_file: "libvulkan.map.txt",
             export_llndk_headers: [
                 "vulkan_headers",
             ],
         }
       ...
      }
    复制代码

安装的native系统级共享库(小部分):

库名称 功能
libc.so C 标准库实现
libdl.so 动态链接器接口
libbinder.so Binder核心库
libbinder_ndk Binder NDK库(LL-NDK)
libinput.so 输入系统的库
libinputflinger.so inputflinger的实现库
libgui.so 实现了BLSTBufferQueue等
libui.so 有Gralloc等,用于访问Gralloc和mapper的HAL实现
libEGL EGL实现
libGLESv3 openGLES API实现
libvulkan.so Vulkan API 实现
相关推荐
两个人的幸福online2 小时前
php开发者 需要 协程吗
android·开发语言·php
修炼者3 小时前
WindowManager(WMS)构建全局悬浮窗
android
xiaoshiquan12064 小时前
Android Studio里,SDK Manager显示不全问题
android·ide·android studio
Lstone73644 小时前
Bitmap深入分析(一)
android
一起搞IT吧5 小时前
Android功耗系列专题理论之十四:Sensor功耗问题分析方法
android·c++·智能手机·性能优化
ByNotD0g6 小时前
Doris 学习笔记
android·笔记·学习
修炼者6 小时前
【Android进阶】 RenderEffect的底层实现
android
bropro6 小时前
MySQL不使用子查询的原因
android·数据库·mysql