Доступ к общедоступным ресурсам библиотеки 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
в ресурсах их приложения реж. Но, надеюсь, кто-то найдет это полезным, так как это жизнеспособное решение главной проблемы здесь.