Совместное использование библиотеки Android между несколькими приложениями Android с помощью Gradle

У меня есть приложения для Android A и B. Я хочу извлечь дубликат кода из каждого в общую библиотеку L. Как я могу сделать это с помощью Gradle? Я видел несколько вариантов этого вопроса, который задавали раньше, но ответов было очень мало.

Самый близкий / лучший из уже заданных вопросов:

Несколько приложений Android в зависимости от библиотеки Android с gradle

Первый ответ предлагает родительский проект, который включает в себя как приложения, так и библиотечный модуль. Это соединение нежелательно, отчасти потому, что A, B и L находятся в их собственном репозитории Git, но также потому, что это потребует наличия родительского проекта и файлов сборки, которые было бы трудно поместить в систему управления версиями (или потребовало бы ручного копирования другие проекты). Поскольку Android Studio по умолчанию любит родительскую сборку для одномодульных проектов ... Ну, это просто много родителей для того, что должно быть простой семьей. Это действительно похоже на ненужную связь между проектами, которые в остальном совершенно не связаны.

Второй ответ включает выпуск AAR в репо и ссылку на удаленную библиотеку в каждом проекте. Я был бы в порядке с этим подходом, поскольку у нас есть локальный репозиторий Nexus, но, похоже, нет простого способа сделать это без ручного управления версиями / именования и загрузки файлов (это неприемлемо). Я пытаюсь использовать плагин Sonatype gradle-release, но, похоже, он предназначен для JAR (не AAR).

Это просто похоже на множество движущихся частей, составляющих самую простую форму совместного использования кода между приложениями Android. Есть ли у кого-нибудь лучшее решение?


person Tremelune    schedule 10.01.2014    source источник
comment
Если я пойду вторым путем, это будет уместно: vandalsoftware.com/post/52468430435/   -  person Tremelune    schedule 10.01.2014


Ответы (2)


Согласно официальному документу Android (https://developer.android.com/studio/projects/android-library.html): при импорте модуля модуль библиотеки копируется в ваш проект, поэтому вы можете редактировать код библиотеки. Если вы хотите сохранить одну версию кода библиотеки, то это, вероятно, не то, что вам нужно, и вместо этого вам следует импортировать скомпилированный файл AAR, как описано выше.

Есть еще один вариант - подмодуль git. Вы можете сделать так, чтобы ваше приложение ссылалось на SHA вашей библиотеки. Так что для библиотеки есть только одна копия. Каждое приложение использует только SHA. Немного больше внимания следует уделить управлению филиалами библиотеки. Подробности см. Здесь: https://github.com/blog/2104-working-with-submodules

person Ziwei Zeng    schedule 24.05.2017

Мне удалось удалить много материалов аутентификации SonaType, поскольку у нас есть собственное репозиторий Nexus, в котором он не используется. Мой файл gradle.build (файл модуля, а не корень) в итоге выглядел так:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.1'
    }
}
apply plugin: 'android-library'
apply plugin: 'maven'

version = 0.3
group = "com.whatevs.android.commons"

uploadArchives {
    repositories.mavenDeployer {

        repository(url: 'http://nexus.whatevs.net:8081/nexus/content/repositories/internal-release') {
        }

        pom.project {
            packaging 'aar'

            scm {
                url 'scm:git:ssh://[email protected]:7999/Mobile/android-commons.git'
                connection 'scm:git:ssh://[email protected]:7999/Mobile/android-commons.git'
                developerConnection 'scm:git:ssh://[email protected]:7999/Mobile/android-commons.git'
            }
        }
    }
}

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
    }
    release {
        runProguard false
        proguardFile 'proguard-rules.txt'
        proguardFile getDefaultProguardFile('proguard-android.txt')
    }
}

dependencies {
}
person Tremelune    schedule 13.01.2014
comment
Единственная проблема заключается в том, что загрузка архива находится в com.whatevs.android.commons / Common / version, и я действительно не хочу, чтобы Common был там. Не знаю, как это убить. - person Tremelune; 13.01.2014