👾

OpenCVを使ったAndroidアプリを作ったらビルドは通るのにAPK作るとエラーが出た

2023/06/22に公開

はじめに

BuildConfig関連のエラーです。

  • Androidアプリを作るとき、稀にModuleをインポートしてプロジェクトの中に入れる時があります。
  • で、この時、GradleがProject, Module:appともう一つModule:opencvのように追加したModuleのGradleが追加される時があります。
  • 今回はそんな時に発生する可能性のあるエラーの解消法について述べます。

エラー内容(症状)

  • ビルドは通る
  • アプリ(デバッグ)で実行可能

ここからリリース用のapkを作成すると

> Task :app:mergeDexRelease FAILED
AGPBI: {"kind":"error","text":"Type com.example.BuildConfig is defined multiple times

で、リリース用のapk, aabを作成できません。

解決法

これはBuildConfigが重複しているため発生しているエラーです。

手順1

Moduleを追加している場合、そのModuleにもBuildConfigが存在します。
opencvの場合はopencv/java/パッケージ名 にあります。

もし、BuildConfigがない場合は、追加したModuleのGradleに'buildConfig true'を追加してください

android{
    buildFeatures {
        buildConfig true
        aidl true
    }
}

で、BuildConfigのLIBRARY_PACKAGE_NAMEを変えましょう

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String LIBRARY_PACKAGE_NAME = "あなたのパッケージ名.任意";
  public static final String BUILD_TYPE = "debug";
}

このLIBRARY_PACKAGE_NAMEがそのまま自分のパッケージ名だけだった場合、エラーの原因はこれだと思います。
LIBRARY_PACKAGE_NAMEは元々'com.example'みたいな状態だと思います。
これを'com.example.opencv'みたいに変更を加えましょう。
'public static final String LIBRARY_PACKAGE_NAME = "com.example.opencv"'
このopencvの部分は任意の文字列です。Moduleの名前がいいでしょう。

その後、ModuleのGradleのnameSpaceを変更しましょう。

android{
    namespace 'あなたのパッケージ名.任意'
}

ここのnamespaceはLIBRARY_PACKAGE_NAMEと同じにしてください。

android{
    //例えばこんな感じ
    namespace 'com.example.opencv'
}

そしたらBuildCleanをしてください。

手順2

BuildCleanしたり、Buildしたらエラーが出ると思います。
これは正しいです。

これはModuleのソースコードがリソースやBuildConfigの参照先(パッケージ)が変更されたためエラーを出しています。
これを解消します。

いくつかのエラーを出しているプログラムのimportを確認しましょう
このimport文を修正します。
あなたのパッケージ名→あなたのパッケージ名.任意に変更します。
この変更後のパッケージ名はLIBRARY_PACKAGE_NAMEと同じにしてください。

import あなたのパッケージ名.BuildConfig;
import あなたのパッケージ名.R;
↓これを修正します
import あなたのパッケージ名.任意.BuildConfig;
import あなたのパッケージ名.任意.R;

例えば

import com.example.BuildConfig;
import com.example.R;
↓これを修正します
import com.example.opencv.BuildConfig;
import com.example.opencv.R;

これで解決すると思います。

おわりに

今回はModuleをProjectに追加して使ってる人がリリース用ファイルを作成しようとした時に起こる珍しいエラーなので記事を書きました。

他にもJava11をJava17にしたり色々やったのでもしかしたらそこも解決に必要かもしれませんが、おそらくこれで解決できると思います。

皆様がエラーで苦しまないことを祈っています。

参考文献

Multiple dex files define my package /BuildConfig, can't find the cause:

AGP 8.0 build.gradle namespace and aidl buildFeature requirement added

Type BuildConfig is defined multiple times

クラスパス間の競合を修正する

Discussion