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

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,具体如下:

bash 复制代码
# 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路径作为参考),这里将文件拷贝到如下路径:

bash 复制代码
.
└── XXX
    └── libs
        ├── arm64-v8a
        │   └── libXXX.so
        └── armeabi-v7a
            └── libXXX.so

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

bash 复制代码
+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分区,验证即可

相关推荐
阿洵Rain2 小时前
【Linux】环境变量
android·linux·javascript
hong1616883 小时前
PhpStorm中配置调试功能
android·ide·phpstorm
DongGei5 小时前
安卓-音频焦点
android·微信·音视频
冬田里的一把火36 小时前
[Android] [SnapdragonCamera] 单摄(横屏)阶段总结
android·数码相机
夏目艾拉6 小时前
flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)
android·java·flutter·设计模式
似霰7 小时前
安卓源码libvulkan“ depends on undefined module “libgpud_sys“报错解决
android
Arms2068 小时前
Android Fragment 学习备忘
android·学习
落魄的Android开发9 小时前
Android 跳转至各大应用商店应用详情页
android
技术无疆9 小时前
DDComponentForAndroid:探索Android组件化方案
android·java·开源·android-studio·组件化
繁依Fanyi10 小时前
【Python 千题 —— 算法篇】数字反转
android·java·开发语言·python·算法·eclipse·tomcat