gradle "Error: Program type already present: "


ライブラリのバージョン更新中に以下のようなエラーが出ました。

```
Error: Program type already present: android.arch.lifecycle.ViewModel
```

# エラーについて

このエラーについて、[Android Studio ユーザーガイド : 重複クラスエラーを修正する](https://developer.android.com/studio/build/dependencies#duplicate_classes) に説明があります。

> 
```
Program type already present com.example.MyClass
```
このエラーは通常、以下のいずれかの状況で発生します。
・バイナリ依存関係に含まれているライブラリが、直接的な依存関係としてアプリにも含まれている場合。たとえば、アプリでライブラリ A とライブラリ B に対する直接的な依存関係が宣言されているものの、すでにライブラリ A のバイナリにライブラリ B が含まれている場合などです。この問題を解決するには、ライブラリ B を直接的な依存関係から削除します。
* アプリにローカル バイナリ依存関係があり、同じライブラリに対するリモート バイナリ依存関係も存在する場合。この問題を解決するには、バイナリ依存関係の一方を削除します。


# 例

`build.gradle` ファイル

```
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {

    // 移行中の古い環境です
    //ext.kotlin_version = "1.4.0"
    ext.kotlin_version = "1.2.51"
    repositories {
        google()
        jcenter()
    }
    dependencies {

        // 移行中の古い環境です
        //classpath "com.android.tools.build:gradle:4.0.1"
        classpath "com.android.tools.build:gradle:3.2.1"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
```


`app/build.gradle` ファイル

```
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.gradleerrorsample"
        minSdkVersion 24
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:2.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation 'android.arch.lifecycle:extensions:1.0.0'
}
```

`Make Project` 等、ビルドを行うと以下のようなエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16480/ee204bdf-f63c-1843-a6a7-269d86545f8f.png)

```
Error: Program type already present: android.arch.lifecycle.ViewModel
```

## 調査 1

該当するクラスを import してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16480/7f0c1b62-65c7-d930-da15-2bb0b2adf8f6.png)


`android.arch.lifecycle.ViewModel` は
`android.arch.lifecycle:extensions:1.0.0` に定義されているようです。


## 調査 2

`gradle app:dependencies` を実行し、依存関係を出力してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16480/bf684991-7ac6-d1d9-b080-55198996d8a2.png)

151行目に `android.arch.lifecycle:viewmodel:1.1.1` があります。
依存先をたどると `com.android.support:appcompat-v7:28.0.0` が依存しています。
これにより、クラス名が衝突しているようです。

また、[Lifecycle リリース # バージョン1.1.0](https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=ja#1.1.0) を参照すると、lifecycle:extensions はviewmodel を含めることをやめているようです。


## 対応

`android.arch.lifecycle:extension:1.1.1` に更新して、ビルド自体は解決です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16480/fbbb8d07-b917-a5c4-fd15-1c3195727a3c.png)




# その他

Android Gradle Plugin ( `com.android.tools.build:gradle:` )  を更新すると、このエラーは以下のように出力されます。
わかりやすくなってます。
(ライブラリの更新はまめにしましょう)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16480/8c08fd47-590f-5538-c296-69cce954acaa.png)