Android中的系统级共享库

Android系统级开发--Framework层 前言:一直没有下决心来好好弄一个博客,这次准备在csdn上好好做一个。先把以前的文章搬家整理一下~ 正文... 首先想说的是,做Android系统级开发其实是件很简单的事情。 这部分我会分成Framework层,基于NDK的so库及bionic库,Kernel三部分来写 下完android source后,编译的过程如下: cd mydroid_sourc 阅读详情

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中的:

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

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

    min_sdk_version 和 visibility是可选的

    比如:

     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.jarframework核心库
framework-res.jarframework资源库
framework-graphic.jargraphic相关的库
services.jar系统服务相关的库
android.car.jarAndroid Car相关
uiinput.jarinput相关
telephony-common.jartelephony相关

2. native系统级共享库

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

安装条件

  1. 要在mk脚本的PRODUCT_PACKAGES中列出,这样才会被编译到。
    比如 build/make/target/product/base_system.mk中的:
    PRODUCT_PACKAGES += \ 
    libEGL \
    libgui \
    libinput \
    libui \
    
  2. 满足下面条件中的一种:
    • 显示要求安装
      在源码中未发现installable: true的native 系统共享库。

      cc_library_shared {
          ...
          installable: true
          ...
      }
      

      or

      cc_library {
          ...
          installable: true
          ...
      }
      
    • 被另一个需要安装的模块通过shared_libs、static_libs等属性所依赖
      比如 libinput.so

    • 是VNDK库
      比如 libgui.so

      cc_library_shared {
      name: "libgui",
      vendor_available: true,
      vndk: {
          enabled: true,
          private: true,
      },
      ...
      
    • NDK 库
      比如 libvulkan.so

      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.soC 标准库实现
libdl.so动态链接器接口
libbinder.soBinder核心库
libbinder_ndkBinder NDK库(LL-NDK)
libinput.so输入系统的库
libinputflinger.soinputflinger的实现库
libgui.so实现了BLSTBufferQueue等
libui.so有Gralloc等,用于访问Gralloc和mapper的HAL实现
libEGLEGL实现
libGLESv3openGLES API实现
libvulkan.soVulkan API 实现
Android系统级共享库从编译到调用:原理、流程与高频坑全解 在Android系统开发与Framework定制中,动态链接器与so库的运作机制是绕不开的基础知识。系统级共享库不同于普通so,它位于系统分区,具备跨进程可见性与系统级生命周期,是系统服务、JNI调用和HAL层通信的枢纽。理解其编译方式(如Android.bp中的cc_library配置)、可见性控制(如public.libraries.txt白名单)以及运行时隔离(如linker namespace与SELinux策略)的实际原理,有助于解决dlopen失败、符号找不到、权限拦截等高频问题。这些技术点广泛 阅读详情

相关推荐

Android进程注入实战:从ptrace基础到Zygote系统级控制

进程注入是操作系统层面的核心技术,它允许一个进程动态地将代码加载到另一个进程的地址空间中执行。其原理主要基于系统调用和内存管理机制,通过修改目标进程的执行流或内存映射来实现代码植入。这项技术的核心价值在于无需修改目标程序源码即可实现深度监控、行为分析和功能扩展,广泛应用于安全研究、性能调试和动态分析等领域。在Android生态中,ptrace作为Linux内核提供的进程跟踪接口,是实现进程注入的底层基础,而Zygote作为所有应用进程的孵化器,则提供了系统级注入的可能。本文将以ptrace和Zygote为切

weixin_30387799的博客 318

Android系统级共享库实战:从AOSP到Android.bp的完整解析

在Android系统开发中,共享库是连接应用与底层系统的关键桥梁。与普通App依赖的私有库不同,系统级共享库以分区为边界、以链接器为枢纽,通过VNDK、LLNDK、SELinux和签名权限共同构建一套严格的可见性与调用体系。理解这些机制,不仅能解答“系统库和Gradle依赖有何区别”的困惑,更能帮助开发者把握Zygote加载流程、分区镜像编译和OTA兼容性等底层逻辑。无论是将Android Studio项目迁移至AOSP,还是为厂商定制系统添加原生服务,掌握cc_library_shared、java_li

weixin_29189363的博客 178

Android WebView内核更新实战:从系统集成到X5内核应用

WebView作为移动应用内嵌网页渲染的核心组件,其内核版本直接决定了H5页面的兼容性、性能与安全性。在Android生态中,系统WebView的版本碎片化问题尤为突出,不同设备可能运行着从Chromium 44到100+的各个版本,导致对ES6+、CSS Grid等现代Web特性的支持参差不齐,甚至存在已知安全漏洞。为解决这一问题,开发者需要掌握内核更新的核心技术,其价值在于实现对Web渲染环境的强管控,确保复杂H5交互的稳定运行。常见的应用场景包括为自有ROM集成最新内核、在独立App中捆绑X5内核,或

dieqiao8331的博客 436

Android系统级共享库实战:linker、namespace与SELinux避坑指南

系统级共享库是Android平台的基石,它们由动态链接器(linker)在进程启动时加载,并通过namespace机制实现模块隔离与ABI稳定。理解其工作原理,对于ROM移植、Framework定制及厂商中间件开发至关重要。本文从实际项目出发,围绕系统级共享库的构建、加载与调试,详细解析了Android.bp配置、JNI静态注册、SELinux权限策略以及常见的linker错误。通过分析一个因namespace隔离导致的SIGSEGV案例,揭示了Android不同版本间的行为差异。还介绍了readelf、d

weixin_42116058的博客 330

Android16 添加应用共享库

这里把需要添加的so名添加到列表里面,最终会解析生成到/system/etc/public.libraries.txt里面,这样就可以多个应用共享调用。

tzj1058756809的博客 120

避坑指南:DDR4内存条Margin测试Fail?从Intel RMT工具到PCB Layout的完整排错思路

本文深入探讨了DDR4内存条在Margin测试中Fail的完整排错思路,从Intel RMT工具分析到PCB Layout优化。通过实战案例,详细解析了信号完整性问题的诊断与解决方案,包括拓扑结构影响、传输线参数优化及HyperLynx仿真验证,为硬件设计工程师提供了宝贵的避坑指南。

weixin_42530458的博客 450

Android系统级共享库开发与优化实践

动态链接库(Dynamic Linking Library)作为操作系统核心组件,通过共享代码机制提升系统运行效率。在Android生态中,系统级共享库(如libbinder.so、libgui.so)承担着进程通信、图形渲染等关键功能,其性能直接影响应用流畅度。通过Binder IPC机制和SurfaceFlinger合成器等技术原理,这些库实现了跨进程通信与图形处理的底层支持。开发者可通过NDK动态加载和符号查找等技术手段调用系统库,但需注意版本兼容性与性能优化。在视频编辑、高性能渲染等场景中,合理使用

weixin_29192365的博客 269

ContextCapture导入点云进行重建

ContextCapture导入点云进行重建

天桥飞熊的博客 1万+

Folia sync-server 部署教程:3 条路线让多设备 AI 主题自动同步

在台式机上把 Folia 的歌词动画、字体和背景调到满意,换手机打开却全变回默认——这套折腾没法原样带走。Folia 仓库自带 sync-server,花半小时部署一次,你自己的多台设备就能共用同一份 AI 主题和外观设置。这篇文章讲清 Folia sync-server 怎么部署、Token 怎么生成、客户端怎么连通。 [![Folia 客户端界面](https://raw.gitcode.c

gitblog_00850的博客 420

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5556

GmSSL国密双证书实战:从生成到Nginx配置全流程

本文详细介绍了使用GmSSL工具生成国密双证书(签名证书与加密证书)并配置Nginx支持国密HTTPS(TLCP协议)的全流程。内容涵盖环境准备、自签CA创建、服务器双证书生成、Nginx单向/双向认证配置以及兼容性处理,为部署符合国密标准的HTTPS服务提供实战指南。

weixin_29276847的博客 479

UE5安卓移动端内存分析手段简介及使用案例分享

UE5作为一个复杂庞大的引擎,用它制作出的游戏,如果不加注意,往往在制作的过程中一不小心就超过了目标平台的硬件性能限制。今年我们能在PC、主机等高端平台上见到不少优化存在一定问题的UE5游戏,高端平台尚且如此,那么针对移动端平台的游戏,性能优化就显得更为重要了。内存就是性能指标中非常关键的一项,降低游戏运行时的内存占用,对游戏最终的性能表现和稳定性影响很大。本文就将介绍一些UE5安卓移动端内存分析手段,它们各自的作用,我们在使用过程中遇到的踩坑点,以及使用案例;抛砖引玉,欢迎大佬批评指正!

a42027756的博客 2176

YOLOv11改进 - 卷积Conv | GCNet之金箍棒块GCBlock : 重参数化捕获全局依赖 | CVPR 2025

文介绍了GCBlock在YOLOv11中的结合应用。GCBlock是GCNet的核心组件,能高效捕获特征图中的全局依赖关系,融合了非局部网络和挤压 - 激励网络的优势,降低计算成本并保障模型性能。其遵循“上下文建模 - 特征变换 - 特征融合”框架,通过全局平均池化、全连接层等操作生成注意力权重。我们将GCBlock集成进YOLOv11,替代原有的部分卷积模块,实现更高效的全局上下文建模。实验证明,YOLOv11-GCBlock在目标检测任务中表现出色,展现了GCBlock在深度学习中的广泛应用前景。

魔改工程师的博客 906

Paddle-Lite部署终极指南:静态库vs共享库的10个关键选择策略

Paddle-Lite作为飞桨高性能深度学习端侧推理引擎,在移动端和边缘设备部署中提供了静态库和共享库两种链接方式。本文将为您详细解析这两种库类型的10个关键选择策略,帮助您在不同场景下做出最优决策。无论您是移动应用开发者、嵌入式工程师还是边缘计算专家,这份指南都能为您的AI模型部署提供专业指导。 ## Paddle-Lite架构与工作流程概览 [![Paddle-Lite深度学习推理引擎架构

gitblog_00502的博客 1016

使用n8n搭建服务器监控系统:从Webhook到Telegram告警的完整实现

本文介绍基于n8n工作流平台搭建轻量级服务器监控系统的完整方案,通过Webhook接收监控数据、Token认证、阈值检查和Telegram告警推送,实现7x24小时自动化监控。整个系统由7个可视化节点组成,支持CPU、内存、磁盘、网络流量等多维度指标监控,告警阈值可灵活配置。相比传统的Prometheus或Zabbix方案,配置更简单、资源消耗更低,适合1-50台中小规模服务器的监控需求。实测表明从部署到上线仅需30分钟,告警响应延迟小于1秒,完全满足生产环境要求。

todoitbo的博客 1万+

【测开求职】面试题:数据结构 吐血整理

本篇文章是笔者为准备研究生复试以及校招而写,因此主要针对问答,注重理解,而不在于细节计算。涵盖考研范围内的所有知识内容,读者可以先查看上面的链接走一遍数据结构的整体框架结构。其中,重点难点以及易混淆的知识点,笔者用其他近30篇文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 7065

eCapture共享库探测:动态链接库自动发现机制

在现代网络通信中,TLS/SSL加密技术已成为保护数据传输安全的标准方案。然而,在安全审计、故障排查和性能分析等场景下,安全工程师往往需要解密和分析加密流量。传统的中间人攻击(MITM)方法需要部署CA证书,操作复杂且存在安全风险。 eCapture作为基于eBPF技术的无证书TLS/SSL明文捕获工具,其核心技术之一就是**动态链接库自动发现机制**。这项技术能够智能识别系统中的加密库文件,无...

gitblog_00441的博客 1089

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 328

Android BaseDexClassLoader源码阅读

摘要:BaseDexClassLoader是Android类加载体系的核心类,负责从APK的dex文件中加载类。主要变量包括管理dex文件路径的DexPathList对象pathList,以及用于共享库加载的sharedLibraryLoaders等。其核心方法findClass实现了类加载的三级优先级流程:先尝试共享库加载器,再通过pathList查找dex文件,最后使用低优先级共享库加载器。此外还提供findLibrary、addDexPath等方法来处理Native库和资源加载。该类构建了Androi

u012116089的博客 971

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

详解安卓应用性能测试方法以及Android SDK中辅助测试的工具使用

  Android前端APP的性能测试一般针对以下几个方面:应用启动时间;CPU的占用;内存的占用;流量的耗用;电量的耗用;流畅度等。一般对App进行性能测试都需要借助不同的工具完成,本章节会向读者重点介绍针对不同的性能测试指标该选用哪种工具以及工具的具体使用方法。(文章很有用,但是有点长,建议收藏!)   因为Android 手机是Linux内核,最简单的命令就是使用top命令查看手机的 cpu、内存的占用情况。   具体操作:   PC中成功安装Android SDK   手机成功连接P...

linjingyg的博客 1416

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

KitsuneMagisk架构深度解析:无痕系统级修改与安全隔离的技术实现

KitsuneMagisk作为Magisk生态的重要分支,通过创新的**系统级无痕修改**和**安全隔离机制**,为Android设备提供了深度定制能力。本文将从架构设计、核心原理、技术对比和应用场景三个层面,解析其如何实现系统级功能扩展与安全检测规避的平衡。 ## 一、核心理念:系统级无痕修改 ### 1.1 设计哲学与架构决策 KitsuneMagisk的核心设计理念建立在**系统镜像非

gitblog_00423的博客 325

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度起底:Android 系统级开发与硬件交互落地实践(JNI、CAN/串口、休眠唤醒与高频 UI 优化)

本文介绍了Android系统级硬件交互开发的架构设计与实现方案。首先通过JNI和NDK编译C++动态库实现串口通信,包括CMake配置和POSIX接口调用。其次,采用Kotlin协程管理硬件状态机,确保线程安全。针对系统休眠唤醒场景,设计了WakeupController缓冲机制。最后提出高频数据流下的UI优化策略,建议将数据流按模块拆分并独立更新,避免全局刷新导致的性能问题。文章总结了系统级开发的关键点:深入理解Linux内核机制、严格线程安全控制、引入时序缓冲区和定向属性更新等,为Android在车载、

自我记录贴 320

Framework几个面试题

ART、Dalvik和JVM的关系及区别是什么?这是道送分题,并不是真的要说出它们的深度区别,但如果你不知道ART是什么,我觉得你不够关注行业发展,靠这个平台吃饭,不关心它,怎么都说不过去。        ART 就是 Android Runtime ,是安卓4.4之后的系统的新的虚拟机模式,改模式提升了运行效率,启用该模式之后,系统在安装APP的时候,会进行一次预编译,把代码转成机器语

wed110的专栏 1万+

Android知识体系-基于Linux系统内核-核心目录

内核参数和系统配置的文件夹,如/proc/sys/kernel、/proc/sys/net等。系统网络配置和统计信息的文件夹,如/proc/net/tcp、/proc/net/udp等。进程PID的信息,其中PID是进程的标识符,如/proc/1表示进程1的信息。一些其他的杂项数据文件,例如Wi-Fi的配置文件、VPN的配置文件等。系统平均负载的信息,包括最近1分钟、5分钟和15分钟的平均负载。应用程序的缓存数据,例如应用程序的临时文件、下载的临时文件等。

m0_67060810的博客 1705

Perfetto 系统级 Tracing 安全模型深度解析:Android/Linux 下 Producer、Consumer 与可信边界设计

本文基于 Perfetto 官方设计文档 [docs/design-docs/security-model.md](https://link.gitcode.com/i/af015702affbe4c1384256e7dc0ed00a),结合仓库内 `tracing_service_impl.cc`、`packet_stream_validator` 系列源码与 `perfetto.rc` 配置,

gitblog_00259的博客 10
上一篇: Android Graphics - openGL and Vulkan小结
一只特立独行的Yang
博客等级 码龄12年 105粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值