Доступ к общедоступным ресурсам библиотеки Android, которая зависит от других библиотек, вызывает предупреждение о том, что эти ресурсы помечены как частные

Я создал библиотеку для Android, которая сама зависит от appcompat и design поддержка библиотек. Я отметил все ресурсы моей библиотеки как частные, поместив фиктивный ресурс в свою библиотеку. Public.xml:

<public name="string_res_that_does_not_exist" type="string"/>

Когда я импортирую свою библиотеку в другой проект, Android Studio выдает предупреждения в строках, которые использовали публичные ресурсы из appcompat а также design библиотеки, такие как:

  • ?colorPrimary
  • ?colorPrimaryDark
  • ?colorAccent
  • ?selectableItemBackground

Предупреждение говорит The resource @attr/<resource-name> is marked as private in <my-library-name>,

Эта проблема, похоже, связана с моей проблемой: https://code.google.com/p/android/issues/detail?id=183120

Основная причина здесь в том, что когда библиотека зависит от другой библиотеки, она импортирует все ресурсы из любых библиотек, от которых зависит, в свой собственный объявленный R.txt (в файле AAR). Тем не менее, он не включает в себя объявление public.txt из этих зависимостей, поэтому теперь он заканчивает тем, что выставляет эти символы как объявленные, но не публичные - например, private.

Как я могу предотвратить отображение этих предупреждений, чтобы другие пользователи моей библиотеки не сталкивались с этими проблемами?

2 ответа

2021 г.

Теперь я верю, если вы установите флаг:

android.nonTransitiveRClass=true

внутри твоего файл, это остановит доступность ресурсов из библиотек, от которых вы зависите, через вашу библиотеку.

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

Если вы хотите сделать String Значения приватные для вашего библиотечного проекта, вы можете сделать что-то вроде этого:

Пример:

// This annotation will restrict everything in this class to the library project.
@RestrictTo(RestrictTo.Scope.LIBRARY)
public final class MyPrivateStrings
{
    public static final String SUPER_SECRET_STRING = "I wet my pants in the 6th grade,"
                   + "this information can’t escape the library!";

    private MyPrivateStrings()
    {

    }
}

Изменить: Это может быть не точный ответ, который ищет OP, потому что они говорят, что они должны сохранить свои Strings в ресурсах их приложения реж. Но, надеюсь, кто-то найдет это полезным, так как это жизнеспособное решение главной проблемы здесь.

Другие вопросы по тегам