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

Android 7.0 ではネイティブ ライブラリの名前空間を導入して内部 API の公開を制限し、アプリが独自のライブラリではなく誤ってプラットフォーム ライブラリを使用することがないようにしています。アプリ固有の変更点については、Android デベロッパー ブログの Android 7.0 でのプライベート C/C++ シンボルの制限による安定性の向上に関する記事をご覧ください。

アーキテクチャ

この変更によってシステム ライブラリがアプリ ライブラリから分離されるため、誤って内部システム ライブラリが使用される(逆も同様)リスクが下がります。

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

図 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.txtCOMPANYNAMEawesome.company などのメーカー名)。COMPANYNAME[A-Za-z0-9_.-]+、つまり英数字、_、.(ドット)、- の組み合わせにする必要があります。外部ソリューション プロバイダのライブラリを利用する場合、1 つのデバイス内で複数の .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 以外のシステム ライブラリに依存できません。VNDK-SP ライブラリと LLNDK ライブラリのリストは、development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv で確認できます。

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

この機能が有効になるのは、SDK バージョン 24 以降をターゲットとするアプリに限られます。後方互換性については、表 1: アプリが非公開ネイティブ ライブラリにリンクしている場合に予期される動作をご覧ください。アプリがアクセスできる Android ネイティブ ライブラリ(公開ネイティブ ライブラリとも呼ばれる)のリストは、CDD の 3.1.1 項に記載されています。バージョン 24 以降をターゲットとし、非公開ライブラリを使用しているアプリは、更新する必要があります。詳細については、プラットフォーム ライブラリにリンクしている NDK アプリをご覧ください。