あかんわ

覚えたことをブログに書くようにすれば多少はやる気が出るかと思ったんです

IntelliJ IDEAでScalaを使ってAndroid開発

Java IDEIntellij IDEAで、JVM言語のScalaを使ってAndroidエミュレータを動かしてみました。

環境は、IntelliJ IDEA 2016.2とScala 2.11.8で、ビルドツールはsbt 0.13.12を使ってます。
ScalaとsbtはPCにインストールせずに、IntelliJ IDEAのプラグインのみで環境を構築しています。

目次

IntelliJ IDEAでAndroid開発の準備

Mac OS XにIntelliJ IDEAを導入してAndroid開発の環境を整えるを参照下さい

ScalaプラグインとSBTプラグインの確認

Preferences > PluginsでScala*1SBTが有効化*2されている事を確認

sbtのJVM heap Sizeを変更

Preferences > Plugins > Other Settings > SBTのIDE SettingsにあるVM parameters-Xmx2G -XX:MaxPermSize=2Gにする

sbtのビルドエラーでjava.lang.OutOfMemoryErrorが出て処理が止まる事象が発生したため、sbt Reference Manualを参考に、初期設定値の-Xmx512M -XX:MaxPermSize=256Mから増やしました。

Hello Scala

Scala on Androidで提供されているテンプレートIntelliJ IDEAにimportして、Hello ScalaAndroidエミュレータに表示させます。

テンプレートにAndroid SDKを設定して開く

OpenImport ProjectSBT projetとしてテンプレートを開きます*3

f:id:b0npu:20160808030325p:plain

Project SDKAndroid APIを設定*4します

f:id:b0npu:20160808015959p:plain

SBT project infoBuild*5されます

f:id:b0npu:20160808032221p:plain

エディタが起動したら次の設定に進みます

Project StructureでModulesを設定

ビルドツールにsbtを使うScalaのプロジェクトでは、Javaを使う一般的なAndroidプロジェクトとディレクトリの構成が異なりますので、Project StructureModulesAndroidを追加し、 Manifest fileや各種ディレクトリの場所を設定*6します。

f:id:b0npu:20160808032928p:plain

Project StructureでAPK pathを設定

Androidアプリケーションが格納されるapkファイルの出力先も、通常のディレクトリと異なるようですので、ModulesPackaingからAPK path*7を設定*8します。
通常のRun/Debugでパッケージされるapkファイルは、sbt.buildファイルのname :=の項目に設定したアプリ名に-debug.apkを付加した名前になります。

f:id:b0npu:20160808035030p:plain

Run/Debug ConfigurationsでRun SBTの設定

Run/Debug ConfigurationsModuleを設定*9し、Before launchの項目でビルドツールのsbtandroid:packageで設定します。

f:id:b0npu:20160808034205p:plain

android:packageは、SBT Actionのドロップダウンのリストに表示されないので直接入力します。

f:id:b0npu:20160808034341p:plain

RunでAndroidエミュレータを起動

Androidエミュレータの起動とコードのビルドが無事に完了して、apkファイルが生成されて、Androidエミュレータにアプリがインストールされれば、Hello Scalaが表示されます。

f:id:b0npu:20160808034805p:plain

IntelliJ IDEAでScala on Androidの気になる所

Projectの作成からRunまで作業してみて、運用で対処する他の方法が見つからない箇所を記述しておきます。

Run/Debugでインデントが変わる

Scala Style GuideではScalaのインデントはスペース2つであり、IntelliJ IDEAのScalaのファイルのフォーマットもインデントはスペース2つなのですが、Run/Debugをすると、Androidアプリとして認識されるためか、Javaのフォーマットが適応されるようで、インデントが4に変わります。
Cmd + Opt + Lのショートカットを使えばファイルにフォーマットが適応されて修正できるので、ショートカットの利用で対処しています。

class MainActivity extends AppCompatActivity with TypedFindView {

  override def onCreate( savedInstanceState: Bundle ): Unit = {
    super.onCreate( savedInstanceState )
    setContentView( R.layout.activity_main )
  }
}

が、

class MainActivity extends AppCompatActivity with TypedFindView {

    override def onCreate( savedInstanceState: Bundle ): Unit = {
        super.onCreate( savedInstanceState )
        setContentView( R.layout.activity_main )
    }
}

に変わる。

RとかTRがcannot resolve symbolで赤くなる

新しいプロジェクトの作成直後や、ビルドファイルの編集後などに、RとかTRといったAndroidアプリのリソースに関わるクラスが、cannot resolve symbolで赤くなる場合があります。
コードやプロジェクトの設定に間違いがない場合は、大抵は、ビルドしてみると解決されますが、ビルドが通るにもかかわらず赤いままの場合は、File -> invalidate cachesでInvalidate and Restartすると直る場合もあるらしいです。

参考記事

開発環境

関連記事

*1:IntelliJ IDEAのバージョンによってはIDEのインストール時に導入されるようです

*2:有効化されていなければプラグインをインストールします

*3:Checkout from Version Controlでgit cloneも可能です

*4:後からProject StructureのSDKsで設定することもできます

*5:sbtの起動が初めての場合はライブラリのダウンロードで10分前後かかります

*6:この設定を間違えるとno moduleとか言われます

*7:/projectdir/target/android/outputディレクト

*8:この設定を間違えるとThe APK file does not exist on diskとか言われます

*9:Project StructureでModulesを設定するとドロップダウンのリストに追加されます