Как создать библиотеку android из кода, который имеет зависимость от градиента?

Я новичок в разработке Android. Я застрял с некоторыми проблемами без решения более месяца. Пожалуйста, помогите мне, если это возможно.

Я создаю андроидную библиотеку, имеющую зависимости на основе следующих компонентов.

  1. Мой код библиотеки
  2. Файл макета и ресурсов
  3. Зависимости от третьих сторон.

Сначала я думаю о создании .jar-файла для моей библиотеки, но потом я понял, что файлы laulyoit и resources не скомпилированы с банкой. Затем я решил создать файл AAR. Пожалуйста, предложите, правильно ли это, или есть ли другая альтернатива?

Теперь основная проблема: я застрял с зависимостями градиентов. Мы создаем платную библиотеку, которая использует некоторые третьи стороны, такие как google, только доступные через Gradle. Теперь, когда я создаю файл AAR, не будет файлов Manifest.xml и Gradle, как я могу интегрировать третьи патчи с моим собственным кодом. И у нас есть строгие инструкции, которые мы не должны сообщать пользователям библиотеки о включении этих третьих сторон. Говоря простыми словами, мы не можем позволить пользователям узнать, какие третьи стороны используют наша библиотека. Так что я могу создать файл AAR, который также имеет соответствующие зависимости градиента, не раскрывая пользователю то, что мы используем.

Я могу объяснить более подробно, если есть какие-либо недоразумения с вышеуказанным текстом. Пожалуйста, дайте мне знать ваши ответы, если это возможно.

Заранее спасибо.

Обновление 1

Вот мой build.gradle для библиотеки

apply plugin: 'com.android.library' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" multiDexEnabled true testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } dexOptions { preDexLibraries = false javaMaxHeapSize "4g" // 2g should be also OK } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:+' compile 'com.google.android.gms:play-services-vision:10.2.1' testCompile 'junit:junit:4.12' } 

После того, как я перемещаю свой .aar-файл на локальный maven и создаю, используя выходной файл в приложении Project. Вот такой град.

 apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.jarvis.myapplication" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile('com.company:mylibrary:1.0@aar') { transitive = true } compile 'com.android.support:appcompat-v7:25.3.0' testCompile 'junit:junit:4.12' } 

Solutions Collecting From Web of "Как создать библиотеку android из кода, который имеет зависимость от градиента?"

Если вы создаете проект .aar, есть файл манифеста, и он будет слит с манифестом приложений при компиляции. Все работает отлично. Вы можете использовать любую зависимость градиента в проекте .aar, даже при запутывании и подписи proguard.

Чтобы скомпилировать библиотеку .aar в главном приложении, поместите ее так, как это, в dependencies от вашего файла build.grade:

 dependencies { compile(name:'your_lib_name', ext:'aar') } 

Вы должны скопировать файл .aar в папку libs папке вашего app .

Но ясно одно: если кто-то использует ваш .aar-файл, он или она может смотреть в объединенный файл манифеста в андроид-студии в любое время, и вы не можете скрывать свои зависимости . По крайней мере, насколько я знаю. Android сильно зависит от библиотек с открытым исходным кодом (даже через maven), и в большинстве случаев вам даже придется включать лицензии на используемые внешние библиотеки, видимые пользователю как элемент меню или ссылку в вашем приложении. В противном случае вы нарушаете лицензии и, возможно, даже Условия использования в некоторых случаях. Вы не можете скрыть их.

Вы можете создать файл *.aar со всеми необходимыми зависимостями в проекте библиотеки.

Теперь добавьте этот * .aar- файл либо вручную, либо как модуль зависимости к целевому проекту. Как только основной проект будет объединен, это даст объединенный Android Manifest file .

Следующая структура имеет проект библиотеки ( libraryModule ), добавленный как зависимость от основного проекта. Снова библиотечный модуль имеет внутреннюю зависимость для internallib

 MainProject ===> libraryModule ===> internallib 

Введите описание изображения здесь

В соответствии с вашим комментарием проблему multidex можно решить, добавив следующее в build.gradle (Module: app)

 defaultConfig { ..... multiDexEnabled true ..... } 

Привет @ user3572586,

  • Файл aar не содержит транзитивных зависимостей и не имеет файла pom, который описывает зависимости, используемые библиотекой.

  • Это означает, что если вы импортируете файл aar с использованием ретрансляции flatDir, вам необходимо указать зависимости в вашем проекте.

  • Вы должны использовать репозиторий maven (вам нужно публиковать библиотеку в частном или публичном репозитории maven), у вас не будет такой же проблемы.

  • В этом случае gradle загружает зависимости, используя файл pom, который будет содержать список зависимостей.

Чтобы скрыть платный lib от пользователя, лучше создайте пакет для отдельной библиотеки внутри вашего проекта, затем сгенерируйте файл .aar. Я сам создаю один поток в прямом эфире lib, который сталкивается с проблемой на этом модуле зависимостей времени, переходят в мой проект, а затем делают файл .aar.

Во-первых: файлы AAR проявляются. И, если вы используете граду для их создания, у них будут скрипты построения градиента.

Итак, первая часть вашей проблемы спорная. Просто создайте библиотеку AAR и добавьте зависимости, используя плагин gradle-maven (gradle) или плагин maven-android (maven).

Для второй части немного сложнее. То, что вы хотите, по существу, представляет собой затененный AAR или Uber-AAR, файл AAR, который привносит в себя зависимости. Вы можете добиться этого, используя плагин maven-shade или плагин с градиентным оттенком (в зависимости от того, какую систему вы используете для создания aar). При таком подходе у ваших клиентов может возникнуть серьезная проблема. Вы видите, что в java ваш проект работает с концепцией областей зависимостей и classpath. Области – это момент, когда нужна зависимость и кто ее приносит. Classpath – это весь набор классов, используемых проектом, как из зависимостей, так и из самого проекта (поэтому клиент всегда сможет узнать, что вы используете, потому что компилятор также должен знать). Следовательно, вы не можете иметь несколько версий зависимостей в пути, потому что классы будут сталкиваться, что делает проект невозможным для компиляции. Вот почему мы обычно не пытаемся скрывать, какие зависимости мы используем; Это позволяет легче разрешать конфликты. Если вы используете популярную зависимость (например, карты Google), вы рискуете, что ваша библиотека станет проблемой для ваших клиентов и, следовательно, будет отброшена. Было бы лучше для вас разработать библиотеку с разработанными контрактами, а затем вторичный плагин с конкретной реализацией с использованием определенных зависимостей. Таким образом, вы будете проектировать, будет легче поддерживать и не привязываться к зависимостям. В этом случае, если худшее произойдет, а зависимости вашей реализации несовместимы с проектами вашего клиента, будет проще создать вторичную реализацию без ущерба для вашего кода.

Ссылка на плагин maven shade: https://maven.apache.org/plugins/maven-shade-plugin/

Ссылка на плагин оттенка градиента: https://github.com/zawn/android-shade-plugin