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

相关推荐
似霰1 小时前
安卓adb shell串口基础指令
android·adb
fatiaozhang95273 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO4 小时前
Android APP 热修复原理
android·app·hotfix
鸿蒙布道师4 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师4 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
大耳猫5 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白5 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度
dpxiaolong6 小时前
RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)
android·windows
tangweiguo030519877 小时前
Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案
android
老狼孩111227 小时前
2025新版懒人精灵零基础及各板块核心系统视频教程-全分辨率免ROOT自动化开发
android·机器人·自动化·lua·脚本开发·懒人精灵·免root开发