Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

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

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_.-]+、つまり英数字、「_」、「.」(ドット)、「-」と一致する必要があります。外部ソリューション プロバイダのライブラリを使用する場合は、デバイスで複数の .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 アプリをご覧ください。