Обновление версий библиотеки вызывает сбой сборки в проекте, который зависит от библиотеки - PullRequest
3 голосов
/ 08 марта 2019

Мы поддерживаем библиотеку Android. В последнее время мы обновили gradle, compileSdkVersion и версии поддержки библиотеки. (только используя com.android.support:design). Также мы обновили gcm-play-services Библиотека публикуется в Artifactory со своими зависимостями также в pom-файле. Это обновление отлично работает в проектах с современными инструментами сборки и вспомогательными библиотеками. Однако мы столкнулись с проблемой устаревших проектов, которые используют нашу библиотеку. Вот версии библиотеки.

gradle android plugin -> 3.2.1
compileSdkVersion -> 28
targetSdkVersion -> 28
support library version -> 28.0.0

Вот версии проекта

compileSdkVersion -> 26
targetSdkVersion 26
support library version -> 26.0.1

и зависимости клиентской библиотеки поддержки

implementation 'com.android.support:cardview-v7:' + androidSupportV
implementation 'com.android.support:recyclerview-v7:' + androidSupportV
implementation 'com.android.support:appcompat-v7:' + androidSupportV
implementation 'com.android.support:design:' + androidSupportV
implementation 'com.android.support:support-v4:' + androidSupportV
implementation 'com.android.support:support-annotations:28.0.0'

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

AGPBI: {"kind":"error","text":"error: resource android:attr/dialogCornerRadius not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values-v28/values-v28.xml","position":{"startLine":8,"startColumn":4,"startOffset":447,"endLine":11,"endColumn":12,"endOffset":684}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/dialogCornerRadius not found.","sources":[{"file":"/Users/umutyusuf/Documents/repo/core-bootstrap/core-android-client-app/PointrSample-Ozion-v5.0.8/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml","position":{"startLine":10}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/fontVariationSettings not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values/values.xml","position":{"startLine":1303,"startColumn":4,"startOffset":70911,"endColumn":68,"endOffset":70975}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/ttcIndex not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values/values.xml","position":{"startLine":1303,"startColumn":4,"startOffset":70911,"endColumn":68,"endOffset":70975}}],"original":"","tool":"AAPT"}

Мы избегаем каких-либо манипуляций в коде проекта, поэтому попытались решить это в библиотеке.

Мы понижаем все версии до соответствия версиям проекта. И опубликовал его снова с

compileSdkVersion -> 26
targetSdkVersion 26
support library version -> 26.0.1

Но после этого мы сталкиваемся с явной ошибкой слияния

Error:
    Attribute meta-data#android.support.VERSION@value value=(26.0.1) from [com.android.support:cardview-v7:26.0.1] AndroidManifest.xml:25:13-35
    is also present at [com.android.support:support-v4:26.1.0] AndroidManifest.xml:28:13-35 value=(26.1.0).
    Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:23:9-25:38 to override

Это происходит от gcm-play-services, у которого есть транзитивная зависимость support-v4: 26.1.0, указанная в дереве зависимостей.

и, чтобы разрешить это, добавили это в манифест

<meta-data
            tools:node="replace"
            tools:replace="android:value"
            android:name="android.support.VERSION"
            android:value="26.0.1" />

Это заставило все это работать. Но каковы же недостатки использования этого метатега в файле AndroidManifest?

Мы проверили этот подход со всей compileSdkVersion 26, 27, 28 и все соответствующие версии библиотеки поддержки. Кажется, все работает.

Мы ищем лучшие подходы к этому.

Альтернативное решение, которое мы попробовали

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

1 Ответ

1 голос
/ 18 марта 2019

Эти метаданные манифеста могут вызвать проблемы, если ваш клиент использует вспомогательную библиотеку, которая принудительно поддерживает другую версию android.support в своем манифесте.Поэтому избегайте использования этой строки в вашем SDK.Публикация с областью действия «предоставлено» также не будет работать и приведет к сбоям, если ваш клиент не предоставляет библиотеку поддержки, как вы сказали.

Решение, которое я нашел, состояло в том, чтобы использовать support: design: 27.1.0.Это волшебная библиотека, которая не конфликтует с любыми другими версиями библиотек поддержки.После нескольких дней попыток я был очень рад видеть, что это решает эту проблему и не вызывает сбоев, если сторонняя версия использует другую версию поддержки.Надеюсь, это решит и вашу проблему.

...