Android 12 如何加载 native 原生库

在 Android 7.0 及更高版本中,系统库与应用库是分开的。

图1. 原生库的命名空间

原生库的命名空间可防止应用使用私有平台的原生 API(例如使用 OpenSSL)。该命名空间还可以避免应用意外使用平台库(而非它们自己的库)的问题(如使用 libpng 时)。应用库很难意外使用内部系统库(反之亦然)。

除了标准的公共原生库之外,芯片供应商(从 Android 7.0 起)和设备制造商(从 Android 9 起)还可以选择提供可供应用访问的其他原生库,方法是将它们放在相应的库文件夹中,并在 .txt 文件中显式列出它们。

库文件夹是:

  • /vendor/lib(对于芯片供应商的 32 位库)和 /vendor/lib64(对于芯片供应商的 64 位库)
  • /system/lib(对于设备制造商的 32 位库)和 /system/lib64(对于设备制造商的 64 位库)

.txt 文件是:

  • /vendor/etc/public.libraries.txt(对于芯片供应商的库)
  • /system/etc/public.libraries-COMPANYNAME.txt(对于设备制造商的库),其中 COMPANYNAME 指的是制造商的名称(例如 awesome.company)。COMPANYNAME 应符合 [A-Za-z0-9_.-]+ 格式(字母数字字符 , _, .(点)和 -。如果某些库来自外部解决方案提供商,则可以在设备中包含多个此类 .txt 文件。

设备制造商公开的 system 分区中的原生库必须 命名为 lib*COMPANYNAME.so,例如 libFoo.awesome.company.so。 换句话说,没有公司名称后缀的 libFoo.so 不得公开。库文件名中的 COMPANYNAME 必须与列出库名称的 txt 文件名称中的 COMPANYNAME 匹配。

作为 AOSP 一部分的原生库不得公开(默认情况下公开的标准公共原生库除外)。只有芯片供应商或设备制造商添加的其他库可供应用访问。

以 SDK 版本 31 (Android 12) 或更高版本为目标平台的应用必须在应用清单中使用 <uses-native-library> 标记显式指定其原生共享库依赖项。如果设备上不存在所请求库的任何部分,则未安装应用。应用安装时,系统仅向他们提供已请求的原生共享库。这意味着,应用无法访问应用清单中未显示的原生共享库。

如果应用以 Android 11(API 级别 30)或更低版本为目标平台,则无需使用 <uses-native-library> 标记。在这种情况下,任何原生共享库均可访问,而不管它是否为 NDK 库。

此元素还会影响应用在特定设备上的安装。如果此元素存在并且其 android:required 属性设置为 true,则 PackageManager 框架将不允许用户安装应用,除非用户设备上存在相应的库。

下一部分详细介绍了 android:required 属性。

XML 复制代码
<uses-native-library
  android:name="string"
  android:required=["true" | "false"] />

android:name

库文件的名称。

android:required

布尔值,指示应用是否需要 android:name 指定的库。

  • "true":如果没有此库,则应用将无法正常运行。系统不允许将应用安装在没有此库的设备上。
  • "false":如果此库存在,应用会使用此库,但必要时也可在没有此库的情况下运行。 系统允许安装应用,即使不存在此库也是如此。如果您使用 "false",则需要自行负责妥善处理库不存在的情况。

默认值为 "true"

例如在Application 中:

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
<--
权限添加
-->
    
    <application
        android:name=".CameraApplication"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:extractNativeLibs="true"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:requestLegacyExternalStorage="true"
        android:resizeableActivity="false"
        android:roundIcon="@mipmap/ic_launcher"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:exported="true"
  
            android:theme="@style/Theme.AppCompat.NoActionBar.Fullscreen" />
        
        <uses-native-library android:name="***.so" android:required="false" />
        <uses-native-library android:name="***.so" android:required="false" />
        <uses-native-library android:name="***.so" android:required="false" />
    </application>

</manifest>
相关推荐
开心呆哥4 分钟前
【如何使用 ADB 脚本批量停止 Android 设备上的所有应用】
android·adb
CYRUS STUDIO1 小时前
ARM64汇编寻址、汇编指令、指令编码方式
android·汇编·arm开发·arm·arm64
weixin_449310842 小时前
高效集成:聚水潭采购数据同步到MySQL
android·数据库·mysql
Zender Han2 小时前
Flutter自定义矩形进度条实现详解
android·flutter·ios
白乐天_n4 小时前
adb:Android调试桥
android·adb
姑苏风8 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
数据猎手小k11 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
你的小1012 小时前
JavaWeb项目-----博客系统
android
风和先行12 小时前
adb 命令查看设备存储占用情况
android·adb
AaVictory.13 小时前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list