В Android 7.0 были введены пространства имен для нативных библиотек, чтобы ограничить видимость внутреннего API и разрешить ситуации, когда приложения случайно используют библиотеки платформы вместо своих собственных. Подробнее об изменениях, специфичных для приложений, см. в статье блога разработчиков Android «Повышение стабильности с помощью ограничений на использование частных символов C/C++ в Android 7.0» .
Архитектура
В Android 7.0 и более поздних версиях системные библиотеки отделены от библиотек приложений.

Рисунок 1. Пространства имен для собственных библиотек.
Пространства имен для нативных библиотек предотвращают использование приложениями собственных API, принадлежащих частной платформе (как это было сделано с OpenSSL). Это также исключает ситуации, когда приложения случайно используют библиотеки платформы вместо своих собственных (как это наблюдалось с libpng ). Библиотекам приложений сложно случайно использовать внутренние системные библиотеки (и наоборот).
Добавить дополнительные нативные библиотеки
В дополнение к стандартным общедоступным нативным библиотекам, производители микросхем (начиная с Android 7.0) и производители устройств (начиная с Android 9) могут предоставлять дополнительные нативные библиотеки, доступные для приложений, размещая их в соответствующих папках библиотек и явно указывая их в текстовых файлах.
Папки библиотеки:
-
/vendor/lib(для 32-битных систем) и/vendor/lib64(для 64-битных систем) — это каталоги библиотек от производителей микросхем. -
/system/lib(для 32-битных систем) и/system/lib64(для 64-битных систем) — это каталоги библиотек от производителей устройств.
Текстовые файлы:
-
/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 в имени текстового файла, в котором указано имя библиотеки.
Нативные библиотеки, входящие в состав 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> в манифесте приложения. Если какая-либо часть запрошенной библиотеки отсутствует на устройстве, приложение не будет установлено. При установке приложениям предоставляются только те нативные разделяемые библиотеки, которые они запросили. Это означает, что приложения не могут получить доступ к нативным разделяемым библиотекам, которые не указаны в манифесте приложения.