Подтвердить что ты не робот

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

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

  1. Код моей библиотеки
  2. файл макета и ресурсов
  3. Gradle зависимости от третьих лиц.

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

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

Обновление 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:[email protected]')
        {
            transitive = true
        }
    compile 'com.android.support:appcompat-v7:25.3.0'
    testCompile 'junit:junit:4.12'
}
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Привет @user3572586,

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

  • Это означает, что если вы импортируете файл aar с помощью repo repo вы должны указать зависимости также в своем проекте.

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

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

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

Ответ 3

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

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

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

MainProject ===> libraryModule ===> internallib

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

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

defaultConfig {

 .....
 multiDexEnabled true
 .....
}

Ответ 4

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

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

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

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

Ссылка на плагин gradle: https://github.com/zawn/android-shade-plugin