В 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-разрядной версии) для библиотек от производителей устройств
Это следующие файлы:
/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, для общедоступных библиотек поставщиков действуют следующие дополнительные ограничения и требования к настройке:
- Нативная библиотека в папке vendor должна быть правильно помечена, чтобы приложения могли получить к ней доступ. Если доступ требуется каким-либо приложениям (в том числе сторонним), библиотека должна быть помечена как
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 документа определения совместимости. Приложения, предназначенные для Android 7.0 (уровень API 24) или более поздних версий и использующие любые неопубликованные библиотеки, необходимо обновить. Подробную информацию можно найти в разделе NDK: связывание приложений с библиотеками платформы .
Как обновить приложения, чтобы они использовали нативные библиотеки
В приложениях, предназначенных для SDK версии 31 (Android 12) или выше, необходимо явно указывать зависимости нативных общих библиотек с помощью тега <uses-native-library> в манифесте приложения. Если на устройстве нет какой-либо части запрошенной библиотеки, приложение не будет установлено. После установки приложениям предоставляются только запрошенные ими общие нативные библиотеки. Это означает, что приложения не могут получить доступ к нативным общим библиотекам, которые не указаны в манифесте приложения.