Пространства имен для собственных библиотек

В Android 7.0 появились пространства имён для нативных библиотек, чтобы ограничить видимость внутреннего API и решить проблемы, когда приложения случайно используют библиотеки платформы вместо своих собственных. Подробнее об изменениях, касающихся конкретных приложений, см. в статье «Повышение стабильности с помощью ограничений на использование частных символов C/C++ в Android 7.0» блога разработчиков 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 в имени файла библиотеки ДОЛЖНО совпадать с COMPANYNAME в имени txt-файла, в котором указано имя библиотеки.

Нативные библиотеки, входящие в состав AOSP, НЕ ДОЛЖНЫ быть общедоступными (за исключением стандартных общедоступных нативных библиотек, которые являются общедоступными по умолчанию). Доступ к приложениям можно сделать только к дополнительным библиотекам, добавленным поставщиками микросхем или производителями устройств.

Начиная с Android 8.0, публичные библиотеки поставщиков имеют следующие дополнительные ограничения и требуемые настройки:

  1. Собственная библиотека поставщика должна быть правильно помечена, чтобы приложения могли к ней получить доступ. Если доступ требуется каким-либо приложениям (включая сторонние), библиотека должна быть помечена как same_process_hal_file в файле file_contexts поставщика следующим образом:
    /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 .

Начиная с Android 15, публичные библиотеки поставщиков можно размещать в APEX-пакете поставщика . При упаковке в APEX-пакет поставщика перечислите библиотеки в свойстве provideNativeLibs манифеста APEX.

Обновите приложения, чтобы они не использовали непубличные нативные библиотеки.

Эта функция доступна только для приложений, ориентированных на SDK версии 24 или более поздней; информацию об обратной совместимости см. в таблице 1. Чего ожидать, если ваше приложение линкуется с закрытыми нативными библиотеками . Список нативных библиотек Android, доступных приложениям (также известных как публичные нативные библиотеки), приведен в разделе 3.1.1 CDD. Приложения, ориентированные на SDK версии 24 или более поздней и использующие любые непубличные библиотеки, следует обновить. Подробнее см. в разделе «Слинковка приложений NDK с библиотеками платформы» .

Обновите приложения с учетом их собственных библиотечных зависимостей.

Приложения, ориентированные на SDK версии 31 (Android 12) или выше, должны явно указывать зависимости собственных общих библиотек с помощью тега <uses-native-library> в манифесте приложения. Если какая-либо часть запрошенной библиотеки отсутствует на устройстве, приложение не устанавливается. При установке приложениям предоставляются только запрошенные ими собственные общие библиотеки. Это означает, что приложения не могут получить доступ к собственным общим библиотекам, не указанным в манифесте приложения.