Android - разработайте «автономную» библиотеку для многократного использования - PullRequest
1 голос
/ 22 мая 2019

Я хочу разработать «автономную» библиотеку, которая будет использоваться в других библиотеках.

Вот изображение, иллюстрирующее сценарий использования, который я хочу построить:

Use case illustration

Пояснения

Я разработал CommonLib с использованием сетевых зависимостей, таких как OkHttp, Gson и т. Д. Эта часть сделана спроект Android Studio создал файл aar (и он работает хорошо, спасибо;))

Теперь я хочу использовать этот CommonLib внутри других библиотек с наиболее прозрачным способом, который я могу сделать,Например, я не хочу указывать зависимости okHttp в моем проекте Lib 1 или в проекте My App .

CommonLib

В двух словах, эта библиотека разработана с Kotlin и отвечает за центральный процесс, который я хочу легко использовать повторно.Я показываю вам блок зависимостей моего файла Gradle:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion"
    implementation "com.google.code.gson:gson:$gsonVersion"
    implementation "com.android.support:support-annotations:$supportLibVersion"
    implementation "com.squareup.okhttp3:okhttp:$okhttpVersion"
    implementation "com.squareup.okhttp3:logging-interceptor:$okhttpVersion"
    testImplementation "org.robolectric:robolectric:$robolectricVersion"
    testImplementation "junit:junit:$junitVersion"
}

Решение 1 (лучшее, что я думаю): Частный репо

IЯ настроил плагин Maven в проекте CommonLib , чтобы опубликовать мой файл aar в частном репозитории (я использую Nexus, но это не проблема).Вот мой файл gradle:

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "$url") {
                authentication(userName: "$user", password: "$password")
            }

            pom.groupId = "com.test.common"
            pom.artifactId = "CommonLib"
            pom.version = VERSION_NAME + "." + VERSION_CODE
        }
    }
}

Процесс загрузки работает хорошо, и в моем репозитории я могу найти артефакт CommonLib и связанный файл pom ,следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test.common</groupId>
  <artifactId>CommonLib</artifactId>
  <version>0.3.1</version>
  <packaging>aar</packaging>
  <dependencies>
    <dependency>
      <groupId>org.jetbrains.kotlin</groupId>
      <artifactId>kotlin-android-extensions-runtime</artifactId>
      <version>1.3.31</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.jetbrains.kotlin</groupId>
      <artifactId>kotlin-stdlib-jdk8</artifactId>
      <version>1.3.31</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.5</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>appcompat-v7</artifactId>
      <version>28.0.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>3.12.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>logging-interceptor</artifactId>
      <version>3.11.0</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

Моя проблема: когда я добавляю эту зависимость артефакта в проект Lib 1 , процесс компиляции завершился неудачно из-за NoClassDefFoundError и I'mне единственный .

Если быть более точным, я даю вам конфигурацию проекта Lib 1 .

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url "$url"
        }
    }
}

и

dependencies {
    [...]
    implementation 'com.test.common:CommonLib:0.3.1'
}

Сообщение об ошибке сборки:

Неразрешенная ссылка: имя_пакета

имя_пакета - это пакет, присутствующий в CommonLib

Решение 2 (неплохое): подмодули Android Studio

Теперь, в Lib 1 проекте, я добавляю свой Проект CommonLib как модуль Android Studio.Импорт в порядке, время сборки / компиляции в порядке.Но (к сожалению, есть одно «но»), когда я генерирую свой окончательный файл aar, методы и объекты из CommonLib не внедряются, и я не могу его использовать: (

Решение 3 (самое уродливое): копировать / вставить код

Наконец, я копирую / вставляю исходный код CommonLib внутри Lib 1 проекта.Ха-ха! Это работает! [Вставьте печальный / стыд / слезы смайлик здесь]

Лучшее решение

Ну, я не знаю, и мне нужна ваша помощь,ребята ... Что я могу сделать?

...