Android Framework 常见解决方案(29)添加应用开发的共享库

server/2024/10/21 14:46:00/

1 原理说明

通过设置配置文件public.libraries.txt以及在system分区下添加so动态库的方式,让系统扩展动态库。关于动态库的拷贝较为简单,直接配置即可,这里主要解读下配置文件public.libraries.txt。

1.1 public.libraries.txt配置文件是什么?

system/etc/public.libraries.txt 是 Android 系统中的一个配置文件,它的作用是声明一组可以被应用程序使用的原生(native)库。这个文件是 Android 运行时环境的一部分,用于定义哪些本地库(以 .so 文件形式存在)可以被应用程序动态加载和链接。

注意:在android系统中,如果想要修改这个文件,修改的路径为:$AOSP/system/core/rootdir/etc/public.libraries.android.txt

1.2 为什么要引入public.libraries.txt配置文件?

system/etc/public.libraries.txt 文件在 Android 系统中的设计目的是为了明确指定哪些本地库(.so 文件)可以被应用程序访问。这个文件列出了系统允许加载的本地库的名称,从而限制了应用程序能够链接和使用的库集合。这样的设计主要解决了以下问题:

  • 安全性和隔离性:通过限制应用程序能够访问的本地库,Android 系统能够提高安全性和隔离性。这防止了应用程序无意中或恶意地访问或依赖于系统内部的库,这些库可能包含敏感的内部 API 或实现细节。
  • 避免应用程序崩溃:在 Android 7.0(API 级别 24)及以后的版本中,系统默认不允许应用程序动态链接或加载非公共的本地库。这样做可以避免应用程序因为依赖于系统内部库而在运行时崩溃,特别是当这些内部库的版本或实现在未来的系统更新中发生变化时。
  • 提供稳定的应用环境:通过确保应用程序只能使用在 public.libraries.txt 中声明的库,Android 为开发者提供了一个更稳定的运行时环境。这有助于减少因系统更新导致的兼容性问题,并确保应用程序在不同版本的 Android 系统上的行为一致。
  • 控制库的可见性:public.libraries.txt 文件允许设备制造商和芯片供应商添加他们自己的库到公共库列表中,这样应用程序就可以使用这些库。这为设备制造商和芯片供应商提供了一种机制,使他们能够提供额外的功能和优化,同时保持应用程序的兼容性和稳定性。
  • 简化应用程序的构建和分发:通过明确指定可用的本地库,Android 系统简化了应用程序的构建和分发过程。开发者不需要担心他们的应用程序因为使用了不兼容的库而在某些设备上无法运行。同时,这也有助于减少因为库冲突导致的应用程序安装失败的情况。

综上所述,system/etc/public.libraries.txt 文件的设计是为了提高 Android 系统的安全性、稳定性和兼容性,同时为设备制造商和开发者提供了必要的工具来扩展和优化他们的应用程序和设备。

2 修改方案(通用)

这里假设要添加的库为libXXX.so,分为ArmV7和armV8两套ARM架构。

先修改配置文件,路径为:$AOSP/system/core/rootdir/etc/public.libraries.android.txt,在其中添加libXXX.so,具体如下:

# See https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
libandroid.so
libaaudio.so
libamidi.so
libbinder_ndk.so
libc.so
libcamera2ndk.so
libdl.so
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libGLESv3.so
libicu.so
libicui18n.so
libicuuc.so
libjnigraphics.so
liblog.so
libmediandk.so
libm.so
libnativehelper.so
libnativewindow.so
libneuralnetworks.so nopreload
libOpenMAXAL.so
libOpenSLES.so
libRS.so
libstdc++.so
libsync.so
libvulkan.so
libwebviewchromium_plat_support.so
libz.so
+libXXX.so

之后配置libXXX.so,将其分别放到路径(自定义即可,这里使用$AOSP/framework/base/data/libs路径作为参考),这里将文件拷贝到如下路径:

.
└── XXX└── libs├── arm64-v8a│   └── libXXX.so└── armeabi-v7a└── libXXX.so

接下来配置路径,一般在device/{platform}/base.mk中作修改,添加如下内容:

+PRODUCT_COPY_FILES += \
+    frameworks/base/data/libs/XXX/libs/arm64-v8a/libXXX.so:$(TARGET_COPY_OUT_SYSTEM)/lib64/libXXX.so \
+    frameworks/base/data/libs/XXX/libs/armeabi-v7a/libXXX.so:$(TARGET_COPY_OUT_SYSTEM)/lib/libXXX.so

之后编译system分区,验证即可


http://www.ppmy.cn/server/4880.html

相关文章

ES6的Set与Map

在ES6之前,我们存储数据的结构主要有两种:数组、对象,而在ES6中新增了另外两种数据结构:Set、Map。 一、什么是Set? Set是ES6新增的数据结构,类似数组,但是它的元素成员是唯一的。 Set的使用&am…

Android 性能优化(七):APK安装包体积优化

包体积优化重要性 移动 App 特别关注投放转化率指标,而 App 包体积是影响用户新增的重要因素,而 App 的包体积又是影响投放转化率的重要因素。 Google 2016 年公布的研究报告显示,包体积每上升 6MB 就会带来下载转化率降低 1%, …

Linux中断——嵌入式Linux驱动开发

参考正点原子I.MX6U嵌入式Linux驱动开发指南 一、简介 先来简单了解一般中断的处理方法: ①、使能中断,初始化相应的寄存器。 ②、注册中断服务函数,也就是向 irqTable 数组的指定标号处写入中断服务函数 ③、中断发生以后进入 IRQ 中…

idm线程越多越好吗 idm线程数多少合适 IDM百度云下载 IDM下载器如何修改线程数

IDM(Internet Download Manager)是一款流行的网络下载器,它支持多线程下载,这意味着它可以同时建立多个连接来下载文件的不同部分,从而提高下载速度。我们在使用IDM的时候总是有很多疑问,今天我们学习IDM线…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败,报如下错误: Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

SpringMVC(三)【REST 风格】

1、REST 风格 1.1、REST 简介 REST(Representational State Transfer),表现形式状态转换 在开发中,它其实指的就是访问网络资源的格式 1.1.1、传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user…

移植speexdsp到OpenHarmony标准系统③

speexdsp移植后已提交至openhamrony sig仓库:https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp 四、将三方库加入到OpenHarmony的编译体系 根据上一步分析结果,编写gn文件,将三方库加入到OpenH…

Python 中整洁的并行输出

原文:https://bernsteinbear.com/blog/python-parallel-output/ 代码:https://gist.github.com/tekknolagi/4bee494a6e4483e4d849559ba53d067b Python 并行输出 使用进程和锁并行输出多个任务的状态。 注:以下代码在linux下可用&#xff0c…