У меня проблема с выполнением обновления библиотек в моем проекте. Я наткнулся на все, и в основном кажется, что все в порядке. Однако проблема связана с lib androidx.fragment:fragment. Согласно дереву зависимостей он должен быть разрешен до 1.5.4. Проблема в том, что в дереве MyActivity -> AppCompatActivity -> FragmentActivity оказывается, что для AppCompatActivity используется androidx.appcompat:appcompat:1.5.1, а для FragmentActivity androidx.fragment:fragment:1.0.0 . При проверке другого проекта, созданного с тем же стеком и той же версией библиотек, выясняется, что FragmentActivity разрешается как версия 1.1.0.
Gradle верхнего уровня:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
kotlinVersion = '1.7.22'
rxJavaVersion = '2.2.21'
rxKotlinVersion = '2.4.0'
rxAndroidVersion = '2.1.1'
bindingLibraryVersion = '4.0.0'
koinVersion = '3.1.5'
retrofitVersion = '2.9.0'
navComponents = "2.5.3"
corutinesVersion = '1.6.4'
androidLifecycleVersion = '2.5.1'
roomVersion = '2.4.3'
appCenterSdkVersion = '3.3.0'
playServicesVersion = '21.0.1'
workVersion = '2.7.1'
firebaseBOM = '31.1.0'
cameraxVersion = "1.1.0"
moshiVersion = "1.13.0"
stetho = '1.6.0'
ZxingVersion = "3.4.1"
}
repositories {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.1'
classpath 'com.google.gms:google-services:4.3.14'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navComponents"
}
}
plugins {
id "org.jetbrains.kotlin.jvm" version "$kotlinVersion"
}
allprojects {
ext {
androidVersionCode = getVersionCode()
androidVersionName = getVersionName()
storePassword = getStorePassword()
minSdkVersion = 26
targetSdkVersion = 31
compileSdkVersion = 33
}
repositories {
google()
mavenCentral()
maven { url "https://jitpack.io" }
jcenter() //left due to shipbook. Cannot find proper repository for it
}
}
градация основного модуля:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-parcelize'
apply plugin: 'kotlin-kapt'
apply plugin: "androidx.navigation.safeargs.kotlin"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':data')
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$androidLifecycleVersion"
implementation "androidx.lifecycle:lifecycle-process:$androidLifecycleVersion"
implementation "androidx.navigation:navigation-fragment-ktx:$navComponents"
implementation "androidx.navigation:navigation-ui-ktx:$navComponents"
implementation 'com.google.android.material:material:1.7.0'
implementation "me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:$bindingLibraryVersion"
implementation "me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:$bindingLibraryVersion"
implementation "io.insert-koin:koin-android:$koinVersion"
implementation("io.insert-koin:koin-core:$koinVersion", {
exclude group: 'androidx.lifecycle', module: 'lifecycle-extensions'
})
implementation "com.facebook.stetho:stetho:$stetho"
implementation "com.facebook.stetho:stetho-okhttp3:$stetho"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$corutinesVersion"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${corutinesVersion}"
// Import the BoM for the Firebase platform
implementation platform("com.google.firebase:firebase-bom:$firebaseBOM")
implementation "com.google.firebase:firebase-analytics-ktx"
implementation 'com.google.firebase:firebase-dynamic-links-ktx'
implementation 'com.google.firebase:firebase-crashlytics'
implementation 'com.google.firebase:firebase-messaging'
implementation 'com.google.firebase:firebase-perf-ktx'
implementation 'com.google.firebase:firebase-config-ktx'
implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:18.1.0'
implementation 'com.google.android.gms:play-services-mlkit-text-recognition:18.0.2'
implementation "androidx.camera:camera-core:$cameraxVersion"
implementation "androidx.camera:camera-camera2:$cameraxVersion"
implementation "androidx.camera:camera-lifecycle:$cameraxVersion"
implementation "androidx.camera:camera-view:$cameraxVersion" //no newer version can applied for now due to issues with compatibility
implementation "androidx.security:security-crypto:1.0.0"
implementation "com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}"
implementation "com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}"
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion"
implementation 'com.caverock:androidsvg-aar:1.4'
implementation "com.google.zxing:core:$ZxingVersion"
implementation ('io.shipbook.shipbooksdk:shipbooksdk:1.6.0', {
exclude group: 'androidx.fragment', module: 'fragment'
})
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
}
Я пытался очистить проект, удалив файлы библиотеки каталогов gradle для версии 1.0.0, но он продолжает возвращаться. Я понятия не имею, что искать. Я проверил дерево зависимостей, разрешенное gradle, но в версии 1.0.0 или 1.1.0 нет ничего о фрагменте.
Мне нужна последняя версия FragmentActivity, чтобы использовать требуемую мной версию ComponentActivity для некоторого своего нового кода.
РЕДАКТИРОВАТЬ Добавление
implementation 'androidx.fragment:fragment-ktx:1.5.4'
тоже ничего не меняй. Удаление подозрительных исключений для шипбука тоже ничего не дает.
Обновлено еще раз: это FragmentActivity, которого я не хочу:
и это то, что мне нужно:
Это было просто предположение, чтобы случайно не использовать старую зависимость от этой библиотеки. Сделано в рамках экспериментов, которые могут привести к неправильной версии. Это ничего не меняет, тем более, что это просто библиотека удаленного логирования
Я даже удалил это утверждение, и эффект остался прежним.
Вы уверены, что правильно читаете дерево зависимостей? Текущий выпуск appcompat зависит от версии 1.3.6 библиотеки фрагментов, маловероятно, что он даже будет работать, если вместо этого вы можете заставить Gradle разрешить его до 1.0.0 (Gradle разрешает конфликты версий, используя самую высокую запрошенную версию). Если вы хотите 1.5.4, явно добавьте зависимость, и вот что вы получите! FragmentContainerView получил getFragment() метод в 1.4.0 - посмотрите, есть ли у вас доступ к этому
Я точно уверен. Поскольку речь идет не о чтении дерева зависимостей, поскольку исходная студия Android показывает мне версию, отображаемую в заголовке окна. Я ищу правильную версию FragmentActivity, которая импортирует Component Activity из пакета действий, чтобы содержать backpresseddispatcher
@cactustictacs Я добавил скриншоты с информацией, которую я имею в виду. Из этих загруженных источников я знаю, что FragmentActivity в версии 1.0.0 импортирует другой пакет ComponentActivity, чем в версии 1.1.0.
Я не знаю, какие источники вы просматриваете, но вы можете запустить задачу dependencies Gradle (вкладка Gradle сбоку окна, значок слона для запуска задачи), чтобы увидеть дерево зависимостей и то, как оно разрешено. например для проекта, который я открыл, в зависимости appcompat он имеет зависимость androidx.fragment:fragment:1.3.6 -> 1.5.4, что означает, что appcompat использовал версию 1.3.6, но на самом деле используется версия 1.5.4 (поскольку другая зависимость указывает более высокую версию, в данном случае потому, что это было добавлено явно в build.gradle). Вот что строится
Подробнее здесь docs.gradle.org/current/userguide/…
Да, я занимался этим. Эти источники явно указывают, что было решено. Да, по зависимостям gradle разрешается до 1.5.4, но почему-то используется 1.0.0. Источники наиболее явные, так как я просто открываю суперкласс в AndroidStudio и на панели инструментов вижу версию. Я также вижу импорт, который мне не нужен (неправильный пакет для импорта ComponentActivity)
Также, если я удалю из кеша Gradle 1.0.0 пакет фрагмента, когда я создам этот проект, он снова появится
Выявленная проблема заключалась в зависимостях от пакета спецификации Firebase и расположения сервисов Play, определенных на уровне данных (чистая архитектура -> уровень, отвечающий только за обработку соединений с базой данных и API). Решение заключалось в том, чтобы исключить зависимость фрагментов от их импорта.
implementation("com.google.android.gms:play-services-location:$playServicesLocationVersion", {
exclude group: 'androidx.fragment'
})
// Import the BoM for the Firebase platform
implementation platform("com.google.firebase:firebase-bom:$firebaseBOMVersion")
implementation('com.google.firebase:firebase-messaging', {
exclude group: 'androidx.fragment'
})
Почему вы делаете эту «группу исключения:« androidx.fragment », модуль:« фрагмент »»?