app/src以下でsymbolic linkは利用しない方が良いというお話
前提:Flavor間のコード参照にSymblic Linkを利用していた
Android Studioでアプリ開発をしていて、本番用とサンドボックス用とでサードパーティーのSDKライブラリを切り分ける必要があった際に、
Flovorを利用してビルドを分けて、sandboxもproductの同じコードを利用するので、コードの参照をシンボリックリンクを利用して行っていた
android {
(省略)
Flavors {
product {}
sandbox {}
}
(省略)
}
% 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上では正常に参照され、補完もされたはずなのに・・・
Unresolved reference: packagehoge
Unresolved reference: classmoge
ビルド時にこんな感じのエラーが発生します。
Javaのみ、Kotlinのみのコード構成だと、なんの問題もありません。
KotlinからJavaのクラスを参照しようとすると発生するようです。
解決方法: ちゃんとsourceSetsを利用しましょう
横着せずにちゃんと設定しましょう
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を利用した参照が無くなり、無事にビルドが通るようになりました。