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

Android 7.0 представил пространства имен для собственных библиотек, чтобы ограничить видимость внутреннего API и разрешить ситуации, когда приложения случайно используют библиотеки платформы вместо своих собственных. См Улучшение стабильности с Private C / C ++ Symbol Ограничения в 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, публичные библиотеки поставщика имеют следующие дополнительные ограничения и необходимые настройки:

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

Обновление приложений, чтобы не использовать нативные библиотеки, не являющиеся общедоступными

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

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

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