1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KotlinからJavaクラスを参照するとビルド時にUnresolved refarenceが発生する場合がある

1
Last updated at Posted at 2017-09-14

app/src以下でsymbolic linkは利用しない方が良いというお話

前提:Flavor間のコード参照にSymblic Linkを利用していた

Android Studioでアプリ開発をしていて、本番用とサンドボックス用とでサードパーティーのSDKライブラリを切り分ける必要があった際に、
Flovorを利用してビルドを分けて、sandboxもproductの同じコードを利用するので、コードの参照をシンボリックリンクを利用して行っていた

app/build.gradle
android {

 (省略)

 Flavors {
    product {}
    sandbox {}
  }

 (省略)

}
app/src
% ln -s product sandbox
% ls
  product
  sandbox -> product

こんな感じにすると、AndroidStudio上で正常に動作して、project treeもflavor名でちゃんと表示されます。

しかし、KotlinでSymbolic Link先のJavaクラスを参照するとビルド時にエラーが発生します。

で、少し時間が経過して、
Javaで書いていたプロジェクトでしたが、機能の追加では新規部分をKotlinで記述することになりました

この為KotlinからJavaのクラスを参照する必要もあり、
flavorの指定をsandboxにした場合、Symbolic Link先のJavaクラスを参照することもあるのですが、
Android Studio上では正常に参照され、補完もされたはずなのに・・・

error
Unresolved reference: packagehoge
Unresolved reference: classmoge

ビルド時にこんな感じのエラーが発生します。

Javaのみ、Kotlinのみのコード構成だと、なんの問題もありません。
KotlinからJavaのクラスを参照しようとすると発生するようです。

解決方法: ちゃんとsourceSetsを利用しましょう

横着せずにちゃんと設定しましょう

app/build.gradle
android {

 (省略)

 Flavors {
    product {}
    sandbox {}
  }

 (省略)

  sourceSets {
    sandbox {
      sandbox.manifest.srcFile 'src/product/AndroidManifest.xml'
      sandbox.assets.srcDirs += 'src/product/assets'
      sandbox.java.srcDirs += 'src/product/java'
      sandbox.res.srcDirs += 'src/product/res'
    }
  }

 (省略)

}

上記設定を行うことで、Symbolic Linkを利用した参照が無くなり、無事にビルドが通るようになりました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?