Android 7.0 представил пространства имен для собственных библиотек, чтобы ограничить внутреннюю видимость API и разрешить ситуации, когда приложения случайно используют библиотеки платформы вместо своих собственных. См. запись в блоге Improving Stability with Private C/C++ Symbol Restrictions in Android 7.0 Android Developers для изменений, специфичных для приложений.
Архитектура
В 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, доступных для приложений (также известных как публичные нативные библиотеки), указан в разделе CDD 3.1.1. Приложения, ориентированные на 24 или более поздние версии и использующие любые непубличные библиотеки, должны быть обновлены. Подробнее см. в разделе Приложения NDK, связывающиеся с библиотеками платформы .
Обновите приложения для их собственных зависимостей библиотек.
Приложения, ориентированные на SDK версии 31 (Android 12) или выше, должны явно указывать свои собственные зависимости общей библиотеки с помощью тега <uses-native-library>
в манифесте приложения. Если какая-либо часть запрошенной библиотеки отсутствует на устройстве, приложение не устанавливается. Когда приложения устанавливаются, им предоставляются только те собственные общие библиотеки, которые они запросили. Это означает, что приложения не могут получить доступ к собственным общим библиотекам, которые не отображаются в манифесте приложения.