Пространства имен для собственных библиотек

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

Архитектура

В 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, публичные библиотеки поставщиков имеют следующие дополнительные ограничения и необходимые настройки:

  1. Собственная библиотека поставщика должна быть правильно помечена, чтобы приложения могли получить к ней доступ. Если доступ требуется каким-либо приложениям (включая сторонние приложения), библиотека должна быть помечена как same_process_hal_file в файле file_contexts конкретного поставщика следующим образом:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    где libnative.so — это имя собственной библиотеки.
  2. Библиотека ни напрямую, ни транзитивно через свои зависимости не должна зависеть от системных библиотек, отличных от библиотек ВНДК-СП и ЛЛНДК. Найдите список библиотек VNDK-SP и LLNDK по development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv .

Обновление приложений, чтобы они не использовали непубличные собственные библиотеки.

Эта функция включена только для приложений, предназначенных для SDK версии 24 или более поздней; информацию об обратной совместимости см. в таблице 1. Чего ожидать, если ваше приложение компонуется с частными собственными библиотеками . Список собственных библиотек Android, доступных приложениям (также известных как общедоступные собственные библиотеки), указан в разделе 3.1.1 CDD. Приложения, предназначенные для версии 24 или более поздней версии и использующие любые частные библиотеки, должны быть обновлены. Дополнительные сведения см. в разделе «Приложения NDK, связывающиеся с библиотеками платформы» .

Обновление приложений для зависимостей их собственных библиотек

Приложения, предназначенные для SDK версии 31 (Android 12) или более поздней версии, должны явно указать зависимости своей собственной общей библиотеки с помощью тега <uses-native-library> в манифесте приложения. Если какая-либо часть запрошенной библиотеки не существует на устройстве, приложение не устанавливается. При установке приложений им предоставляются только те собственные общие библиотеки, которые они запрашивали. Это означает, что приложения не могут получить доступ к собственным общим библиотекам, которые не указаны в манифесте приложения.