Предположим, я создаю библиотеку Android и хочу использовать ConstraintLayout. Я вижу два разных подхода других создателей библиотек:
1. Добавьте его с помощью ключевого слова implementation. Обратной стороной является то, что если кто-то добавляет мою библиотеку в проект и не имеет компоновки ограничений в зависимостях, сборка завершится ошибкой с такими ошибками: error: attribute 'com.example.test:layout_constraintBottom_toBottomOf' not found.
2. Добавьте его с помощью api. Таким образом, он компилируется нормально, но если какая-либо другая библиотека использует компоновку ограничений с другими версиями, это может привести к ошибке Android dependency 'com.android.support.constraint:constraint-layout:1.1.2' has different version for the compile (1.0.0) and runtime (1.1.2).
Какой способ имеет наименьшую стоимость обслуживания кода клиента?
Дело не в самой низкой стоимости обслуживания клиентского кода. Это о том, нужна ли клиенту транзитивная зависимость - ConstraintLayout - для компилировать против вашей библиотеки. Независимо от того, используете ли вы implementation или api, транзитивная зависимость всегда будет зависимостью время выполнения клиента.
Вот вопрос, который вам нужно задать себе: используете ли вы ConstraintLayout или какие-либо другие элементы транзитивной библиотеки в сигнатурах методов или свойствах общедоступного API вашей библиотеки, то есть в том, что используется клиентом? Если да, то вам следует объявить библиотеку компоновки ограничений как api. В противном случае используйте implementation.