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分区,验证即可

相关推荐
顾北川_野14 分钟前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
&岁月不待人&24 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
Winston Wood2 小时前
Android Parcelable和Serializable的区别与联系
android·序列化
清风徐来辽2 小时前
Android 项目模型配置管理
android
帅得不敢出门3 小时前
Gradle命令编译Android Studio工程项目并签名
android·ide·android studio·gradlew
problc3 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
帅得不敢出门14 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了15 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任17 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山17 小时前
Android“引用们”的底层原理
android·java