2016-03-16 2 views
6

Невыпущенная библиотека андроида, в которой я работаю, имеет в ней стороннюю сетевую библиотеку - OkHttp в этом случае.создание зависимости от градиента - удаление доступа к его собственным зависимостям

Проекты, которые используют эту библиотеку в качестве зависимости, теперь также могут создавать объекты с помощью этой сетевой библиотеки.

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

+0

Какую цель ставите перед собой?Даже если вы ограничите пользователей библиотеки доступом к OkHttp через вашу библиотеку, они все равно могут добавить OkHttp в качестве зависимости от компиляции и использовать ее. Итак, чего именно вы пытаетесь достичь? – RaGe

+0

Собираете ли вы свою андроидную библиотеку как aar? Вы упаковываете OkHttp с вашим aar? или это транзитивная зависимость, определенная в pom.xml? – RaGe

+0

@RaGe Я ожидаю, что у людей уже есть OkHttp как зависимость от компиляции, или что они могут подумать над ее добавлением. Также есть вероятность, что они будут добавлять/использовать другую версию OkHttp, поэтому я не хочу, чтобы они использовали эту версию в моей библиотеке. Моя библиотека упакована, но bintray ее упаковывает, и люди реализуют ее как зависимость от градиента. OkHttp - это зависимость от градиента моей библиотеки – CQM

ответ

1

Вы могли бы сделать зависимость transitive Однако если ваш код попадает в пропущенный код внутри своего приложения он подведет ClassNotFound или MethodNotFound

dependencies { 
    compile('com.squareup.okhttp3:okhttp:3.2.0') { 
     transitive = false 
    } 
} 

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

Это еще не решит проблему, как вы хотели бы, но вы могли бы использовать proguard для переименования классов okhttp. Пользователи вашей библиотеки все еще могут называть классы okhttp, но они будут переименованы proguard в нечто вроде a, b, c, ...

+0

Можете ли вы рассказать мне больше о транзитивной собственности? Я не уверен в том, какое ограничение это вводит, поэтому моя библиотека сильно использует OkHttp3, если они включают мою библиотеку, она по-прежнему будет работать с методами OkHttp3? Во-вторых, если они импортируют OkHttp3, потому что они также могут его использовать, это предотвратит любые конфликты? – CQM

+0

Это не похоже на результат, который я хочу, у меня есть проект, который использует мою зависимость и добавляет OkHttp через gradle, но у него все еще есть доступ к методам OkHttp. Мне было интересно, есть ли способ сделать его недоступным. – CQM

+0

Добавлен комментарий о proguard для переименования классов, но как только они упакованы в библиотеку lib, вы не можете реально запретить пользователю доступ вашей библиотеки к классам – JBirdVegas

1

Что вы хотите сделать, это shade зависимость. Вот описание от блоге о shading dependencies in Gradle:

затенять библиотека является принять содержимое файлов указанной библиотеки, положить их в собственном банке, и изменить их package.This отличается от упаковки, которая просто отправляет файлы библиотек со стороны вашего собственного баннера , не переставляя их в другой пакет. Термин fatjar обычно используется для обозначения банок, которые имеют приложение как , а также его зависимости, упакованные или затененные в них.

Это легко сделать для небольших библиотек. Я мог бы представить, что это может быть трудно для большой библиотеки, такой как OkHttp. Вы можете сделать это вручную, просто скопировав файлы в свой проект и изменив пакет. Есть также some scripts, которые сделают это автоматически. Обычно они используют Jar Jar Links.

+0

Изменение пакета не предотвратить доступ к этим классам? Делает их неясными и, следовательно, маловероятными для использования, но они все еще доступны для использования приложением, использующим эту банку. – RaGe

1

обычно по умолчанию не имеют зависимости, например, что:

compile rootProject.ext.okhttp 

скомпилирована в вашем банке только ваши источники. Итак, классы OkHttp не будут в вашей библиотеке.

У меня точно такой же случай. Я использую gradle для сборки и загрузки в maven. Вы можете проверить here

Так что, если ваши намерения иметь точную версию DEPT в пакете и быть скрыто нужно просто включить его в вашем проекте как модуль и изменить некоторые вещи, как пакет OkHttp к избегать конфликтов, а также доступ к темным публичным пользователям. OkHttp использует Okio, поэтому вы можете его также приватизировать.

Обратите внимание, что этот вид функции скрытия + скрытия скрытого класса может быть полезен для зависимостей структуры (обеспечивая доступность всех отделов в среде исполнения), но он увеличивает размер ваших библиотек и не будет лучшим вариантом для приложений, использующих ваш lib, поскольку они в любом случае обеспечивают упаковку необходимых отделений в apk.

+0

Итак, вы говорите, что мне нужно клонировать OkHttp, превратить его в банку и скопировать банку в мой проект? И что это не позволит людям, которые используют мою зависимость от доступа к функциям OkHttp? – CQM

+0

вам просто нужно включить его в свой проект как модуль и изменить некоторые вещи, такие как пакет OkHttp, чтобы избежать конфликтов, а также доступ к текущим публичным членам okhttp. OkHttp использует Okio, поэтому вы можете его также приватизировать. Но почему вы действительно хотите это сделать. Это просто увеличит размер вашей библиотеки. Я не вижу другого преимущества. – djodjo

+0

переместил комментарии к ответу – djodjo

 Смежные вопросы

  • Нет связанных вопросов^_^