ネイティブライブラリの名前空間

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Android 7.0 では、内部 API の可視性を制限し、アプリが独自のライブラリではなくプラットフォーム ライブラリを誤って使用する状況を解決するために、ネイティブ ライブラリの名前空間が導入されました。アプリケーション固有の変更については、Android 7.0 のプライベート C/C++ シンボル制限による安定性の向上Android 開発者ブログ投稿を参照してください。

建築

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 の一部であるネイティブ ライブラリを公開してはなりません (デフォルトで公開されている標準のパブリック ネイティブ ライブラリを除く)。アプリからアクセスできるのは、シリコン ベンダーまたはデバイス メーカーによって追加された追加のライブラリのみです。

Android 8.0 以降、ベンダーのパブリック ライブラリには、次の追加の制限と必要な設定があります。

  1. ベンダーのネイティブ ライブラリは、アプリからアクセスできるように適切にラベル付けする必要があります。アプリ (サード パーティのアプリを含む) でアクセスが必要な場合、ライブラリは次のようにベンダー固有のfile_contextsファイルでsame_process_hal_fileとしてラベル付けする必要があります:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    ここで、 libnative.soはネイティブ ライブラリの名前です。
  2. ライブラリは、依存関係を通じて直接的または推移的に、VNDK-SP および LLNDK ライブラリ以外のシステム ライブラリに依存してはなりません。 development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csvで VNDK-SP および LLNDK ライブラリのリストを見つけます。

非公開のネイティブ ライブラリを使用しないようにアプリを更新する

この機能は、SDK バージョン 24 以降を対象とするアプリケーションでのみ有効です。下位互換性については、 表 1 を参照してください。アプリがプライベート ネイティブ ライブラリにリンクしている場合に予想されること.アプリからアクセスできる Android ネイティブ ライブラリ (パブリック ネイティブ ライブラリとも呼ばれます) のリストは、CDD セクション 3.1.1 に記載されています。 24 以降を対象とし、非公開ライブラリを使用するアプリは更新する必要があります。詳細については、プラットフォーム ライブラリにリンクする NDK アプリを参照してください。

ネイティブ ライブラリの依存関係に合わせてアプリを更新する

SDK バージョン 31 (Android 12) 以降をターゲットとするアプリケーションは、アプリ マニフェストで<uses-native-library>タグを使用して、ネイティブ共有ライブラリの依存関係を明示的に指定する必要があります。要求されたライブラリの一部がデバイスに存在しない場合、アプリはインストールされません。アプリがインストールされると、要求したネイティブ共有ライブラリのみが提供されます。これは、アプリ マニフェストに表示されないネイティブ共有ライブラリにアプリがアクセスできないことを意味します。