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