В 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, публичные библиотеки поставщиков имеют следующие дополнительные ограничения и требуемые настройки:
- Собственная библиотека поставщика должна быть правильно помечена, чтобы приложения могли к ней получить доступ. Если доступ требуется каким-либо приложениям (включая сторонние), библиотека должна быть помечена как
same_process_hal_file
в файлеfile_contexts
поставщика следующим образом: где/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
libnative.so
— имя нативной библиотеки. - Библиотека, ни напрямую, ни транзитивно через свои зависимости, не должна зависеть от системных библиотек, отличных от библиотек 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>
в манифесте приложения. Если какая-либо часть запрошенной библиотеки отсутствует на устройстве, приложение не устанавливается. При установке приложениям предоставляются только запрошенные ими собственные общие библиотеки. Это означает, что приложения не могут получить доступ к собственным общим библиотекам, не указанным в манифесте приложения.